Bonjour à tous et toutes,
je suis en train de créer un jeu sur le thème de goldorak. Je m'appuie sur les tutos de JP que j'ai acheté sur le site tuto.com. Ce tuto explique la création d'un shoot'm up.
J'ai un problème avec les collisions. J'ai réussi à régler à "tâtons" à peu près quelques problèmes mais je n'ai pas réussi à trouver toutes les solutions.
En fait, mon goldorak fait 5 cases de 8 pixels par 3 cases de 8 pixels
spr(sp,x,y,5,3)
Mon goldorak fait donc 32 pixels et mes ennemis en font 8, lorsque j'utilise la formule de MBOFFIN (lorsque 2 boîtes ne se chevauche pas alors il n'y a pas de collision) cela fonctionne mais le problème c'est que, soit les sprites tirs considèrent que l'ennemi fait 32 pixels alors qu'il en fait 8, soit ils considèrent que goldorak en fait 8 alors qu'il en fait 32.
Voici mes problèmes :
- collision entre le joueur et les ennemis,
- collision entre le joueur et les tirs ennemis,
- collisions entre le joueur et le boss,
- collision entre le joueur et les tirs du boss,
- collision pour gagner une vie,
- collision pour obtenir un bouclier.
J'ai également un problème avec la diminution de la vie du boss. Lorsque le compteur de la vie du boss arrive à zéro, il explose 10 fois puis il disparaît, mais le compteur continue dans le négatif jusqu'à sa disparition et je n'arrive pas à l'arrêter.
J'ai créé plusieurs fonction collision pour tenter de pallier le problème mais je me perds dans les pixels.
Est ce que vous pourriez m'aider à régler mes problèmes svp.
Je joins mon projet en version basique.
Merci par avance à la communauté.
function collision(a,b) assert(a.x and a.y and a.dimx and a.dimy and b.x and b.y and b.dimx and b.dimy) if a.x > b.x+b.dimx-1 or a.y > b.y+b.dimy-1 or a.x+a.dimx-1 < b.x or a.y+a.dimy-1 < b.y then return false else return true end end |
Voilà une fonction unique de collision entre deux rectangles.
En plus des x et y, chaque rectangle que tu crée doit avoir des dimensions dimx et dimy
le assert s'assure que tes paramètres sont bien conformes, sinon ça plante direct, ce qui est pratique pour comprendre d'ou vient le rectangle qui n'en a pas et compléter to code pour les rajouter à la création.
Merci pour ta réponse :
Dois-je mettre des valeurs à dimx et à dimy tout en haut de la page ? ou bien remplacer le dimx et le dimy par des valeurs directement ?
Pourquoi le -1 à chaque dim ?
j'ai essayé avec et sans valeur en remplaçant ta fonction avec la mienne.
A chaque fois : ASSERTION FAILED
J'ai bien compris que si ça me met FAILED c'est que ce n'est pas conforme, et donc, comment je fais pour voir le rectangle qui n'est pas conforme.
pour le -1
imagine un carré de 8 pixels de coté dans le coin supérieur gauche :
carre1={x=0,y=0,xdim=8,ydim=8}
et un autre juste sur sa droite
carré2={x=8,y=0,xdim=8,ydim=8}
les deux carrés ne sont pas en collision, les pixels se touchent mais ne sont pas l'un sur l'autre.
a.x+a.dimx-1<b.x ?
0+. 8-1<8 ?
7<8 VRAI
pas de collision.
Les coodonnés max en X de a sont 7, les min de b sont 8, pas de collision.
La nouvelle fonction teste les collision entre deux rectangles qui doivent obligatoirement avoir des dimesions dimx et dimy.
quand tu crée ton joueur, rajoute lui un dimx à 40 et un dimy à 24.
Pour un boss un dimx à 32 et un dimy à 32.
Pour le reste un dimx à 8 et un dimy à 8.
Remarque : ça rends les choses super simples pour avoir des tirs et des ennemis de tailles différentes. Tu peux avoir des golgots qui tirent des petits vaisseux qui tirent eux même des projectiles encore plus petits par exemple.
Exemple de assert planté :
1er image :
ca me dit que la collision avait des mauvais paramètres.
La ligne qui a lancé l'appel, c'était _update_player , ligne 219 du tab 1.
On va aller voir (2eme écran).
on voit qu'on cherche des collisions entre le joueur p et des bul (bullets j'imagine) qui viennent de bossb.
On va donc chercher ou on crées les bul de boss b (3eme écran)
Dans le 3eme écran, j'ai trouvé la fonction boss_shoot qui crée des balles et remplis bossb, j'ai rajouté les dimension 8x8 manquantes des balles tirées.
A travers l'exemple, j'ai enfin compris. Mes collisions entre le player les ennemis, les tirs ennemis, le boss avec le player et les tirs de bossent fonctionnent à merveille.
C'est vraiment chouette. T'es un super prof.
Je peux abuser et te demander d'autres choses ?
Je te pose la question tu répondras quand tu pourras.
Lorsque je tir sur l'ennemi et que son compteur est à zéro, il se met à exploser 10 fois puis disparaît (normal). Mais si je continue à tirer le compteur va dans le négatif. J'ai mis des conditions pour le stopper et qu'il reste à zéro, mais ça bloque à -10 et les scores continuent à augmenter.
j'ai mis après la ligne 213 TAB1 ceci :
elseif boss.life<=0 then boss.life=0
Le numéro de ligne ne m'est pas très utile sans la dernière version.
La première chose à savoir est qu'est-ce que tu veux exactement quand le boss tombe a 0HP ou moins.
Il y a plein de possibilités, par exemple :
-
le joueur perd le contrôle du vaisseau et devient invincible, suivi d'une animation automatique.
-
le jeu continue, le joueur peut toujours mourrir par un tir ou en se crashant dans le boss vaincu, et la séquence de victoire ne s'active que lorsque tous les dangers potentiels on disparu.
-
Le boss vaincu devient intangible, pendant qu'il explose, les tirs passent par dessus sans collision
- Le boss vaincu reste solide et arrête les tirs, mais sans prendre de dégat supplémentaire ou donner de points.
-autre chose, à toi de me dire.
ton code empèche boss.life d'aller dans les négatifs, mais fait une recherche, il y a potentiellement plusieurs endroits ou tu diminue la vie du boss. Pour bloquer le score, rajoute un test au moment d'augmenter le score suite à une collision avec le boss. Si le boss est déja mort, pas de points supplémentaires.
effectivement je n'avais pas imaginer tous ces scénarios.
ce scénario correspond à ce que je souhaite :
"Le boss vaincu devient intangible, pendant qu'il explose, les tirs passent par dessus sans collision"
les tirs passent par dessus, le score s'arrête d'augmenter, et le boss n'a plus d'énergie, donc boss.life ne va pas dans le négatif
Simple, ne fait les tests de collision avec le boss que si sa vie est >0.
Autre point important : pour que les tirs passent par dessus le boss vaincu, ils doivent être affichés après le boss.
Effectivement très simple. En fait je n'ai pas encore cette logique, je me complique la vie.
ça fonctionne nickel.
Merci
[Please log in to post a comment]