2016-03-31 17 views
0

私が取り組んでいるSpace Invadersのゲームがあります。非常に基本的でシンプル。これまで私は(左と右に)動き、撃つ射手を持っています。私もパターンで動く侵略者が1人あります。弾丸が侵略者を消滅させるようにしたい。処理上の衝突検出

私の質問は、どうやって衝突検出が機能するか(色の衝突ではない)ですか?誰かが私にそれがどのように行われたかを示すことができれば、私は感謝するでしょう。

注:過去にあまりにも多くのコードを入れてしまったので、BulletとInvaderのクラスが正しい方法であることを祈っています。

ArrayList <Bullet> bullets; 

class Bullet 
{ 
    float x; 
    float y; 
    float speed; 
    Bullet(float tx, float ty) 
    { 
    x = tx; 
    y = ty; 
    } 
    void display() 
    { 
    stroke(255, 0, 0); 
    fill(255); 
    ellipse(x,y, 10, 10); 
    } 
    void move() 
    { 
    y -= 5; 

} 
} 
void moveAll() 
{ 
    for(Bullet temp : bullets) 
    { 
    temp.move(); 
    } 
} 
void displayAll() 
{ 
    for(Bullet temp : bullets) 
    { 
    temp.display(); 
    } 
} 
Cell[][] grid; 

float i, j; 

boolean b3=false; 
boolean b4=true; 
boolean b5=false; 

int cols = 5; 
int rows = 2; 
color pixel; 

class Cell { 
    float cX,cY; 


    Cell(float tempX, float tempY, float tempW, float tempH) { 
    cX = tempX; 
    cY = tempY; 
    } 

    void display2() { 
    stroke(255, 0, 0); 
    fill(255, 0, 0); 
    rect(cX+30,cY+100,5,5); 
    rect(cX+35,cY+95,5,5); 
    rect(cX+35,cY+90,5,5); 
    rect(cX+40,cY+85,5,5); 
    rect(cX+45,cY+80,5,5); 
    rect(cX+50,cY+80,5,5); 
    rect(cX+55,cY+75,5,5); 
    rect(cX+60,cY+75,5,5); 
    rect(cX+65,cY+75,5,5); 
    rect(cX+70,cY+75,5,5); 
    rect(cX+75,cY+80,5,5); 
    rect(cX+80,cY+80,5,5); 
    rect(cX+85,cY+85,5,5); 
    rect(cX+90,cY+90,5,5); 
    rect(cX+90,cY+95,5,5); 
    rect(cX+95,cY+100,5,5); 
    rect(cX+95,cY+105,5,5); 
    rect(cX+95,cY+110,5,5); 
    rect(cX+95,cY+115,5,5); 
    rect(cX+90,cY+120,5,5); 
    rect(cX+85,cY+120,5,5); 
    rect(cX+80,cY+120,5,5); 
    rect(cX+75,cY+115,5,5); 
    rect(cX+70,cY+115,5,5); 
    rect(cX+70,cY+120,5,5); 
    rect(cX+70,cY+125,5,5); 
    rect(cX+65,cY+115,5,5); 
    rect(cX+60,cY+115,5,5); 
    rect(cX+55,cY+115,5,5); 
    rect(cX+55,cY+120,5,5); 
    rect(cX+55,cY+125,5,5); 
    rect(cX+50,cY+115,5,5); 
    rect(cX+45,cY+115,5,5); 
    rect(cX+45,cY+120,5,5); 
    rect(cX+40,cY+120,5,5); 
    rect(cX+35,cY+120,5,5); 
    rect(cX+30,cY+115,5,5); 
    rect(cX+30,cY+110,5,5); 
    rect(cX+30,cY+105,5,5); 
    rect(cX+40,cY+125,5,5); 
    rect(cX+40,cY+130,5,5); 
    rect(cX+45,cY+135,5,5); 
    rect(cX+50,cY+140,5,5); 
    rect(cX+55,cY+140,5,5); 
    rect(cX+60,cY+140,5,5); 
    rect(cX+65,cY+140,5,5); 
    rect(cX+70,cY+140,5,5); 
    rect(cX+75,cY+140,5,5); 
    rect(cX+80,cY+135,5,5); 
    rect(cX+85,cY+130,5,5); 
    rect(cX+85,cY+125,5,5); 



    if(b4==true) { //moving right 
     b3 = false; 
     b5 = false; 
     cX += 2; 
    } 
    else if(b5==true) { //moving left 
     b3 = false; 
     b4 = false; 
     cX -= 2; 
    } 

    if((b4 == true && cX >= 780) || (b5 == true && cX <= -1)) 
    { 
     b3 = true; //moving down 
     b4 = false; 
     b5 = false; 
    } 

    if(b3 == true) //moving down 
    { 
     cY += 3; 
     if (cY % 10 == 0) //moving down 10 pixels 
     { 
     b3=false; 
     if (cX >= 780) //if it is on the right edge 
     { 
      b4 = false; 
      b5 = true; 
     } 
     else if (cX <= -1) //if it is on the left edge 
     { 
      b4 = true; 
      b5 = false; 
      cY += 3; 
     } 
     } 
    } 
    } 

    void monster() 
    { 
      display2(); 
     } 
} 

答えて

2

これはかなり広範な問題になり、衝突検出を処理する方法はたくさんあります。あなたは二つのオブジェクトの中心とサイズを知っている場合、あなたは、単に把握するdist()機能を使用することができますサークル衝突

アプローチ1:しかし、私はおそらく有用であろう二つのアプローチに焦点を当てます2つのオブジェクトがどれだけ離れているか。その距離がそれらのサイズよりも小さい場合、オブジェクトは衝突しています。

はここで少し例を示します

void setup() { 
    size(500, 500); 
    ellipseMode(RADIUS); 
} 

void draw() { 
    background(0); 

    float circleOneX = width/2; 
    float circleOneY = height/2; 
    float circleOneRadius = 50; 

    float circleTwoX = mouseX; 
    float circleTwoY = mouseY; 
    float circleTwoRadius = 100; 

    if (dist(circleOneX, circleOneY, circleTwoX, circleTwoY) < circleOneRadius + circleTwoRadius) { 
    //colliding! 
    fill(255, 0, 0); 
    } else { 
    //not colliding! 
    fill(0, 255, 0); 
    } 

    ellipse(circleOneX, circleOneY, circleOneRadius, circleOneRadius); 
    ellipse(circleTwoX, circleTwoY, circleTwoRadius, circleTwoRadius); 
} 

アプローチ2:長方形の衝突代わり

は、あなたがオブジェクトの周りにバウンディングボックスを定義することができます。次に、それらのボックスがまったく重なり合っているかどうかをチェックするために一連のif文が必要です。そうであれば、オブジェクトは衝突している。処理が付属していますthe button exampleで導入されているこれらのアプローチの

void setup() { 
    size(500, 500); 
} 

void draw() { 
    background(0); 

    float rectOneX = width/2; 
    float rectOneY = height/2; 
    float rectOneWidth = 50; 
    float rectOneHeight = 50; 

    float rectTwoX = mouseX; 
    float rectTwoY = mouseY; 
    float rectTwoWidth = 100; 
    float rectTwoHeight = 100; 

    if (rectOneX < rectTwoX + rectTwoWidth && 
    rectOneX + rectOneWidth > rectTwoX && 
    rectOneY < rectTwoY + rectTwoHeight && 
    rectOneHeight + rectOneY > rectTwoY) { 
    //colliding! 
    fill(255, 0, 0); 
    } else { 
    //not colliding! 
    fill(0, 255, 0); 
    } 

    rect(rectOneX, rectOneY, rectOneWidth, rectOneHeight); 
    rect(rectTwoX, rectTwoY, rectTwoWidth, rectTwoHeight); 
} 

両方:

はここで少し例です。

+0

ありがとうKevin、最初の例は、サークルやオブジェクトにのみ適用されますか? – FredTheHomie

+0

@FredTheHomieあなたのオブジェクトの周りに円を描くと想像してください。その後、サークル間の衝突を行うことができます。それはすべてのケースでうまくいくわけではありませんが、多くの単純なケースでうまくいくでしょう。このように考えてみましょう。円は想像上のものです。実際に描く必要はありません。あなたはオブジェクト間の衝突をより簡単にするためにそれらを使用しています。四角形の境界ボックスと同じです。 –

+0

私は理解しています、これは理にかなっています。だから、私の侵略者は、私はそれの周りにイメージサークルがありますか?だから私はどのようにそれの周りにこの "円"を置くのですか? – FredTheHomie