我只需要在Processing sketch中确认类函数的作用。我的节目是Snake(游戏Snake)。 我认为它用于连接蛇的所有点,以便它们可以相互跟随。 或者也许是别的东西。希望你能帮助我解决这个问题。 类函数出现在程序的末尾。
ArrayList snake; // l'ArrayList qui va contenir les elements du serpent
int snakeTaille = 3; // la taille initial du serpent
int positionX = 0; // position sur l'axe des X de la tete du serpent
int positionY = 0; // et sur l'axe des Y
int direction = 1; // la direction initiale
Point pomme; // la position de la pomme
int colonnes = 50; // la taille de la grille notre jeu en lignes et colonnes
int lignes = 43;
int pas = 10; // le pas de la grille du jeu
int tempo = 100; // la tempo du déplacement du serpent
long dernierPas = 0;
int score = 0; // le score
int essais = 0; // le nombre d'essai
boolean commencer = false;
// la direction est codée par un nombre qui représente le Nord, Sud, Est ou Ouest
// 0 = N
// 3 = O + 1 = E
// 2 = S
import ddf.minim.*;//C'est cette instruction (que vous pouvez saisir à la main si vous le voulez) qui importera l'ensemble des fonctionnalités de la bibliothèque Minim pour les rendre accessibles à notre programme. C'est à partir de cette instruction import ddf.minim.*; que notre sketch va pouvoir jouer du son.
AudioPlayer player;
Minim minim;
void setup() {
minim = new Minim(this); // on appelle le player.
player = minim.loadFile("Mélodie snake.wav",2048); // on sélectionne la mélodie.
player.loop();//musique infiniment
size(500,500); // la taille du sketch est celle de la grille * le pas de la grille
textAlign(CENTER);
noStroke();//pas de contours
// à sa naissance le serpent est placé au centre de la grille du jeu
positionX = colonnes/2;
positionY = lignes/2;
snake = new ArrayList(); // on initialise l'ArrayList du serpent
snake.add(new Point(positionX, positionY)); // on y ajoute le premier element
// la pomme est créée à une position aléatoire
pomme = new Point((int)random(colonnes), (int)random(lignes));
dernierPas = millis();
}
void draw() {
noStroke();
background(40,150,250);
fill(0);// coloration en noir du rectangle
rect(50,430,400,500);// rectangle noir du bas
fill(120,10,60);
rect(0,430,50,75);//petit rectangle rose en bas à gauche
rect(450,430,50,75);//petit rectangle rose en bas à droite
stroke(120,10,60);//couleur de l'animation automatique
for(int i = 200; i < player.bufferSize() - 200; i++)// Endroit où se place l'animation (abcisse x)
{
float x1 = map( i, 0, player.bufferSize(), 0, width );
float x2 = map( i+1, 0, player.bufferSize(), 0, width );
line( x1, 465 + player.left.get(i)*30, x2, 465 + player.left.get(i+1)*30 );// endroit où se place l'animation (ordonnées)
line( x1, 465 + player.right.get(i)*30, x2, 465 + player.right.get(i+1)*30 );// endroit où se place l'animation (ordonnées)
}
if (commencer==false) {
fill(153,5,5);
text("Bienvenue dans SNAKE\nNouvelle partie?\nEssayez d'atteindre 15 points pour gagner !", width/2, height/2);
return;
}
if (millis()>dernierPas+tempo) { // si 'tempo' milliscondes se sont écoulées on bouge le serpent
// on determine la position de la tête en fonction de la direction
if (direction == 0) positionY -= 1; // nord
if (direction == 1) positionX += 1; // est
if (direction == 2) positionY += 1; // sud
if (direction == 3) positionX -= 1; // ouest
// si le serpent sort du cadre on perd.
if ((positionX<0)||(positionX>=colonnes)||(positionY<0)||(positionY>=lignes)) {
snake.clear(); // on vide l'ArrayList du serpent
positionX = colonnes/2; // et on repositionne la tête du serpent au centre
positionY = lignes/2;
snakeTaille = 3; // on remet le serpent a sa taille initiale
tempo = 100; // on remet le tempo a 120
essais ++;
score=0;
}
// si le serpent se mord la queue on perd aussi
for (int i = snake.size()-1; i >= 0; i--) {
Point snakeElement = (Point) snake.get(i);
if (snakeElement.touche(positionX, positionY)) { // la tête est-elle sur le même point qu'un des elements du serpent ?
snake.clear(); // on vide le arrayList du serpent
positionX = colonnes/2; // on repositionne le serpent au centre
positionY = lignes/2;
snakeTaille = 3; // on remet le serpent a sa taille initiale
tempo = 100; // on remet le tempo a 250
essais ++;
score=0;
break; // on peut sortir prématurement de la boucle 'for'
}
// quand on a atteint le nombre d'essai maximum
if (essais == 5) {
positionX = colonnes/2; // on repositionne le serpent au centre
positionY = lignes/2;
fill(153,5,5);
text("Game Over !\nVous n'avez pas réussi à atteindre les 15 points!", width/2, height/2);
player.pause(); // la musique s'arrête
return;// on stop tout pour pouvoir afficher le score final
}
}
// si le tête touche la pomme on gagne un point, une taille et on acélère
if (pomme.touche(positionX, positionY)) {
score ++; // un point de plus
snakeTaille ++; // une taille en plus
tempo -=15; // on accelere la cadence
// et on replace la pomme quelque part dans le jeu
pomme.x = (int) random(colonnes);
pomme.y = (int) random(lignes);
}
if (score == 15) {
positionX = colonnes/2; // on repositionne le serpent au centre
positionY = lignes/2;
fill(153,5,5);
text("Vous avez gagné!\nLes 15 points ont été atteints, félicitations !", width/2, height/2);
player.pause(); // la musique s'arrête
return;// on stop tout pour pouvoir afficher le score final
}
// on ajoute la tete à la l'ArrayList du serpent
Point tete = new Point(positionX, positionY);
snake.add(tete);
// on contraint la taille du serpent à 'snakeTaille' elements
if (snake.size()>snakeTaille) snake.remove(0);
dernierPas = millis();
}
noStroke();//pas de contours accentués pour le serpent
fill(255); // couleur du score.
text(score, width-120, height-10); // position du compteur du score
text("score :",width-145, height-10); // position du mot "score :"
fill(255); //couleur des essais
text (essais, width/4, height-10); // position du compteur des essais
text ("essais :", width-405, height-10); // postion du mot "essais :"
fill(104,75,64); // couleur du serpent.
//on dessine chaque elements du serpent
for (int i = snake.size()-1; i >= 0; i--) {
Point point = (Point) snake.get(i);
ellipse(point.x*pas + pas/2, point.y*pas + pas/2, pas, pas);
}
stroke(255,200,0);//les contours de la pomme sont dorés
// et on dessine la pomme en rouge
fill(255, 0, 0);
ellipse(pomme.x*pas + pas/2, pomme.y*pas + pas/2, pas, pas);
}
void keyPressed() {
// on change la direction en fonction des fleche du clavier
// mais on ne permet pas de revenir sur soi
switch(keyCode) {
case RIGHT:
if (direction!=3) direction=1;
break;
case LEFT:
if (direction!=1) direction=3;
break;
case UP:
if (direction!=2) direction=0;
break;
case DOWN:
if (direction!=0) direction=2;
break;
}
}
void mousePressed() {
commencer = true;
}
class Point {
int x; // position x
int y; // et y
Point(int _x, int _y) {
x = _x;
y = _y;
}
Boolean touche(int _x, int _y) {
return ((_x==x)&&(_y==y));
}
}
答案 0 :(得分:1)
说你有一个类函数是没有意义的 - 你有一个名为Point的类。
以这种方式思考:你知道如何使用原始值,如int和boolean。例如,int值可以包含单个整数值。但是,当您希望单个值由多个原始值表示时,您会怎么做?例如,您可能希望跟踪单个点,它既是X值,也是Y值。
该问题的答案是您使用类。简而言之,类是表示单个对象的值(和方法)的集合。例如,您的Point
类代表一个点对象,它由X和Y值组成。
如果这听起来令人困惑,请记住,您已经在使用ArrayList
类,并且所有代码都在幕后的PApplet
课程中。我也猜测你从互联网上获得了这个代码 - 我建议你从头开始尝试从其他人的代码向后工作。
有关课程的更多信息,请查看我撰写的this教程,或查看the Java tutorials。
另外,请注意Processing具有PVector类,因此您不需要创建自己的Point类。