Управление движением спрайта в box2d

В последние дни я пытался сделать игру, похожую на пинг-понг. У меня есть 2 весла и мяч. Все динамические спрайты. Все работает хорошо, за исключением одной проблемы, которую я имею. Мяч имеет тенденцию отскакивать под тем же углом в некоторой точке. Поэтому бывают ситуации, когда игрок может просто перемещать весло на определенную часть, и игра может продолжаться некоторое время или может продолжаться вечно, поскольку мяч не меняет свою угловую скорость независимо от того, в какую часть весла он попадает. , Я использую комбинацию линейной и угловой скорости, чтобы шар двигался так:

if(_isPaused == FALSE)
{
_world->Step(dt, 10, 10);
for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) {
if (b->GetUserData() != NULL) {
CCSprite *sprite = (CCSprite *)b->GetUserData();
if(sprite.tag == 2)
{
b2Vec2 dir = b->GetLinearVelocity();
dir.Normalize();
float currentSpeed = dir.Length();
int maxSpeed = 60;
float accelerate = vel;

if(currentSpeed <= maxSpeed)
{
b->SetLinearVelocity(accelerate * dir);
}

sprite.position = ccp(b->GetPosition().x * PTM_RATIO,
b->GetPosition().y * PTM_RATIO);
sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());

//Keep sprite from bouncing in a straight angle
b->SetAngularVelocity(_body->GetAngle());
}}}

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

0

Решение

На мой взгляд, у вас есть два варианта:

  1. Проверьте место столкновения. Если он находится близко к верхнему / нижнему краю лопасти, отклоните выходящую скорость на угловую величину, пропорциональную «кривизне» поверхности в этой точке. Конечно, это обман, но если изображение и код совпадают, это выглядит правильно. А графика — это «искусство обманывать, не быть пойманным».
  2. Вы можете принять во внимание текущую скорость весла, а также скорость мяча. Например: если мяч движется вниз и вправо, а весло движется вниз, то вы можете вычислить исходящее направление, используя сохранение линейного импульса. Просто убедитесь, что вы ограничите изменение импульса по горизонтальной оси равным нулю.

Наконец, вы можете объединить вышеописанные методы, но теперь вам придется использовать точное обнаружение столкновений (а не взлом, который я описал в (1) выше).

Надеюсь, это поможет!

1

Другие решения

Несколько указателей, вы должны использовать SetLinearVelocity() а также SetAngularVelocity() редко. Каждый из них изменяет свойство определения тела, что может привести к возникновению проблем позже, когда все станет сложнее. Было бы лучше использовать ApplyForceToCenter() или же ApplyLinearImpulse() в месте SetLinearVelocity() поскольку эти два гораздо более универсальные функции и немного более дружественные к кодеру.

На мой взгляд, я не думаю, что вы должны использовать b->SetAngularVelocity(_body->GetAngle()); Если вы хотите изменить угловую скорость каждый раз, когда она сталкивается, вы можете в beginContact метод, напишите, что каждый раз, когда тело сталкивается с телом весла, случайный угловой импульс применяется к мячу, используя ApplyAngularImpulse().

Надеюсь, это поможет.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector