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

avec Java Discussion :

Replacement après collision


Sujet :

avec Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2012
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Replacement après collision
    Bonjour,

    Je suis sur un problème que je n'arrive pas à résoudre. J'ai essayer toutes les techniques que j'avais trouvé, mais sans avoir le résultat voulu.

    Je vous explique.

    Dans la boucle principale, j'update mon Player, puis je teste les collisions, et si il y en a, je replace bien le Player pour ne pas qu'il soit dans le mur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // J'update mon Player
    player.Update(container, delta);
    // Je teste les collisions et je replace mon Player    
    for (int i = 0; i < level.getTiles().size(); i++) {
        if (level.getTiles().get(i).isBlockable()) {
            if (player.getBounds().intersects(level.getTiles().get(i).getBounds())) {
                player.Replace(level.getTiles().get(i).getBounds(), delta);
            }
        }
    }
    Ma fonction Update déplace le joueur en haut si le boolean up = true, en bas si le boolean down = true, etc. A l'appuis sur la touche Z, le boolean up se met à true, et dès que le joueur relache la touche, le boolean se met à false.

    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
    // Ici, la variable v = 0.3f (la vitesse du Player)
    public void Update(GameContainer container, int delta) {
        // Déplacement
        if (up) {
                y -= v * delta;
        }
        else if (down) {
            y += v * delta;
        }
        if (left) {
            x -= v * delta;
        }
        else if (right) {
            x += v * delta;
        }
     
        // Bounds
        Box.setLocation(x, y);
    }
    Maintenant que mon Player à été mis à jour, je teste les collisions (cf. code 1 ligne 5) avec les tiles qui sont "blockable". Si il y à collision, j'appel la fonction Replace qui replace le joueur.

    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
    26
    public void Replace(Rectangle Box2, int delta) {
        Box.setLocation(x, y);
     
            Ici, c'est assez simple à comprendre.
            Tant qu'il y à collision, je regarde dans         
            quelle(s) direction(s) va le joueur.
            Selon la direction (ou les directions puisque
            up et left peuvent être à true tout les deux)
            je déplace le joueur.
     
        while (Box.intersects(Box2)) {
            if (up) {
                y += v;
            }
            else if (down) {
                y -= v;
            }
            if (left) {
                x += v;
            }
            else if (right) {
                x -= v;
            }
            Box.setLocation(x, y);
        }
    }
    Tout fonctionne très bien. Enfin pas exactement... quand je vais en haut, c'est bon. Quand je vais en bas, à gauche ou à droite c'est bon aussi.

    Mais quand je vais à la fois en haut et à droite, mon Player ne monte pas.

    J'ai trouvé pourquoi cela fait ça, mais je n'arrive pas à le régler.

    Si je me déplace à la fois en haut et à droite, mon perso sera comme ceci :



    Du coup, en rentre dans la fonction Replace puisqu'il y à collision. Donc là, on à cette boucle : Tant qu'il y à collision (c'est le cas), et que up = true (c'est le cas) alors on re-déplace le Player vers le bas. Ce qui fait ceci :



    A ce stade, il y à toujours collision. Maintenant, on passe à la condition : if (down) {}. Ce n'est pas notre cas, on passe. Idem pour if (left) {}. Par contre, pour if (right) {}, c'est notre cas ! Donc on re-déplace le Player vers la gauche. Donc là, le Player ne se trouve plus dans le mur. Il n'y à plus collision, on sort de la fonction Replace.

    Cependant, notre Player n'à pas été en haut ! Hé oui, étant donné que à la condition if (up) {} on à re-déplace le joueur vers le bas car il y avais collision ! Donc notre personnage n'a pas bougé !

    Il faudrait donc que les conditions if (left) et if (right) soit avant if (up) et if (down). Cependant, si je fait ça, le problème persiste, mais pour la gauche et la droite...

    Comment faire ?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Il faut regarder sur quel axe il y a collision ou pas, bien sûr -_-°.

    Du coup, pas de Box.intersects(Box2) qui, je pense, est plutôt utile pour des calculs de hitbox.

    (après je ne reconnais pas quelle bibliothèque tu utilises. Elle a sûrement des systèmes adaptés pour éviter d'avoir à faire ça, mais lesquels...)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2012
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Je pense que l'on peux y arriver avec mon système.

    D'ailleurs, j'ai fait ceci :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    public void Replace(Rectangle Box2, int delta) {
    	if (left) {
    		x += previousSpeed;
    	}
    	if (right) {
    		x -= previousSpeed;
    	}
     
    	Box.setLocation(x, y);
    	if (up) {
    		while(Box.intersects(Box2)) {
    			y += 0.01f;
    			Box.setLocation(x, y);
    		}
    	}
     
    	Box.setLocation(x, y);
    	if (down) {
    		while(Box.intersects(Box2)) {
    			y -= 0.01f;
    			Box.setLocation(x, y);
    		}
    	}
     
    	if (left) {
    		x -= previousSpeed;
    	}
    	if (right) {
    		x += previousSpeed;
    	}
     
    	Box.setLocation(x, y);
    	if (left) {
    		while (Box.intersects(Box2)) {
    			x += 0.01f;
    			Box.setLocation(x, y);
    		}
    	}
     
    	Box.setLocation(x, y);
    	if (right) {
    		while (Box.intersects(Box2)) {
    			x -= 0.01f;
    			Box.setLocation(x, y);
    		}
    	}
    }
    C'est un peu barbar mais ça fonctionne un peu plus.

    Là, c'est quand je vais en haut et à gauche ou en bas et à gauche que le personnage ne bouge pas. Par contre, en haut et à droite ou en bas et à droite fonctionne parfaitement.

    EDIT : previousSpeed c'est de combien s'est déplacé mon Player.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    ma foi, ça marche aussi. Calcul a priori ou a posteriori, c'est un peu pareil. Je trouvais juste que ça avait l'air redondant écrit comme ça.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [XL-2007] Boite de dialogue après fonction replace
    Par cchasse98 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/12/2012, 20h16
  2. [Débutant] replace après un certains nombre de caractères
    Par momo187 dans le forum C#
    Réponses: 11
    Dernier message: 09/08/2012, 07h40
  3. Transfert d’énergie après une collision
    Par Darkantho dans le forum Physique
    Réponses: 6
    Dernier message: 19/05/2011, 16h05
  4. Réponses: 5
    Dernier message: 17/09/2007, 17h01
  5. [C#] Se replacer au bon endroit d'un form après PostBack
    Par gael.mases dans le forum ASP.NET
    Réponses: 3
    Dernier message: 16/11/2005, 11h54

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