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

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

  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;

	}

}

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

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...