2014-02-18 4 views
0

Я пишу свою первую игру для андроида и столкнулся с проблемой проверки столкновений. Игра состоит из сцены прокрутки, в которой блок прыгает при постукивании и должен приземляться на зданиях с разной высотой. Проблема в том, что блок часто заканчивается через пол, из-за того, что фреймы не обновляются достаточно быстро. Я попытался помещать обнаружение столкновения в отдельный поток, и хотя это немного улучшает обнаружение, оно все равно не очень велико. Несмотря на то, что я компенсирую настройку высоты вручную для следующего кадра, я боюсь, что для более медленных устройств, чем мой Nexus 5, объект просто провалится через здание, как это иногда бывает на этом устройстве. Мой код выглядит следующим образом:Обнаружение столкновений для быстродвижущихся объектов

public void physics() { 

     // Generate Player Rectangle 
     player.set(x1,y1, x2,y2); 
     // Check building rectangle 
     if (player.intersects(x1,y1,x2,y2)) { 
      character.collide(); 
     } 
    } 

Может ли кто-нибудь указать мне в правильном направлении для обнаружения этого с большей точностью? Я не смог найти ответ, который мне подходит. Благодаря!

+0

Вы не должны создавать новый экземпляр Rectangle для каждого тика игры. (если я не читаю его неправильно) – Nikki

+0

Спасибо за ваш ответ Nikki - как бы я это сделал, не создавая новый кадр для движущегося объекта? – JaanRaadik

+0

Вы должны создать свой прямоугольник один раз в методе init вашей игры. Затем каждый тик, обновляйте координаты прямоугольников: player.set (x1, y1, x2, y2); – Nikki

ответ

1

Предполагая, что скорость объекта X или Y добавляется к координатам объекта на каждом шаговом событии, объект приема (например, земля или стена) должен всегда иметь большую ширину или высоту, чем скорость движущегося объекта ,

Если координата X вашего объекта увеличивается на 1000 каждый шаг, а ширина стены составляет всего 32, маловероятно, чтобы границы снаряда пересекались со стенкой. Легким решением является установка границ объекта «прием» для охвата, где может быть снаряд.

Например:

public void onStep() 
{ 
    for (Wall wall : wall_items) // Assuming wall_items is iterable 
    { 
     // Do not modify walls behind or above projectile 
     if (wall.x > this.x == false) continue; 
     if (wall.y > this.y == false) continue; // Skip and continue loop 

     wall.width = this.width + this.velocity_x; 
     wall.height = this.height + this.velocity_y; 
    } 

    this.x += this.velocity_x; 
    this.y += this.velocity_y; 
} 

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

Edit: условия, чтобы проверить, если стены позади или над снарядом должна продолжать не возвращение, как вы все еще хотите, чтобы оставаться в методе onStep(). Мои извинения.

+0

Спасибо за это объяснение, что делает все намного яснее. – JaanRaadik

+0

Не проблема! Я сделал быструю смену, так как условия должны только _ продолжить_ цикл, а не _return_ или _break_ цикл. –

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