2013-04-25 6 views
-1

В игре, которую я делаю, я хочу сделать так, чтобы зомби не могли пройти друг через друга или игрока.останавливать спрайтов от прохождения друг друга

Я не хочу делать это так, чтобы зомби некоторое время останавливались или двигались в другом направлении, когда они попадали друг в друга, потому что это выглядит странно, и я хочу, чтобы зомби всегда следили за игроком. То, что я думал, состояло в том, чтобы следить за положениями x и y зомби раньше (что я уже делаю), а затем, когда он сталкивается с другим зомби или игроком, он будет телепортироваться в последнюю позицию x и y, прежде чем он столкнется с другим спрайт.

Будет ли это работать? Есть ли лучший способ сделать это? И как я буду следить за последними положениями x и y, прежде чем зомби столкнутся с другим спрайтом?

У меня уже есть код, который hecks коллизию для зомби

for(int i = 0; i < zombies.size(); i++){ 
      Zombie z = (Zombie) zombies.get(i); 
      Rectangle r2 = z.getBounds(); 
      for(int j = i + 1; j < zombies.size(); j++){ 
       Zombie z2 = (Zombie) zombies.get(j); 
       Rectangle r1 = z2.getBounds(); 
       if(r2.intersects(r1)){ 
        //the code for stoping the sprites from going through each other should be here 
       } 
      } 
     } 

Я просто интересно, что я должен иметь в заявлении, если сделать спрайты не проходящие через друг друга.

+0

Что это с зомби в последнее время? Ты сегодня второй человек, который спрашивает о создании игры с зомби, я сам пишу историю зомби, тогда есть «Растения против зомби» ... в любом случае. Вам нужно создавать классы. Каждый объект класса спрайтов имеет координаты X/Y. Если один из спрайтов движется, вы можете либо перебрать все остальные спрайты (и тем самым проверить, есть ли столкновение), либо сохранить 2-мерную карту плитки, которая сделает это за вас. Как организовано ваше игровое поле? –

+0

Не задавайте другой вопрос, если [ваш предыдущий] (http://stackoverflow.com/questions/16218651/how-to-stop-entities-sprites-from-going-through-each-other) не получает достаточно внимания или, по крайней мере, удалить свой старый вопрос. Телепортация на последнюю позицию кажется довольно сырой. Если вы не позволите пройти через (как многие игры), по крайней мере, не позволяйте зомби перемещаться в занятую позицию. – Gamb

ответ

1

Вы, вероятно, следует сделать проверку столкновений и движение одновременно:

for(int i = 0; i < zombies.size(); i++){ 
    Zombie z = (Zombie) zombies.get(i); 

    // New code here: 
    int x = z.getX(); 
    int y = z.getY(); 
    attemptZombieMove(z); 

    Rectangle r2 = z.getBounds(); 
    for(int j = 0; j < zombies.size(); j++){ 
     if (i == j) { 
      continue; 
     } 
     Zombie z2 = (Zombie) zombies.get(j); 
     Rectangle r1 = z2.getBounds(); 
     if(r2.intersects(r1)){ 
      //the code for stoping the sprites from going through each other should be here 
     } 
    } 
} 

Обратите внимание, что я изменил внутреннюю for петлю так, что j начинается с 0. Я сделал это потому, что мы хотим изменить положение зомби в середине цикла. Поэтому вполне возможно, что, когда мы проверяем зомби А на столкновения, он может не столкнуться с зомби Б, но после того, как они двигаются, они сталкиваются.

Ваше обнаружение столкновений может просто сбросить z «S х и у значения к int s вы схватился, прежде чем двигаться z. Вы можете сделать его более сложным, чем это - сбросить x, если есть столкновение в x, и сбросить y, если есть столкновение в y (сброс обоих, если в обоих случаях есть столкновение). Таким образом, зомби мог ударить другого зомби или стены или что-то еще и пройтись по ней.

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

Кроме того, вы можете сделать Zombie расширить CollidableObject класс, а затем внутреннюю итерацию цикла через коллекцию CollidableObject с, который будет включать все зомби. Таким образом, вы также можете написать класс Wall, класс Obstacle и т. Д., Чтобы они все расширялись CollidableObject и вставляли больше объектов в список CollidableObject, и столкновения с зомби и препятствиями были бы позабочены в одном цикле.

+0

Как должен выглядеть метод 'tryZombieMove (z)' для его работы? – programmer

+0

Получите текущее положение зомби, выясните, куда он должен идти (я полагаю, к игроку, хотя вы можете включить более сложное поведение, если это необходимо), а затем измените значения x и y зомби. –

+0

Может ли это выглядеть так? 'for (int i = 0; i player.getY()) { z.setY (z.getY() - .3); } если (z.getY() player.getX()) { z.setX (z.getX() - .3); } если (z.getX() programmer

1

Как немного предложение для варианта плитки:

Если предположить, что ваше игровое поле организовано как 16х16 tilemap, это может выглядеть следующим образом:

Tile Map[16][16]; 

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

if(Map[NewX][NewY].Occupant == NULL) { 
    Map[NewX][NewY].Occupant = Sprite; 
    Map[Sprite.X][Sprite.Y].Occupant = NULL; 
    Sprite.setLocation(NewX, NewY); 
} 

Tile содержит указатель на объект типа Sprite (или что вы хотите назвать его) называется Occupant. Эта небольшая теория позволит вам легко проверить, занято ли поле, в которое вы хотите перейти, уже занято ... или движется, если это не так.

Зомби прекратит движение, если поле, о котором идет речь, уже занято.

+0

Это не синтаксис Java –

+0

@RobWatts Простите меня, я из угла C++ и не проработал Java некоторое время. У Java нет явных указателей, не так ли? Лемме это правильно. –