2015-11-23 2 views
0

Ниже приведен код, который у меня есть. Как я могу это сделать, когда я сталкиваюсь с мышью с одним кругом, он удаляется? Я уверен, что могу использовать things.remove (0); но я не уверен, где это выразить.Обработка - Как удалить объект в массиве после столкновения

Любая помощь будет большой, спасибо!

ArrayList<Thing> things = new ArrayList(); 
Player person; 

boolean testMode = true; 

void setup() { 
size(600, 600); 

things.add(new Thing()); 
things.add(new Thing()); 
things.add(new Thing()); 
things.add(new Thing()); 
things.add(new Thing()); 
things.add(new Thing()); 
things.add(new Thing()); 
things.add(new Thing()); 

person = new Player(); 
} 

void draw() { 
background(255); 
noStroke(); 
noCursor(); 

person.display(); 

for (Thing t : things) {  
t.display(); 
if (collision(person, t) == true) { 
text("OUCH!", person.x, person.y-30); 
    things.remove(0); 
} 
} 
} 

///////////////////////////////////// 

boolean collision (Player p, Thing t) { 
float d = dist(p.x, p.y, t.xPos, t.yPos); 
if (p.radius + t.radius > d) { 
// we have a collision 
return true; 
} else { 
return false; 
} 
} 

//////////////////////// 

class Thing { 
//fields 
float xPos; 
float yPos; 
float radius = 30; 

//constructor 
Thing() { 
xPos = random(500); 
yPos = random(500); 
} 

//methods 
void display() { 

float objDist = dist(xPos, yPos, mouseX, mouseY); 
if (objDist < radius) { 
    fill(0, 0, 255, 128); 
} else { 
    fill(0, 255, 0, 70); 
} 

ellipse(xPos, yPos, radius, radius); 
} 
} 

////////////////////////////////// 

class Player { 
float x; 
float y; 
float radius = 30; 

void display() { 
fill(255,0,0,70); 
ellipse(mouseX,mouseY,radius, radius); 
} 
} 

ответ

1

Вы код почти нет, но есть несколько моментов, которые, казалось, проскочили по:

  1. вы рисунок игрока в координатах мыши (ellipse(mouseX, mouseY, radius, radius);), но вы не обновляйте координаты x, y игрока, используемые при обнаружении столкновений. Это сохраняет ваше постоянное вычисление расстояния и, следовательно, код столкновения возвращает ложь
  2. если столкновение вернулось верно, существующий код был удаление первого элемента (things.remove(0);), но он должен удалить ток вещи сталкивающейся
  3. в тест столкновения с использованием суммы радиусов двух объектов, но объекты рисуются с использованием радиуса как Diamter: либо проверить столкновение с половиной радиуса, или рисовать эллипсы, используя радиус * 2

Вот что Я имею в виду код:

ArrayList<Thing> things = new ArrayList(); 
Player person; 

boolean testMode = true; 

void setup() { 
    size(600, 600); 
    //for loops can help you avoid repeating yourself in code 
    for(int i = 0 ; i < 8; i++){ 
    things.add(new Thing()); 
    } 
// things.add(new Thing()); 
// things.add(new Thing()); 
// things.add(new Thing()); 
// things.add(new Thing()); 
// things.add(new Thing()); 
// things.add(new Thing()); 
// things.add(new Thing()); 

    person = new Player(); 
} 

void draw() { 
    background(255); 
    noStroke(); 
    noCursor(); 

    person.x = mouseX; 
    person.y = mouseY; 
    person.display(); 

    for (int i = 0 ; i < things.size(); i++) {//regular for loop to avoid ConcurrentModificationException (which is through usin using for :) 
    Thing t = things.get(i);  
    t.display(); 

    if (collision(person, t) == true) { 
     //text("OUCH!", person.x, person.y-30); //this will probably appear for a slit second 
     println("OUCH!"); 
     //things.remove(0);//don't remove the first, remove the thing that collided 
     things.remove(t); 
    } 
    } 
} 

///////////////////////////////////// 

boolean collision (Player p, Thing t) { 
    float d = dist(p.x, p.y, t.xPos, t.yPos); 
    if ((p.radius + t.radius) * .5 > d) {//.5 is the same as /2 -> although you named the properties of player and thing radius, you are drawing the diameter (twice the size) 
    // we have a collision 
    return true; 
    } else { 
    return false; 
    } 
} 

//////////////////////// 

class Thing { 
    //fields 
    float xPos; 
    float yPos; 
    float radius = 30; 

    //constructor 
    Thing() { 
    xPos = random(500); 
    yPos = random(500); 
    } 

    //methods 
    void display() { 

    float objDist = dist(xPos, yPos, mouseX, mouseY); 
    if (objDist < radius) { 
     fill(0, 0, 255, 128); 
    } else { 
     fill(0, 255, 0, 70); 
    } 

    ellipse(xPos, yPos, radius, radius); 
    } 
} 

////////////////////////////////// 

class Player { 
    float x; 
    float y; 
    float radius = 30; 

    void display() { 
    fill(255, 0, 0, 70); 
    //ellipse(mouseX, mouseY, radius, radius);//you're drawing the player at it's updated positions but the x,y properties used in collision detection aren't updated 
    ellipse(x, y, radius, radius); 
    } 
}