#box2d #collision
#box2d #столкновение
Вопрос:
Хорошо, это общий вопрос, просто как должна работать система моей игры. Итак, есть много врагов и игрок. Когда враг касается игрока, игрок получает удар и «толчок» от монстра, а затем мигает 1,5 секунды. Несмотря на «толчок» (действительно, очень быстрый), игрок ничего не может сделать. Кроме того, все монстры всегда будут двигаться одинаково. Игрок никогда не будет влиять на ход монстров. Я не могу сделать это кинематически, потому что они влияют на гравитацию. Итак, как я могу это сделать? Все это, включая «нажатие», что я должен делать?
В этом видео YT от 0: 27 также есть хороший пример того, что я имею в виду:http://www.youtube.com/watch?v=tVr8S6WXdog
Спасибо.
Ответ №1:
На вашем примере я предполагаю, что вы не планируете, чтобы монстр и люди на самом деле реагировали друг на друга.
В любом случае, добавьте пользовательский прослушиватель контактов в мир и в прослушивателе контактов проверьте, создают ли игрок и фигура противника точку контакта. Если это так, примените linearimpulse () к телу игрока с желаемым эффектом и отключите все вводимые пользователем клавиши, чтобы предотвратить любые изменения в движении. Тогда просто установите свойство на player, предотвращающее применение импульса, если в него только что попал монстр.
Также при создании тел вам нужно будет установить экземпляр игрока и врага в качестве тела.UserData()
public class Player extends MovieClip
{
public const MAX_EFFECT_TIME = 1.5 * framerate;
public var effectTime:int = 0;
public var body:b2Body;
public function step():void
{
if (effectTime > 0)
{
effectTime--;
//do awesome animation
}
else
{
//move normally
}
}
public function Hit(enemy:Enemy)
{
if (effectTime == 0)
{
//apply linear impulse to object
if (enemy.body.GetPosition().x < this.body.GetPosition().x)
{
//apply impulse left in left direction
b2Vec2 force = b2Vec2(-8, 10);
body.ApplyLinearImpulse(force, body.GetWorldCenter());
}
else
{
//apply impulse in right direction
b2Vec2 force = b2Vec2(8, 10);
body.ApplyLinearImpulse(force, body.GetWorldCenter());
}
//reset effect time
effectTime = MAX_EFFECT_TIME;
}
}
}
public class Game extends MovieClip
{
public var world:b2World;
public var player:Player;
public Game()
{
world = initWorld();
player = initPlayer();
var cl = new CustomContactListener();
world.SetContactListener(cl);
this.addEventListener(Event.ENTER_FRAME, step);
}
private void step(e:Event)
{
world.step();
player.step();
}
}
public class CustomContactListener extends b2ContactListener
{
//Called when a contact point is added.
public override function Add(point:b2ContactPoint):void
{
//checks if the first shape is a player and second is an enemy if true call Hit
if (point.shape1.GetBody().GetUserData().isPlayer amp;amp; point.shape2.GetBody().GetUserData().isEnemy)
{
point.shape1.GetBody().GetUserData().Hit(point.shape2.GetBody().GetUserData());
}
else if (point.shape2.GetBody().GetUserData().isPlayer amp;amp; point.shape1.GetBody().GetUserData().isEnemy)
{
point.shape2.GetBody().GetUserData().Hit(point.shape1.GetBody().GetUserData());
}
}
}
Затем вы можете просто редактировать значения по мере необходимости. Надеюсь, это поможет и удачи!
Комментарии:
1. Хммм, но это применит impluse к монстру, когда игрок ударит монстра. Монстр похож на фон, за исключением того, что это не так. На это влияет только гравитация. Как я могу это сделать? Динамические типы обоих!
2. когда вы вызываете hit для игрока, вызывайте метод для врага, который изменит его скорость на (0, 0), что означает, что импульс не будет иметь никакого эффекта.