2015-08-26 2 views
1

Итак, сейчас я пытаюсь создать игру, в которой вы продолжаете бежать, и прыгать через препятствия. Я сделал это так, чтобы земля была сделана из двух больших блоков, и когда вы на четвертой части второго блока, первый блок перемещается перед вторым блоком. Это мой код для этого.Libgdx и Box2d Странное столкновение

public void updateGround(){ 
    if(player.getPosition().x >= blocks[1].getGeneratePoint()){ 
     //swap the blocks in the array 
     Block tempblock = blocks[0]; 

     blocks[0] = blocks[1]; 
     blocks[1] = tempblock; 

     Body body1 = blocks[0].getBody(); 
     blocks[1].getBody().setTransform(body1.getPosition().x+(gBlockSize*2)/B2DVars.PPM, 
       0,0); 
    } 
} 

Я хотел бы подчеркнуть тест это, так что я сделал размер блока своего рода маленький и просто оставил его работать, но я заметил, после того, как некоторое время мой парень перестает работать. Я понял, используя b2drenderer и другие тесты, которые каким-то образом игрок вступает в контакт со вторым блоком, и он останавливается прямо там, где начинается второй блок.

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

ответ

3

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

Лучшая идея, чтобы избежать этой ситуации является создание земли с помощью ChainShape

Простой пример кода, как к является:

//float[] vertices - array with vertices of shape: [x1, y1, x2, y2...] 
    Vector2[] worldVertices = new Vector2[vertices.length/2]; 

    for (int i = 0; i < vertices.length/2; ++i) { 
     worldVertices[i] = new Vector2(); 
     worldVertices[i].x = vertices[i * 2]/PPM; 
     worldVertices[i].y = vertices[i * 2 + 1]/PPM; 
    } 

    ChainShape chain = new ChainShape(); 
    chain.createChain(worldVertices); 

Вы также можете прочитать об этом здесь: http://www.box2d.org/manual.html

С уважением, Michał

+0

Спасибо за помощь, это сводило меня с ума. – user1804234

0

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

Вы особенно это увидите, если вы выполняете эти действия с помощью «transforms», а не явно устанавливаете строгие значения для ваших символов.

Попробуйте введение мирового сдвига и посмотрите, что очищает его для вас :)

С другой стороны, если это не сработает, попробуйте вводя небольшое перекрытие коробки края. Часто граничные условия могут испытывать некоторые проблемы при работе с «чрезмерно точными» системами.

+0

Я пробовал метод перекрытия, но он не работает, и я пытаюсь точно изменить значения, но теперь он просто не движется. И что вы имеете в виду под влиянием мировой перемены? – user1804234

0

Решение 1 если вы используете коробку для игрока:

Если вы whant держать ящики использовать полигон, как на этой картинке:

example

Таким образом, ваш игрок не может застрять в край коробки и получает толкнул insted от coliding с краем.

Решение 2

очень просто использовать круг для «ноги» вашего игрока.

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