2016-03-31 5 views
0

У меня есть игра Space Invaders, над которой я работаю. Очень простой и простой. Пока у меня есть стрелок, который движется (влево и вправо) и стреляет. У меня также есть один захватчик, который перемещается по шаблону. Я хочу, чтобы пули заставили захватчика исчезнуть.Обнаружение столкновений при обработке

Так что мой вопрос в том, как получить обнаружение столкновения для работы (а не цветное столкновение)? Если кто-нибудь покажет мне, как это будет сделано, я буду благодарен.

Примечание: меня обвинили в том, что вы использовали слишком много кода в прошлом, поэтому я надеюсь, что только класс 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

Есть куча способов обработки обнаружения столкновений, что делает это довольно широкий вопрос. Но я остановлюсь на двух подходах, которые, вероятно, будут полезны:

подхода 1: Круг Столкновение

Если вы знаете, центр и размер двух объектов, вы можете просто использовать функцию dist(), чтобы выяснить, насколько далеко друг от друга находятся два объекта. Если это расстояние меньше их размеров, объекты сталкиваются.

Вот небольшой пример:

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, чтобы проверить, перекрываются ли эти поля. Если это так, то объекты сталкиваются.

Вот небольшой пример:

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); 
} 

Оба эти подхода введены в the button example, который поставляется с обработкой.

+0

Спасибо, Кевин, Первый пример, применим ли он только к кругам или к любому объекту? – FredTheHomie

+0

@FredTheHomie Представьте, что вы крутите вокруг своих объектов. Затем вы можете просто столкнуться между кругами. Это не будет работать для каждого случая, но это будет работать для многих простых случаев. Подумайте об этом так: круги являются мнимыми. Вам на самом деле не нужно их рисовать. Вы просто используете их для облегчения столкновения между объектами. То же самое с прямоугольной ограничивающей рамкой. –

+0

Я понимаю, это имеет смысл. Итак, скажите, мой захватчик, у меня вокруг кружка изображений? Итак, как мне поместить этот «круг» вокруг него? – FredTheHomie

Смежные вопросы