IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Fonction d'un jeu 2D (listes)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 35
    Par défaut Fonction d'un jeu 2D (listes)
    Bien le bonjour/bonsoir,

    Je reviens vers vous car je deviens un peu fou. Après avoir passé des heures à y réfléchir, je ne parviens pas à résoudre mon problème.

    J'ai un jeu, représenté dans une fenêtre comme ci-dessous :

    Nom : jeu.png
Affichages : 325
Taille : 769,8 Ko

    Les "bonhommes" que vous voyez dans la fenêtre apparaissent en haut, et sont censés aller dans une direction (droite ou gauche), et s'ils arrivent au bout d'une plate-forme, tomber. Donc il y a en quelque sorte une notion de gravité.

    Et là est le problème. J'ai ajouté une variable "gravity" à la structure de mes bonhommes, celle-ci vaut 1 lorsque qu'ils sont dans le vide, et 0 lorsqu'ils sont sur une plate-forme. Donc je dis que gravity vaut toujours 1, jusqu'au moment où la position du bonhomme est la même que celle d'une plate-forme, et là gravity passe à 0, donc non incrémentation de la position sur l'axe des Y du bonhomme.

    J'utilise les listes pour les plate-formes et les bonhommes.

    J'avais une fonction bien compliquée mais qui me semblait logique, mais qui ne marchait pas, alors je me suis ramené à une fonction beaucoup plus basique, mais qui ne marche toujours pas!
    La voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void collide_between_monsters_platforms(object_list * pPlatform_list, object_list * pMonster_list)
    {
      object_list * tmp;
      while (pMonster_list != NULL)
        {
          tmp = pPlatform_list;
          while (tmp != NULL)
    	{
    	  if (pMonster_list->obj->position.y == tmp->obj->position.y)
    	    pMonster_list->obj->gravity = 0;
     
    	  tmp = tmp->pNext;
    	}
          pMonster_list = pMonster_list->pNext;
        }
    }
    Et ensuite j'ai une fonction qui parcourt la liste de bonhommes et qui, si la partie "gravity" de ce bonhomme vaut 1, incrémente sur l'axe des Y.

    Et... Gravity ne passe jamais à 0 quelque soit le bonhomme...

    Le cas est peut-être compliqué à comprendre, et j'en suis désolé!

    Merci d'avance de vos réponses!

    Cordialement.

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 776
    Par défaut
    Très très difficile à répondre , mais une explication logique est pMonster_list->obj->position.y != tmp->obj->position.y.

    En plus c'est super simple à vérifier: afficher les y de tes objets.


    Et si à première vue ce test semble bon, il ne faut pas faire cela: Où se situe ton y sur tes objets? Coin supérieur gauche?

    il faut passer par des boites englobantes (bounding box).

    Et le test devient soit
    • bord bas de la boite monstre == bord haut de la boite plateforme (avec +/ - un delta près)
    • boite monstre et boite plateforme se chevauchent (en remettant le monstre sur la plateforme)

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 35
    Par défaut
    Citation Envoyé par foetus Voir le message

    Et le test devient soit
    • bord bas de la boite monstre == bord haut de la boite plateforme (avec +/ - un delta près)
    • boite monstre et boite plateforme se chevauchent (en remettant le monstre sur la plateforme)
    Le fait que les plate-formes ne soient pas toutes les mêmes ne pose pas problème? Je parle en largeur, certaines valent 200 pixels, une autre 500, et le sol 1024

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 776
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    L'idée fonctionne. Cependant je trouve dangereux de "transformer" un état naturel (dans la nature, la gravité ne change jamais). Et ça t'a obligé à rajouter une caractéristique à chaque perso.

    Perso j'aurais programmé de la façon suivante: les persos ont toujours tendance à aller vers le bas (y+1) sauf quand la position sous leur pied est remplie par qqchose
    Je pense qu'il faut quand même un booléen "is_falling" ou autre

    Parce que le test "Est-ce que le bonhomme est sur une plateforme?" et le déplacement du bonhomme doivent être séparés dans le code.
    D'autant plus que, lorsque le bonhomme arrive au bout de la plateforme, il retombe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (is_falling) { --y; } else { x += incr; }

    Citation Envoyé par Lanslow Voir le message
    Le fait que les plate-formes ne soient pas toutes les mêmes ne pose pas problème? Je parle en largeur, certaines valent 200 pixels, une autre 500, et le sol 1024
    La boite englobante gère cela puisque, comme son nom l'indique, elle englobe la plateforme

    Et pour l'histoire des trous sur une plateforme, la boite englobante gère aussi cela. Il faut juste ne pas faire une boite de forme rectangulaire/ ou pavé

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 35
    Par défaut
    J'ai crée une fonction, qui me paraissait logique. Mais elle ne marche pas. Il n'y aurait pas moyen de la modifier pour qu'elle soit juste?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void collide_between_monsters_platforms(object_list * pPlatform_list, object_list * pMonster_list)
    {
      unsigned int G = 1;
      object_list * tmp;
      while (pMonster_list != NULL)
        {
          G = 1;
          tmp = pPlatform_list;
          while (tmp != NULL)
    	{
    	  if ((pMonster_list->obj->position.y == tmp->obj->position.y) && (pMonster_list->obj->position.x + 25 >= tmp->obj->position.x) && (pMonster_list->obj->position.x + 50 <= tmp->obj->position.x + tmp->obj->max_size))
    	    G = 0;
     
    	  if (G == 1)
    	    pMonster_list->obj->position.y += 1;
     
    	  tmp = tmp->pNext;
    	}
          pMonster_list = pMonster_list->pNext;
        }
    }
    La condition dans le if est très longue, mais en clair ça test si l'objet est au même y, et entre le x de la plate-forme et le x du bout de la plate-forme.

    Et si c'est vraiment pas comme ça qu'il faut faire, je réfléchirai à ta solution foetus !

    Merci d'avance.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 35
    Par défaut
    Je suis bête, forcément qu'elle ne marche pas, si la plate-forme de départ des monstres n'est pas celle en premier dans la liste tmp, alors les monstres vont forcément tomber...

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 851
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Lanslow Voir le message
    Et là est le problème. J'ai ajouté une variable "gravity" à la structure de mes bonhommes, celle-ci vaut 1 lorsque qu'ils sont dans le vide, et 0 lorsqu'ils sont sur une plate-forme. Donc je dis que gravity vaut toujours 1, jusqu'au moment où la position du bonhomme est la même que celle d'une plate-forme, et là gravity passe à 0, donc non incrémentation de la position sur l'axe des Y du bonhomme.
    Bonjour

    L'idée fonctionne. Cependant je trouve dangereux de "transformer" un état naturel (dans la nature, la gravité ne change jamais). Et ça t'a obligé à rajouter une caractéristique à chaque perso.

    Perso j'aurais programmé de la façon suivante: les persos ont toujours tendance à aller vers le bas (y+1) sauf quand la position sous leur pied est remplie par qqchose.

    Ca te permettra en plus ensuite de faire évoluer. Par exemple rajouter des "leurres" (trous) dans les plateformes ou inversement des plateformes invisibles. Exactement comme dans mario lorsqu'il arrive dans le monde invisible...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 35
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    sauf quand la position sous leur pied est remplie par qqchose.
    Je ne vois pas comment programmer ça, désolé... C'est le "remplie par quelque chose" qui me déstabilise.

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 851
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Lanslow Voir le message
    Je ne vois pas comment programmer ça, désolé... C'est le "remplie par quelque chose" qui me déstabilise.
    Tu modèles ton monde. Chaque position de pixel l'écran et ce qui s'y trouve sont alors connues par ton programme. Et comme tu sais où se trouvent tes persos, tu sais alors si la position "Y+1" de chaque perso est occupée ou pas...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 11
    Dernier message: 29/05/2007, 08h05
  2. Réponses: 3
    Dernier message: 10/05/2007, 13h21
  3. Fonction tir() pour jeu
    Par ironzorg dans le forum SDL
    Réponses: 7
    Dernier message: 18/11/2006, 13h16
  4. Fonction qui cache en fonction d'une selection de liste
    Par AlphonseBrown dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 20/03/2006, 19h53
  5. Fonction standard pour dédoublonner une liste ?
    Par ecocentric dans le forum Général Python
    Réponses: 3
    Dernier message: 22/08/2005, 10h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo