• 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++关于继承,虚函数等内容。

  • 相关阅读:
    二叉树的递归遍历框架:
    springmvc 有哪些优点呢?
    springmvc 和 struts2 有哪些区别?
    三层架构 和 MVC 设计模式有哪些区别呢?
    软件测试各个阶段通常完成什么工作?各个阶段的结果文件是什么?包括什么内容?
    软件测试的策略是什么?
    软件产品质量特性是什么?
    软件配置管理的作用?软件配置包括什么?
    什么是软件测试?软件测试的目的与原则
    软件生存周期及其模型是什么?
  • 原文地址:https://www.cnblogs.com/new0801/p/6177207.html
Copyright © 2020-2023  润新知