Pages: 1
Bonjour !
Je suis actuellement en train de faire un petit jeu tout con : des carrés (supposés représenter des monstres) tombent du haut de l'écran, et le joueur (que j'ai appelé SpaceShip) doit les éviter.
Afin de déterminer si il y a collision entre le joueur et les monstres, j'ai quelque chose comme : "Si la position des monstres vient empiéter sur celle du joueur, alors la variable "score" est diminuée de 1".
Seulement, ma variable score perd 1 en continu tant que le monstre est sur le joueur, ce qui est logique, vu que la condition reste vérifiée.
J'avais donc pensé contrer ce problème en créant une autre structure conditionnelle, qui dirait cette fois : "Si le bas du monstre est au même niveau que le joueur, enlever un point".
Cette solution fonctionnait, seulement, j'ai quatre carrés qui tombent du haut de la fenêtre, allant chacun à des vitesses différentes. Pour faire varier les vitesses, je les incrémente chacun d'une valeur différente sur l'axe Y. Seulement, vu qu'ils n'ont pas la même "vitesse", la condition n°2 n'est parfois jamais vérifiée, du coup, pas de perte de vie
Je me doute bien que tout cela n'est pas très clair, voici donc le code :
D'avance merci, j'espère ne pas avoir été trop brouillon, si vous avez des questions, n'hésitez pas !
PS : Il s'agit de mon premier essai en orienté objet, du coup je suis certainement passé à côté de certains aspects !
Dernière modification par Kirk Van Houten (2012-05-02 14:33:51)
Hors ligne
Salut,
Alors je suis aussi débutant donc mes conseils seront peut être pas terrible.
A ta place j'oublierais la seconde condition
//Perte de point for (int i=0; i<monster.length; i++) { if (monster[i].yMstr+38==spaceShip.ySps && monster[i].xMstr+38>spaceShip.xSps && monster[i].xMstr<spaceShip.xSps+30) { life--; } }
Puisqu'en effet cette condition ne fonctionne que pour le carré ayant une vitesse de 1. Et si tu augmente la zone de contact, la vitesse de 1 fais perdre plus d'un point.
L'idée serait de créer un compteur. Dès qu'un point est perdu, un compteur se lance (valeur boolean fausse) empêchant de refaire perdre un point au compteur. Par contre même si tu rentres en collisions avec trois rochers tu perdrais qu'un point.
Hors ligne
Pour la variable booléenne, suffit de la placer dans le monster.
Pour la détection de contact place la dans la class monstre dans un objet contact, et au lieu de faire plus +30 tu lui ajoute une variable size, donc tu peux faire position + size. tu auras juste a placer en argument une variable du type de l'objet de ton vaisseau , soit : void contact(Spaceship spaceShip){ton code} Pour connaitre la position, tu auras juste a écrire spaceship.xsps
ensuite dans ton draw, tu y fais appel comme move et display, sauf que tu écriras : monster[i].contact(spaceship);
Le truc quand on veut détecter une collision, il faut détecter celle de la frame suivante donc faire position, plus size, plus speedy , ainsi tu sais si tu l'as touché la frame précédente le contact.( très pratique pour les rebonds sur les cotés, ça réduit les bug de clipping
Ensuite pour tes monstres, je te recommande de changer la méthode d'affichage des rectangles. Au lieu de les dessiner depuis le coin, dessines les depuis le centre : rectMode(CENTER), mais tu devrais ajouter un size/2 plutôt que un size a ta position, lors de la collision
Enfin remplaces tes array par des arraylists, ce sont des tableau dynamique, qui permettent d'ajouter , supprimer des éléments, en début, milieu et fin de ta liste.
Pour te simplifier la vie, tu as juste a caster ta liste lors de sa création : Arraylists<Monster> listeMonstres = new ArrayLists<Monster> ();
en espérant t'avoir été utile
Dernière modification par cgiles (2012-05-09 08:10:07)
Hors ligne
Et bien, merci beaucoup pour ces conseils !
J'avais réussi à bricoler une solution alternative en réduisant la taille de mon SpaceShip et ça fonctionnait à peu près correctement, mais je vais essayer de retravailler tout ça avec vos conseils !
Merci beaucoup !
Hors ligne
Pages: 1