В последние дни я пытался сделать игру, похожую на пинг-понг. У меня есть 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());
}}}
Итак, мой вопрос: как я могу манипулировать угловой скоростью, чтобы мяч подпрыгивал под разными углами каждый раз, когда он сталкивается с моим веслом? Я думаю, что-то вроде получения текущей угловой скорости, а затем умножения ее на какое-то значение, но я не уверен, что это правильный подход к решению моей проблемы. Любые предложения или идеи будут с благодарностью. Заранее спасибо.
На мой взгляд, у вас есть два варианта:
Наконец, вы можете объединить вышеописанные методы, но теперь вам придется использовать точное обнаружение столкновений (а не взлом, который я описал в (1) выше).
Надеюсь, это поможет!
Несколько указателей, вы должны использовать SetLinearVelocity()
а также SetAngularVelocity()
редко. Каждый из них изменяет свойство определения тела, что может привести к возникновению проблем позже, когда все станет сложнее. Было бы лучше использовать ApplyForceToCenter()
или же ApplyLinearImpulse()
в месте SetLinearVelocity()
поскольку эти два гораздо более универсальные функции и немного более дружественные к кодеру.
На мой взгляд, я не думаю, что вы должны использовать b->SetAngularVelocity(_body->GetAngle());
Если вы хотите изменить угловую скорость каждый раз, когда она сталкивается, вы можете в beginContact
метод, напишите, что каждый раз, когда тело сталкивается с телом весла, случайный угловой импульс применяется к мячу, используя ApplyAngularImpulse().
Надеюсь, это поможет.