如何改变Player对象状态

我有一个“设计模式”的问题。我想改变一个角色的状态。比方说我有三种状态,或超能力。他们每个人都有不同的能力。如果这个技能只是基于一些属性(可以说质量或速度),我可以直接在这个Player对象上改变他的属性,很好操作。
但是,如果改变一些其他的功能。比如说,角色在2种状态下,他跳跃的动画是不同的,有些其他变化。

我的想法是让每一个特别的Player继承自generalPlayer对象,并增加了特殊能力,而当角色改变状态时,我会改变Player对象的实例。有没有更好的办法?我使用C#作为脚本语言。

原问题:How to change player states?

阅读 2.8k
1 个回答

来自@Big Endian 的回答:

你这种方法是一个Player使用多个不同的对象。每一次玩家的状态改变,在传递数据时可能会有一些乱 。由于C#有委托(delegate),它可以通过改变状态的字段值来改变Player的行为。这可以让你将数据保持在一个对象中,而纯粹依靠条件语句改变行为。

有一句精辟的话,我已经听过很多次,一个对象封装了状态和行为。在C#中,可以通过操作字段值改变状态,并依靠委托改变行为。这应该能解决你的问题。


参考:C#中的委托(delegate)用法简介 http://blog.csdn.net/keggle/article/details/531896
使用委托使程序员可以将方法引用封装在委托对象内。
委托的一个有趣且有用的属性是,它不知道或不关心自己引用的对象的类。任何对象都可以;只是方法的参数类型和返回类型必须与委托的参数类型和返回类型相匹配。这使得委托完全适合“匿名”调用

class Program
    {
        delegate bool CompareOp(int v1, int v2);
        static void Main(string[] args)
        {
            CompareOp less = new CompareOp(Program.Less);
            Console.WriteLine(less(1, 2).ToString());
            Console.WriteLine("Test Delegate");
            Console.ReadLine();
        }
        static public bool Less(int a, int b)
        {
            return a < b;
        }
    }

//2
delegate void MyDelegate(int i);
class Program
{
  public static void Main()
  {
    TakesADelegate(new    MyDelegate(DelegateFunction));
  }
  public static void TakesADelegate(MyDelegate SomeFunction)
  {
     SomeFunction(21);
   }
  public static void DelegateFunction(int i)
  {
     System.Console.WriteLine("Called by delegate with number: {0}.", i);
   }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进