"班级"的作用是什么?功能在我的Processing sketch中?

时间:2015-05-26 17:47:45

标签: function class processing

我只需要在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));
  }
}

1 个答案:

答案 0 :(得分:1)

说你有一个类函数是没有意义的 - 你有一个名为Point的类。

以这种方式思考:你知道如何使用原始值,如int和boolean。例如,int值可以包含单个整数值。但是,当您希望单个值由多个原始值表示时,您会怎么做?例如,您可能希望跟踪单个,它既是X值,也是Y值。

该问题的答案是您使用。简而言之,类是表示单个对象的值(和方法)的集合。例如,您的Point类代表一个点对象,它由X和Y值组成。

如果这听起来令人困惑,请记住,您已经在使用ArrayList类,并且所有代码都在幕后的PApplet课程中。我也猜测你从互联网上获得了这个代码 - 我建议你从头开始尝试从其他人的代码向后工作。

有关课程的更多信息,请查看我撰写的this教程,或查看the Java tutorials

另外,请注意Processing具有PVector类,因此您不需要创建自己的Point类。