AttackController для врагов в 2D игре


Я разрабатываю немного sidescroll 2Д шутер. В настоящее время я работаю на основной врагами.

Для этой цели я разработал компонент, который будет появляться выстрелов, направленных torwards врага. Компонент-система и двигатель я разработал сам.

Это мой UfoAttackController:

#ifndef GUARD_UfoAttackController_H
#define GUARD_UfoAttackController_H

#include "Engine\component.h"
#include "Engine\actor.h"

#include "Engine\engine.h"

#include "shotcollisionevent.h"
#include "componentget.h"
#include "ufoshotcleaner.h"

class UfoAttackController : public ActorComponent //ActorComponent is a base component all components have to inherit from
{
public:
    UfoAttackController(Actor* target) //A pointer to the player will be passed to the component to give it a target
        : ActorComponent("UfoAttackController"), m_Target(target), m_Interval(1.0f), m_TimeLastShot(5.0f)
    {}

    virtual void Update()
    {
        if ((double)Util::GetTotalTime() - m_TimeLastShot > m_Interval)
        {
            Vector2 targetPosition = m_Target->GetPosition();
            Vector2 targetDir      = targetPosition - GetOwner()->GetPosition(); //GetOwner returns the component owner, which is the actor it's attached to

            targetDir.Y -= 100;

            getEngine().RunCreationCall(mango::bind<void>(BuildUfoShot, getEngine().GetFactory(), targetDir, GetOwner())); //tells the engine to create an Ufo-Shot

            m_TimeLastShot = (double)Util::GetTotalTime(); //contains the global game timer
        }
    }

    virtual void Move(Vector2 motion) //implemented due to base-component
    {

    }

    virtual void SetPosition(Vector2 pos) //implemented due to base-component
    {

    }

private:
    static void SetShotPhysic(Actor* actor, Vector2 dir)
    {
        PhysicProperties* physic = getActorPhysic(actor);
        physic->SetFallMode(true);

        physic->SetElasticity(0.001f); //The elasticy determins how far an actor bounces of if it collides with the holder of the containing physic component

        if (dir.X > 100 || dir.X < -100)
        {
            physic->SetXVelocity(dir.X / 50.0f);
        }
        if (dir.Y > 100 || dir.Y < -100)
        {
            physic->SetYVelocity(dir.Y / 50.0f);
        }

        physic->SetYAcceleration(0.0f);

        actor->SetCollisionTrigger(triggerShotCollision); //sets the collision function which shall be called on collision
        actor->SetPhysicTrigger(triggerShotPhysic);
    }

    static void BuildUfoShot(ActorFactory* factory, Vector2 direction, Actor* actor)
    {
        static mango::int32 id = 0; //generic ID to differenciate between the shots. The engine won't allow actor with similar names.

        ActorFactory::StaticAssetLayout asset; //A layout which specifies the data of an asset.

        asset.name = String32("ufoshot") + mango::to_string32(id);

        asset.position = actor->GetPosition() + Vector2(0, 100);

        asset.size = Vector2(35, 35);
        asset.spriteName = "Effects\\laserShot0"; //sprite path and name
        asset.layer = 1; //layer in which the asset shall be rendered. 0 is the highest layer.

        Actor* shot = factory->CreateStaticProjectile(asset, false, true);

        shot->AddComponent(new UfoShotCleaner()); //class which will clean ufo shots with speed between 1 and -1

        SetShotPhysic(shot, direction);
        getEngine().AddActor(shot);

        ++id;
    }

    Actor*  m_Target;
    double  m_Interval;
    double  m_TimeLastShot;
};

#endif//GUARD_UfoAttackController_H

Внутри функции обновления я вычислить направление, в котором удар должен быть уволен за позицию игрока. В принципе это работает, но я чувствую, что там может быть лучший способ справиться с этим. У кого-нибудь есть лучшие идеи, как определить направление, в котором НЛО должны стрелять?

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

В игре это выглядит так:

enter image description here



126
4
задан 9 апреля 2018 в 03:04 Источник Поделиться
Комментарии