关于层与层的通信问题,把你知道的办法掏出来,me too

:14:啦啦啦啦啦,在下来一个多星期的雨后,冒个泡 ,咕噜咕噜咕噜。。。切主题

我个人认为,在写游戏时,层与层之间的通信问题是最让人捉摸的。有时候为了在UI跟逻辑代码分开,方便管理或者更换UI的话,这样就会建立了很多层,像PS那样,堆叠起来,达到一个powerful的效果,那么问题就来了。。。怎么实现层与层之间的良好的通信呢,在逻辑层中我击中怪物了,我要让状态层加分或者是加血量,这样不是很Good勒。一个提前想好的游戏框架,我个人觉得这部分是让人捉摸的部分,小菜一枚,还不知道怎么整。但是说说我所知道那点的通信方法。

一,采用观察者模式,也就是常说的__NotificationCenter消息中心进行传递,但是感觉特么不舒服,因为它是一直在监听者,很容易造成游戏某部分的线程冲突的样子。

二,采用委托,这个很不错,推荐。用的的时候调用下就可以了,那么问题也来了,如果通信是三个层以上的通信,这部分该怎么解决。

三,对象引用,在创建另外一个类的时候,也就是层的时候,把需要传递的层的对象如-JS一样,直接传过去。

四,写个单例。貌似这个很占据内存。因为它一直存在

也就知道这么一点,所以需要大家来帮衬下,把你所知道的层与层之间的通信方法说说看。或者你对搭建一个游戏框架有什么好的方法,说说啦。。谢谢勒。不断学习中。。。。。

谁会通灵之术,赶紧把偶尔的往事给震出来。。。。。啦啦啦。。。咕噜咕噜。。。。。

关注一下,帮顶。

给力点勒。顶顶顶顶,那么严谨的一个问题,怎么回复那么好,平时大家都没有遇到这一块的问题呢?

层是指layer和layer之间的通信?
我的做法是每个layer把需要通信的逻辑写成接口,其他layer想用就调接口。
比如我写了个背包层,会暴漏一些类似接口:
创建背包(行数, 列数)
获取背包Item(index)
设置为选中状态(index)
设置点击事件(target, func)

想来应该跟你说的第三种有点像

使用notificationCenter也可以, 但是并不直观,维护起来比较麻烦

今天和人讨论了一下,觉得notification这种方法更好。我把某个控件创建出来,控件在自己的逻辑里dispatch,谁需要接这个事件谁就注册对应的notification, 具体传递的参数两方可协商,派发者传所有需要的参数,接受者各取所需。

看情况
如果两个层都承载着各自复杂的界面逻辑,建议用事件,降低两者耦合
如果子节点逻辑简单,直接暴露API更方便

建议使用注册事件的方式,但是保存事件的列表不要做成全局的,每个节点自己单独维护一个事件列表,这样可以避免造成事件冲突的现象。

顶一下,也一直对这个很迷惑。

给要通讯的层一个Tag 比如说我习惯创建层的时候settag(0);

然后调用的时候Director::getInstance()->getRunningScene()->getChildByTag(0); 就拿到这个层了。既不占内存也一直存在

嗯,这个感觉是还不错,但是在测试时,一直都会显示报错,拿到的Layer为null.
//加载gameStateLayer层
gameStateLayer =GameStateLayer::create();
gameStateLayer->setTag(15);
this->addChild(gameStateLayer, 3);

在别的层拿的时候为

GameStateLayer * layer=(GameStateLayer*)(Director::getInstance()->getRunningScene()->getChildByTag(15));
layer->setCountNumber();
但是layer一直报错,为Null。是我有什么地方写错了???

一,采用观察者模式,也就是常说的__NotificationCenter消息中心进行传递,但是感觉特么不舒服,因为它是一直在监听者,很容易造成游戏某部分的线程冲突的样子。

这个方法是最好的,没有更好的方法了,通常情况会发现到后期层和层已经不需要通讯了,因为都是由网络进行改变,网络推送事件,其他界面接受事件处理,界面和界面直接几乎没有通讯

如果方便的话,可以贴点代码么,这样理解起来更快。如果你不介意的话。 :2: