【potatoes游戏开发】cocos2dx3.X项目重写(八)观察者模式(中)

【potatoes游戏开发】cocos2dx3.X项目重写(八)观察者模式(中),第1张

概述观察者模式中,也可以传递数据。 void postNotification(const std::string& name, Ref *sender); 第二个参数就是可以传递的数据,格式是Ref*,如果想传递变量的话要强制转换一下。 我们要怎样得到这个消息的值呢。 在订阅函数里 void __NotificationCenter::addObserver(Ref *target,

观察者模式中,也可以传递数据。

  voID postNotification(const std::string& name,Ref *sender);
第二个参数就是可以传递的数据,格式是Ref*,如果想传递变量的话要强制转换一下。

我们要怎样得到这个消息的值呢。

在订阅函数里

voID __NotificationCenter::addobserver(Ref *target,SEL_CallFuncO selector,const std::string& name,Ref *sender)
其中第二个参数,也就是回掉函数的定义是这样的

typedef voID (Ref::*SEL_CallFuncO)(Ref*);

参数是Ref*,也就是传来的消息。
················································分割线····················································

为了方便起见,我把地面和背景分别放在两个layer里面,在跳跃的时候,设置了屏幕跟随,也就是让地面的layer在player跳跃的时候下降,这个下降和上升的距离取决于player跳多高,这里我也给背景layer添加了效果。用观察者给背景layer实时传递player的y坐标。

在地面layer里

	   auto playerh= (int)player->getpositionY();           auto  playerh2 = (Ref*)(playerh);	   NotificationCenter::getInstance()->postNotification("h",playerh2);
在背景layer里面,因为订阅了消息,而player死亡之后要注意取消订阅,否则会有BUG

voID bglayer::call(Ref* r){	if ((int)r<0)	{		NotificationCenter::getInstance()->removeAllObservers(this);		this->unschedule(schedule_selector(bglayer::run));	}	else	{		this->setpositionY(this->getposition().y-((int)r-h)/4);		h=(int)r;	}}

这个简单的算法实现了地面,背景和人的呼应,有疑问请留言哦。 总结

以上是内存溢出为你收集整理的【potatoes游戏开发】cocos2dx3.X项目重写(八)观察者模式(中)全部内容,希望文章能够帮你解决【potatoes游戏开发】cocos2dx3.X项目重写(八)观察者模式(中)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1078371.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存