zoukankan      html  css  js  c++  java
  • cocos2d-x游戏开发系列教程-超级玛丽08-消息机制

    在超级玛丽游戏里,地图类CMGameMap负责所有的程序逻辑,它包含了背景地图,包含了游戏元素精灵,当游戏中的精灵之间发生碰撞时,比如马里奥撞上砖头这种事情发生时,马里奥对象本身不知道怎么处理这个逻辑,这个时候需要有一个机制,让马里奥通知地图对象,去处理这个游戏逻辑,这种通知机制,在cocos2dx中并没有提供。在马里奥游戏里,提供了这个机制,我认为值得好好学习。

    一般说来,由于地图对象包含了所有的游戏元素,在面向对象设计时,地图类应该包容所有的游戏元素对象。由于游戏元素对象需要通知地图类,所以游戏元素类中,也要包容地图对象,这样形成了相互包含。在游戏元素繁多的情况下,这种相互引用导致代码耦合非常严重。

    在马里奥的设计里,使用了一个CMReceiver类,这个类只有一个纯虚接口,这个纯虚接口就是接收消息

    class CMReceiver
    {
    public:
    	virtual void OnMsgReceive(int enMsg,void* pData,int nSize) = 0;
    };

    在马里奥里,CMGameMap是由CMReceiver派生的。

    这样CMGameMap需要去实现OnMsgReceive函数,在这个函数里实现消息处理。


    而游戏元素都从另外一个类CMSender派生

    class CMSender
    {
    protected:
    	CMReceiver* m_pReceiver;
    public:
    	void SetReceiver(CMReceiver* pReceiver)
    	{
    		m_pReceiver = pReceiver;
    	}
    	void SendMsg(int enMsg,void* pData = NULL,int nSize = 0)
    	{
    		m_pReceiver->OnMsgReceive(enMsg,pData,nSize);
    	}
    };
    

    比如马里奥类就是从它派生的

    在CMSender里,保存了一个CMReceiver对象,当有消息要通知CMReceiver时,只要调用CMReceiver对象的OnMsgReceive就行了。


    这样做,相当于把CMGameMap的消息通知的功能抽象到另外一个类中,只是让消息通知这部分有耦合,其他的内容不耦合。


    当马里奥对象需要通知CMGameMap时,调用它自己的CMReceiver对象的OnMsgReceive函数即可,而这个CMReceiver对象正好就是CMGameMap对象。


    好吧,是不是很不好理解?如果被我猜中,那你得先复习下C++关于继承,虚函数等内容。

  • 相关阅读:
    ubuntu下安装maven
    159.Longest Substring with At Most Two Distinct Characters
    156.Binary Tree Upside Down
    155.Min Stack
    154.Find Minimum in Rotated Sorted Array II
    153.Find Minimum in Rotated Sorted Array
    152.Maximum Product Subarray
    151.Reverse Words in a String
    150.Evaluate Reverse Polish Notation
    149.Max Points on a Line
  • 原文地址:https://www.cnblogs.com/new0801/p/6177207.html
Copyright © 2011-2022 走看看