Как реорганизовать мой код, чтобы избежать создания событий вне классов? - PullRequest
0 голосов
/ 30 мая 2018

Я разрабатываю игру, в которой есть несколько менеджеров для различных задач, таких как обнаружение столкновений и т. Д. После обнаружения столкновения каждый игровой объект, затронутый этим столкновением, должен вызвать событие OnCollided, чтобы я мог легко воспроизводить звуки,объект исчезает, открывается дверь или что-то еще, но я не могу получить такое поведение, не вызвав событие из CollisionSystem, вместо того, чтобы позволить каждому GameObject поднять свое собственное событие.

Вот упрощенный пример,надеюсь, что это имеет смысл:

Class CollisionSystem
{
    // It is called when a collision has been detected between two objects (code not included)
    public void HandleCollision(GameObject gameObject1, GameObject gameObject2)
    {
        //Do whatever
        //How can trigger each corresponding game object event from here?
    }
}

Class GameObject
{
    protected event GameEventHandler Collided;

    protected void OnCollided(GameEventArgs e)
    {
        if (Collided != null)
            Collided(this, e);
    }
}

Я проверял такие вещи, как обнародование метода OnCollided, но событие должно вызываться изнутри класса ... И, с другой стороны, играСам объект не может определить, когда он сталкивается, потому что, в общем-то, именно это и делает CollisionSystem.

Заранее спасибо.

1 Ответ

0 голосов
/ 30 мая 2018

Хорошо, это то, что я мог бы придумать, которое должно воплощать то, что вы пытаетесь сделать:

public class CollisionSystem
{
    Public void HandleCollision(IGameObject[] objects)
    {
        foreach (IGameObject obj in objects)
        {
            //call the function that tells the object it collided
            obj.CollisionDetected()
        }
    }
}

Вы захотите, чтобы ваши игровые объекты реализовали интерфейс

public interface IGameObject
{
    public void CollisionDetected()
}

Что означает, что ваш класс gameobject выглядит следующим образом:

public class GameObject : IGameObject
{
    //constructors, params, whatever
    public void CollisionDetected()
    {
        //play some sound, remove object, whatever
    }
}

Дело в том,Я не знаю, что вызывает ваше столкновение-событие.

Редактировать: , поэтому я перечитал ваш вопрос и увидел, что вы упомянули, что его начали вызывать из физического движка.Где бы / как бы это ни было, если ваш CollisionSystem объявлен внутри класса физического движка, вы можете вызвать HandleCollision() -метод оттуда, и вы будете в полном круге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...