2017-05-30 1 views
0

Je suis nouveau dans le traitement et j'ai modifié le code de quelqu'un. Je comprends tout cela d'ailleurs pourquoi mon sprite ne cesse de s'arrêter au hasard. Je finis par perdre le mouvement tous ensemble à ce qui semble être des points aléatoires. De l'aide?Traitement: le mouvement du sprite s'arrête aléatoirement

PImage img; 
sprite player; 
wall[] walls; 

void setup() { 

    size(750, 750); 
    img = loadImage("sprite.png"); 
    player = new sprite(50,300); 
    frameRate(60); 
    smooth(); 

    walls = new wall[3]; 
    walls[0] = new wall(250,0,40,500); 
    walls[1] = new wall(500,250,40,500); 
    walls[2] = new wall(300,200,40,500); 

} 
void draw() { 

    background(255, 255, 255); 
    noStroke(); 

    player.draw(); 
    player.move(walls); 

    for(int i = 0; i < walls.length; i++){ 
    walls[i].draw(); 
    } 

} 

class sprite { 

    float x; 
    float y; 

    sprite(float _x, float _y){ 
    x = _x; 
    y = _y; 
    } 

    void draw(){ 
    image(img,x,y); 
    } 

    void move(wall[] walls){ 

    float possibleX = x; 
    float possibleY = y; 

    if (keyPressed==true) { 

     println(key); 

     if (key=='a') { 
     possibleX= possibleX - 2; 
     } 
     if (key=='d') { 
     possibleX = possibleX + 2; 
     } 
     if (key=='w') { 
     possibleY = possibleY - 2; 
     } 
     if (key=='s') { 
     possibleY = possibleY + 2; 
     } 
    } 

    boolean didCollide = false; 
    for(int i = 0; i < walls.length; i++){ 
     if(possibleX > walls[i].x && possibleX < (walls[i].x + walls[i].w) && possibleY > walls[i].y && possibleY < walls[i].y + walls[i].h){ 
     didCollide = true; 
     } 
    } 

    if(didCollide == false){ 
     x = possibleX; 
     y = possibleY; 
    } 

    } 

} 

class wall { 

    float x; 
    float y; 
    float w; 
    float h; 

    wall(float _x, float _y, float _w, float _h){ 
    x = _x; 
    y = _y; 
    w = _w; 
    h = _h; 
    } 


    void draw(){ 
    fill(0); 
    rect(x,y,w,h); 
    } 

} 
+0

Vous aurez plus de chance si vous limitez votre problème à un [mcve]. Notez que ceci ne devrait pas être votre croquis entier. Par exemple, votre problème n'a rien à voir avec le dessin des images, vous n'avez donc pas besoin de cela. Il suffit de le réduire à un seul rectangle codé en dur entrant en collision avec un autre rectangle codé en dur. Avez-vous essayé [déboguer] (http://happycoding.io/tutorials/processing/debugging) votre code? –

Répondre

0

Le problème réside dans votre fonction move():

void move(wall [] walls) { 
    ... 
    boolean didCollide = false; 
    for (int i = 0; i < walls.length; i++) { 
     if (possibleX > walls[i].x && possibleX < (walls[i].x + walls[i].w) && ...){ 
      didCollide = true; 
     } 
    } 

    if (didCollide == false) { 
     x = possibleX; 
     y = possibleY; 
    } 

} 

Vous vérifiez les collisions, en ce que pour la boucle, ce qui est bon! Cependant, vous ne résolvez jamais la collision (par exemple, éloignez le Sprite du mur afin que le mur ne soit plus dans son rectangle possible), donc la personne ne peut plus bouger car chaque fois que cette fonction est appelée, didCollide finit par être vrai encore.

Vous pouvez tester la prochaine fois en ajoutant ce code:

if (didCollide == false) { 
    ... 
} else { 
    println("I stopped moving."); 
    // could also put collision-resolving code here 
} 

Si vous voyez que dans la console, cela signifie que vous frappez un mur.

Résoudre la collision est une question de déplacer l'image-objet la distance entre lui et le bord le plus proche du mur loin du mur, plus un peu plus afin que vous n'êtes pas toucher encore, comme ceci:

// If sprite to the left of the wall, i.e. went too far to the right... 
float diff = walls[i].x - walls[i].w - this.x; 
this.x += diff + 1.0 
... 
// If sprite below the wall, and essentially too high up.... 
float diff = walls[i].y + wall[i].h - this.y; 
this.y += diff + 1.0