2017-05-30 17 views
0

私は処理が新しく、他人のコードを変更しています。なぜ私のスプライトが無作為に止まっているのか、私はそれをすべて理解しています。私は、無作為なポイントであると思われるものですべての動きを失うことになります。どんな助け?処理中:スプライトの移動がランダムに停止します

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

あなたの問題を[mcve]に絞り込んだほうがよいでしょう。これはあなたの全体のスケッチであってはならないことに注意してください。たとえば、問題はイメージを描画することとは関係がないため、必要ありません。別のハードコーディングされた矩形と衝突する単一のハードコーディングされた矩形に限定するだけです。 [デバッグ](http://happycoding.io/tutorials/processing/debugging)コードを試しましたか? –

答えて

0

問題は、あなたの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; 
    } 

} 

あなたは良いですが、ループ、のためにその中で、衝突をチェック!しかし、衝突を解決することは決してありません(つまり、Spriteを壁から離して、壁が可能な四角形内に入らないようにします)。そのため、この関数が呼び出されるたびにdidCollideがtrueになるため、まだ。

あなたは、このコードを追加することで、この次の時間をテストすることができます。

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

コンソールで、それはあなたが壁にぶつかる意味ことを確認した場合。あなたはこのように、まだそれに触れていないように、衝突を解決

が壁から離れてスプライトにそれと壁の最も近いエッジ間の距離を移動するの問題であり、プラスもう少し:

// 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 
関連する問題