2014-01-15 4 views
0

я работаю над игрой в cocos2d/Box2D, и все работает хорошо, перемещение спрайтов, коллизии и т.д.cocos2d box2d вентилятор - влияние спрайт без столкновений

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

Мой спрайт может столкнуться с объектами, и я не могу сделать это без проблем - но я ищу объект, который влияет на мой спрайт БЕЗ столкновения - например, вентилятор, который будет дуть на ветер, который отталкивает спрайт, или магнитное устройство, которое привлекло бы мой спрайт к нему.

Если мой спрайт сталкивается с такими объектами, он должен зарегистрировать столкновение и умереть, но если он просто перемещается в сторону объектов, то его нужно привлекать или отталкивать.

Любые мысли?

+2

вы можете создавать сенсорные тела, которые будут генерировать контактные события, но не будут реагировать на столкновения, позволяя применить фиксированный импульс к любому контактирующему телу. – LearnCocos2D

+0

Вы можете определить область и когда ваше тело спрайта входит в эту область, вы можете изменить гравитацию с уважением к действиям - FAN или MAGNET. – Renaissance

ответ

1

Вы можете применить силы (как в F = ma) к объектам в любое время, чтобы заставить их двигаться.

Гравитация в box2d делает это все время, чтобы объекты падали «вниз», если вы определили вектор силы тяжести.

Итак, ваш вентилятор не обязательно должен быть настоящим «объектом» в том смысле, что он имеет тело. Вы можете применить силу от вентилятора в любое время, используя методы в box2d, к тому, что вы хотите, чтобы вентилятор взорвался. У меня есть код для «EntityController», который применяет тягу, поэтому он перемещается в определенном направлении (целевое направление). Это код для него:

void ApplyThrust() 
    { 
     // Get the distance to the target. 
     Vec2 toTarget = GetTargetPos() - GetBody()->GetWorldCenter(); 
     toTarget.Normalize(); 
     Vec2 desiredVel = GetMaxSpeed()*toTarget; 
     Vec2 currentVel = GetBody()->GetLinearVelocity(); 
     Vec2 thrust = desiredVel - currentVel; 
     GetBody()->ApplyForceToCenter(GetMaxLinearAcceleration()*thrust); 
    } 

В этом случае тело движется к цели. Но так же легко было нацелиться на направление, в которое веет вентилятор, и теперь центр массы «вещи, взорванной» отталкивается от вентилятора.

Все мои объекты имеют максимальную скорость (GetMaximumSpeed ​​(...)), поэтому эта функция будет применять силу только до тех пор, пока объект не будет двигаться с максимальной скоростью, а затем не будет применяться больше (это естественный контур обратной связи) ,

Ознакомиться с остальной базой кода here on git hub. Также говорят о in this post. Обратите внимание, что это в cocos2d-x (C++), но тот же код C++ будет работать в cocos2d, если вы объявите файлы как .mm (разрешает код C++). Или просто используйте технику без кода, как вы считаете нужным.

Было ли это полезно?

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