如何重构我的代码以避免从类外引发事件?

时间:2018-05-30 10:49:03

标签: c# events refactoring

我正在开发一个游戏,其中包含一些管理员,用于不同的任务,如碰撞检测等。一旦检测到碰撞,受此碰撞影响的每个游戏对象都应该引发CREATE OR REPLACE VIEW selected_states AS SELECT *, 2017 AS year FROM states2017 UNION ALL SELECT *, 2018 AS year FROM states2018 AS s JOIN properties p ON s.propertyID = p.propertyID WHERE p.userID=1 事件,这样我就可以轻松播放声音,让对象消失,打开一扇门或其他什么,但如果不从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的作用。

提前致谢。

1 个答案:

答案 0 :(得分:0)

好的,我能提出的应该体现你想要做的事情:

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-class看起来像这样;

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

事情是;我不知道是什么引发了碰撞事件。

编辑,所以我重读了你的问题,看到你提到它已经开始从物理引擎调用了。无论在哪里/然而如果你在物理引擎课程中声明了你的CollisionSystem,你可以从那里调用HandleCollision() - 方法并且你是完整的圆圈。