UrWorld, le retour du retour

Le problème exposé dans ce sujet a été résolu.

Moi j'appelle pas ça une archi correct si tu peux même pas changer la manière dont tu gère le FOV, et les collisions sans trop de problèmes.

+3 -0

Bah ça a l'air bien propre et largement suffisant pour faire des vrais collisions ! Voilà comment je ferais en java :

 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
public boolean collidesBox(Rectangle a, Rectangle b) // J'ai trouvé ça sur le net
    {
        if ((a.x+a.width) < b.x) return false; // a is left of b
        if (a.x > (b.x+b.width)) return false; // a is right of b
        if ((a.y+a.height) < b.y) return false; // a is above b
        if (a.y > (b.y+b.height)) return false; // a is below b
        return true; // boxes overlap
    }

    public boolean collide()
    {
        Rectangle persoCollision = ?; // Le rectangle du perso. (la collision box quoi)
        int originx = perso.x; // En blocs ici
        int originy = perso.y; // Ici aussi
        for(int x = -2 ; x < 2 ; x++)
        {
            for(int y = -2 ; y < 2 ; y++) // Dans les deux boucles je regarde les blocs dans un carré de 4x4, histoire d'etre sur de tester tout ceux près du perso
            {
                Case current = cases.get(originx+x, originy+y); // Je récupere une des cases de ton tableau
                if(current.collide()) // En gros, est-ce que c'est censé ne pas pouvoir être traversé
                {
                    if(collidesBox(new Rectangle(current.x, current.y, TILE_WIDTH, TILE_HEIGHT), persoCollision)) // Je vérifie que ça touche, si oui, ça renvoie true
                    {
                        return true;
                    }
                }
            }
        }
        return false; // Si j'ai trouvé aucune case qui interceptais, alors je renvoie false.
    }

Bon alors après, il faut le réécrire avec tes classes et la manière dont tu gères les cases etc.

PS : Je l'ai écrit rapidement hein, c'est pas super propre, c'est juste pour dire que c'est pas galère a implémenter.

+0 -0

Heu… Mais moi je t'ai donné l'algo pour les collisions au pixel près.. Je vais pas tout faire pour toi. En plus je pige rien a ton code vu que je fais pas de python..

+0 -0

Sinon, tu prends on va dire … 10 heures et tu fait un jeu fluide et agréable. Au pire tu fait une copie pou éviter de tout casser sur l'actuelle, et dès que tu en a envie tu en fait un petit peu. C'est long, c'est chiant, mais si tu veux un jeu jouable (ce qui est un peu la définition d'un jeu), il faudra le faire à un moment où un autre.

D'ailleurs, ThuleMalta, ton fork avance ?

mais pour tout passer en pixel, c'est une autre paire de manche :D

Folaefolc

Pourquoi tout passer en pixels ? Si un bloc a une position fixe dans la grille, tu n'as pas besoin de "le passer en pixels". Ce sont les sprites (personnages, puis "créatures" s'il y en a ou s'il y en aura) qui doivent avoir une position en pixels (mais un conseil, utilise des floats et pas des entiers). En plus, le fait d'avoir tes blocs alignés sur ta grille facilitera énormément les calculs de collision (puisque tu dois seulement tester l'état des cases de la grille sur lesquelles le sprite se trouve).

Le seul problème que je vois, ce sont donc les blocs soumis à la gravité s'il y en a, mais personnellement, je créerais un objet FallingBlock, avec une position en pixel, durant la chute, lorsque celle-ci (la chute) est active, puis je le recaserais dans la grille.

+1 -0

Pour le perso, il peut être sur plusieurs cases, il faudra donc que tu détermines la boite englobante du perso, et l'ensemble des cases sur lesquelles il se trouve.

J'ai trouvé un exemple avec un perso sur une grille, sa boite englobante en jaune, et les tiles sur lesquelles il se trouve en vert ou rouge (dans le cas d'une collision avec des blocs non passants).

Exemple

+2 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte