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

Développement 2D, 3D et Jeux Discussion :

Problème mouvements d'un personnage ! Petage de plomb...


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut Problème mouvements d'un personnage ! Petage de plomb...
    Bonjour,

    je suis en cours de création d'un ptit jeu en 2D (un BubbleBobble like) pour un ptit challenge d'un site. Je traval en ce moment sur les mouvements de mon personnage avec gestion de collisions et tout le binz mais j'ai un problème de detection de fin de plateformes ... explications ...

    Mes plateformes sont constituées de blocs d'une taille prédéfinie dans le fichier du level courant., Un flag est attribué au blocs, 0 un bloc normal constituant les plateformes, 1 représentant un bloc pour l'extrémité gauche d'une plateforme et 2 représentant l'extrémité droite.

    Mon personnage lui possède un flag qui me permet de déterminer le sens de la marche (0 = gauche, 1 = droite).

    Pour que le personnage tombe d'une plateforme, il me faut en meme temps déterminer qu'il se trouve bien sur un bloc représentant une extrémité d'une plateforme, tests effectué d'apres le sens de la marche pour savoir s'il se trouve sur un bloc avec la bonne configuration mais aussi je doit determiner le moment où il tombe ... facile, mais je ne peut pas tester les deuxx conditions en meme temps, c'est ... contradictoire en quelques sorte .... voici mon code, j'arrete de parler parce que sinon j'arrete plus

    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
    22
    23
    24
    25
     
                else
                {                                                                       /* ICI COMMENCE LE PROBLEME   */
                   /*
                    * Le personnage se trouve sur un des bord d'une plateforme,
                    * on le fait tomber.
                    */
                   if (bloc.x <= hero.x)
                   {
                      if (p_hero_st->direction == 0 &&
                          hero.x + hero.w <= bloc.x &&
                          bloc_end == 1)
                      {
                         /* LE PERSONNAGE TOMBE !! */
                         p_hero_st->hero_pos.y = GAME_ZONE_BOTTOM - HERO_SIZE;
                      }                                                                 /* FIN DU PROBLEME   */
                      else if (p_hero_st->direction == 1  &&
                               hero.x >= bloc.x + bloc.w  &&
                               bloc_end == 2)
                      {
                         /* LE PERSONNAGE TOMBE !! */
                         p_hero_st->hero_pos.y = GAME_ZONE_BOTTOM - HERO_SIZE;
                      }
                   }
                }
    Quand le personnage avance vers la droite cela fonctionne mais les problèmes commencent a venir quand il marche vers la gauche, il ne tombe pas de la plateforme parce que la 1° condition n'est plus remplie alors je ne sais plus quoi faire et comment le faire, j'avoue que c'est la 1° fois que je code un truc de ce genre


    Toute aide sera la bienvenue
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  2. #2
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Il me semble que
    if (bloc.x <= hero.x)
    est de trop. Ca ne marche qu'en allant vers la droite. Pour fonctionner vers la gauche il faudrait ajouter la condition opposée... ce qui donnerait une tautologie.

    Il devrait pouvoir être supprimé car il est redondant avec
    hero.x >= bloc.x + bloc.w
    Et vive BubbleBobble !

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Nan mais ca je savais deja qu'une condition a un moment donné entre en contradiction avec un autre ... je l'ai meme précisé sur le post si je ma gourre pas mais il faut que je determine si le personnage se trouve sur le bon bloc sinon c un autre le plus proche possible ayant le meme flag qui peut rendre vraie les 2 conditions qui sera pris donc ce qui a pour effet de faire tomber le personnage certes mais en plein milieu de la plateforme, ce qui n'est très certainement pas le but recherché !

    S'il y'a d'autres propositions de faisabilité je suis preneur, mais dans la seule conditions que ce soit en partant du principe du tableau de bloc comme c'est le cas actuellement, revoir cette facon de faire incomberais de recoder la moitié du programme actuel, au gros max et etant donné que c'est deja une version refaite, relooké, optimisée, j'ai franchement pas envie de refaire encore une fois, c'est ca ou le projet est définitivement stoppé
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    JEG
    JEG est déconnecté
    Membre éclairé
    Avatar de JEG
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 211
    Points : 727
    Points
    727
    Par défaut
    et un truc comme ca, ca ne marcherait pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (bloc.x <= hero.x && hero.x <= bloc.x +10 && p_hero_st->direction == 0 ||
    bloc.x + bloc.w -10 <= hero.x && hero.x <= bloc.x + bloc.w && p_hero_st->direction == 1)
    {
      p_hero_st->hero_pos.y = GAME_ZONE_BOTTOM - HERO_SIZE;
    }
    le bloc_end me semble redondant, puisqu'on sait déjà avec blox.x et bloc.w si l'on est plus vers le bord gauche ou plus vers le bord droit.

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par JEG
    le bloc_end me semble redondant, puisqu'on sait déjà avec blox.x et bloc.w si l'on est plus vers le bord gauche ou plus vers le bord droit.
    Au contraire, je ne pense pas qu'il soit redondant pour la simple raison qu'il permet de délimiter clairement les bord des plateformes alors que bloc.x et bloc.w peut etre appliqué sur n'importe quel bloc or je ne veut tester que ceux des bords donc il me faut un marqueur ...

    Je vais tester aujourd'hui une autre approche tout en restant dans la meme optique des blocs, en fait je vais simplement leur donner un index ce qui me permettra de créer des groupes de blocs en fait, comme ca, à chaque nouveau mouvement je determine l'index du bloc sur lequel le perso se trouve et je ne vais tester que ce groupe, je pense que ca va résoudre pas mal de problèmes !

    Je vous tiens au courant
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    JEG
    JEG est déconnecté
    Membre éclairé
    Avatar de JEG
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 211
    Points : 727
    Points
    727
    Par défaut
    ok, effectivement je crois qu'il te faut définir des groupes de bloc (en fait des tableaux de blocs), le bloc à l'index 0 étant le bloc le plus à gauche, et le bloc à l'index tab.count-1, étant le bloc le plus à droite. Ca semble la meilleure approche.

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Non je passe par un seul tableau en fait, sinon ca va me faire trop de modifs, je devrais pouvoir m'en sortir de cette façon
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Ok donc en mettant un index de groupe à chaque bloc pour créer des groupe de blocs, tout en restant dans un seul et unique tableau fonctionne parfaitement ... je peut enfin continuer apres jours de galère.
    Merci aussi à ceux qui m'ont répondus !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de déplacement du personnage sur Pygame
    Par Youpat97 dans le forum Général Python
    Réponses: 15
    Dernier message: 24/04/2013, 00h42
  2. Problème Mouvement DirectX
    Par Rusty47 dans le forum DirectX
    Réponses: 6
    Dernier message: 20/03/2012, 22h25
  3. problème mouvement souris
    Par bbmery dans le forum Périphériques
    Réponses: 1
    Dernier message: 29/04/2009, 22h47
  4. Scripts VBS PETAGE DE PLOMB
    Par Hacksign dans le forum VBScript
    Réponses: 3
    Dernier message: 21/12/2007, 17h42
  5. Mouvement d'un personnage (squelette)
    Par Decleir dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 25/07/2007, 21h19

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