2013-07-22 2 views
0

Pong cloneКак использовать контакт датчика Box2D для увеличения целочисленной переменной?

Во-первых, спасибо за ваше время.

Как использовать датчики Box2D на EdgeShape (s), чтобы определить условие столкновения с шаром, а затем использовать указанное условие для увеличения переменной счета?

Я создаю клон-понг, используя Box2D через libGDX! Я нашел отличные примеры и учебники от iforce2d и Ray Wenderlich, однако они написаны на языках и библиотеках, с которыми я не знаком в данный момент. Попытка понять и преобразовать код не работает для меня. Если бы код или ссылка на использование Java/libGDX использования Sensor могли быть предоставлены, я был бы очень обязан.

Я получаю контакты в своем коде, но я еще не понял рецепт алгоритма, который игнорировал бы контакт с прямоугольниками весла и границей арены, но увеличивал бы оценку при столкновении с левым или правым датчиками EdgdeShape.

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

ответ

1

я не знаю, как далеко вы пришли с вашими усилиями и никогда не работал с libgdx, но путь-то вроде этого:

  1. fixture.setUserData() (может быть body) распознавать отдельные органы у вас есть (outLeft, вчистую, paddleLeft, paddleRight, шар) - это может быть любой полезной информация от Целых до целого экземпляра игрового объекта, что когда-либо вам нужно

  2. установить вашу левую/правый границы как датчик fixture.setSensor(true) - AFAIK это должен быть установлен так, чтобы не допускать, чтобы границы приводили к столкновению

  3. реализовать ваши контактные слушатели endContact(Contact contact) (или начать контакт, как вы хотите) вызов и запросить приборы A и B от контакта объекта с contact.getFixtureA/B() и определить, является ли данная коллизия актуальна для ваших потребностей, например:

-

public void endContact(Contact contact) { 
    Fixture fixtureA = contact.getFixtureA(); 
    Fixture fixtureB = contact.getFixtureB(); 
    Object userDataA = fixtureA.getBody().getUserData(); 
    Object userDataB = fixtureB.getBody().getUserData(); 
    // check if one is ball 
    if (userDataA instanceof Ball) { 
    checkBallCollision(userDataB); 
    } else if (userDataB instanceof Ball) { 
    checkBallCollision(userDataA); 
    } 
} 

private void checkBallCollision(Object userData) { 
    if (userData instanceof outLeft) { 
    //add points to right player 
    } else if (userData instanceof outRight) { 
    //add points to left player 
    } 
} 

-4. добавьте свой ContactListener в ваш World.setContactListener()

Как сказано, я не уверен на 100%, что это сработает, никогда не использовало его в libgdx, а только несколько небольших экспериментов с расширением box2d andengines, но на самом деле оно должно быть одинаковым для обоих двигатели. вот еще один датчик обработки связи в andengine: http://www.matim-dev.com/creating-sensors.html

+0

Спасибо за ваше время. Ваша помощь выявила более мелкие ответы, которые поставили меня на пути к общему решению, которое я разместил здесь http://stackoverflow.com/questions/17901760/how-to-handle-null-pointer-exception-in-libgdxs-box2d- contactlistener/17902235 # 17902235. – HACKQ3R

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