Bonjour,
Pour le projet bac en ISN mon amie et moi avons commencé un Snake sur Processing, seulement nous ne sommes vraiment pas très douées, et nous avons beaucoup de mal à avancer...
Voilà tout d'abord nos variables :
//Définition des variables
Case monSerpent = new Case(300, 300);
void setup() {
size (600, 600);
background(255);
}
void draw () {
background(255);
monSerpent.Dessiner();
}
//Mouvement Clavier
void keyPressed ()
{
if (keyCode == LEFT) monSerpent.deplacement(-20, 0, 4);
if (keyCode == RIGHT) monSerpent.deplacement(20, 0, 2);
if (keyCode == UP) monSerpent.deplacement(0, -20, 1);
if (keyCode == DOWN) monSerpent.deplacement(0, 20, 3);
}
et nous avons fais une classe case (pour les cases qui constituent le corps du serpent ):
class Case
{
//Déclaration des paramètres des cases du serpent
int SposX;
int SposY;
int largeurcase;
int hauteurcase;
int nbrCase=2;
int Direction;
int OldDirection;
Case (int posX, int posY)
{
largeurcase = 20;
hauteurcase = 20;
SposX = posX;
SposY = posY;
nbrCase++;
OldDirection = 0;
}
void Dessiner () {
rect (SposX, SposY, largeurcase, hauteurcase);
fill (150, 220, 60);
}
//Bords
void deplacement(int depX, int depY, int Direction ) {
boolean bAutoriserMouvement = false; // flag opermettant de savoir si le mouvement est possible
println("Direction : " + Direction + '\t' + "OldDirection : " + OldDirection);
if (Direction%2 != OldDirection%2) { //si direction pas sur le meme axe : OK
bAutoriserMouvement = true;
println("autoriser deplacement...");
} else { //Sinon
if (Direction == OldDirection) { //si direction dans le meme sens : OK
bAutoriserMouvement = true;
println("autoriser deplacement...");
} else { //sinon
//on "recule" : inverse de l'ancienne direction : IM-PO-SSIBLEEEEE
bAutoriserMouvement = false;
println("NIET !!!!!...");
}
}
if (bAutoriserMouvement == true) { //je suis autorisé à me déplacer
println("Modification deplacement...");
if (Direction == 4) SposX = SposX+depX; //dep vers gauche
if (Direction == 2) SposX= SposX+depX; //dep vers droite
if (Direction == 1) SposY=SposY+depY; //dep vers le haut
if (Direction == 3) SposY=SposY+depY; //dep vers le bas
//Limites Bords
if (SposX<0) SposX=0; //Bord gauche
if (SposY>600-20) SposY=600-20; //Bord Bas
if (SposX>600-20) SposX=600-20; //Bord droite
if (SposY<0) SposY=0; //Bord Haut
OldDirection = Direction; //sauvegarde ma nouvelle direction
}
}
}
Pour augmenter la taille du serpent, notre prof nous a dit de faire un tableau, seulement on ne comprend pas vraiment comment faire avec ça...
S'il-vous plaît, quelqu'un pourrait nous aider ce serai très gentil...
Hors ligne
Bonsoir,
Beau projet. C'est bien de vouloir utiliser les classes, mais il me semble que ce n'est pas à bon escient. Un serpent est une suite de carré, caractérisés par leur position. Comme la taille du serpent est amenée à s'agrandir, il est préférable d'utiliser les ArrayList pour stocker l'information.
Un outil très puissant pour les positions est la classe PVector. Nous pouvons soustraire des vecteurs pour trouver des directions.
J'ai simulé l'ajout d'anneau du serpent avec la barre espace. Je suis certain que des questions se présenteront. N'hésitez à me les poser.
ArrayList<PVector> serpent; int tailleCase = 20; PVector direction; int vitesse = 1; void setup() { size(800, 800); frameRate(10); serpent = new ArrayList<PVector>(); serpent.add(new PVector(10, 10)); direction = new PVector(1, 0); } void draw() { background(255); for (PVector p : serpent) { fill(255, 0, 0); rect(p.x * tailleCase, p.y * tailleCase, tailleCase, tailleCase); } for (int i = serpent.size() - 1; i > 0; i--) { serpent.get(i).set(serpent.get(i - 1)); } serpent.get(0).add(direction); } void keyPressed () { if (keyCode == LEFT) direction.set(-1, 0); if (keyCode == RIGHT) direction.set(1, 0); if (keyCode == UP) direction.set(0, -1); if (keyCode == DOWN) direction.set(0, 1); if (key == ' ') { grandirSerpent(); } } void grandirSerpent() { PVector dir; if (serpent.size() > 2) { dir = PVector.sub(serpent.get(serpent.size() - 1), serpent.get(serpent.size() - 2)); } else { dir = direction; } PVector p = serpent.get(serpent.size() - 1); serpent.add(PVector.sub(p, dir)); }
Hors ligne
Bonjour,
Merci beaucoup, mais j'ai une question je ne comprends pas très bien le fonctionnement d'ArrayList... Pouvez-vous m'expliquez s'il-vous-plaît ?
Hors ligne
L'ArrayList est un tableau dynamique, c'est-à-dire que l'on peut facilement lui ajouter des éléments et les manipuler.
ArrayList<PVector> serpent = new ArrayList<PVector>();
Créer une liste vide d'objet PVector.
Ensuite dans le programme, j'utilise la méthode add() qui permet d'ajouter un élément à cette liste.
J'utilise aussi la méthode get() qui permet d'aller chercher un élément de la liste en fonction de son indice et enfin la méthode size() qui permet de connaître le nombre d'élément contenus dans cette liste.
Vous avez sans doute appris la boucle for. Nous pouvons utiliser d'une autre manière :
for (PVector p : serpent)
C'est une boucle sans indice, cette boucle va parcourir tout les éléments de la liste. La variable p ainsi figurera chacun des éléments de la liste.
for (int i = serpent.size() - 1; i > 0; i--) { serpent.get(i).set(serpent.get(i - 1)); }
C'est une boucle qui part du dernier élément de la liste pour aller jusqu'au deuxième, ainsi chaque élément prend les coordonnées de son prédécesseur dans la liste.
Hors ligne
Merci beaucoup cela m'aide bien, c'est très gentil.
Hors ligne
C'est pas en Processing mais cela donne des idées!
Dernière modification par Pilou (2017-05-04 23:54:24)
Hors ligne
Pages: 1