cocos2d-x SimpleGame(2)如何移动一个精灵

上一章我们添加了一个英雄到屏幕中,但他太孤单了,所以这次我们添加一些敌人来让主角干掉。


具体的实现我们写在函数 void addTarget()里,这个函数会实现将敌人添加进屏幕,并从右往左以一个随机的速度移动。


在HelloWorldScene.h文件里声明 void addTarget()方法,然后把以下代码添加进HelloWorldScene.cpp文件里。

void HelloWorld::addTarget()
{
	// 声明敌人精灵并初始化
	CCSprite *target = CCSprite::create("Target.png");

	// 获取屏幕尺寸
	CCSize winSize = CCDirector::sharedDirector()->getWinSize();
	//计算敌人精灵可以出现的范围并从该范围内伪随机出一个位置
	int minY = target->getContentSize().height/2;
	int maxY = winSize.height - target->getContentSize().height/2;
	int rangeY = maxY - minY;
	int actualY = ( rand() % rangeY ) + minY;

	// 设置敌人精灵的位置
	target->setPosition( 
		ccp(winSize.width + (target->getContentSize().width/2), 
		actualY) );
	// 把敌人精灵添加到HelloWorld图层
	this->addChild(target);

	// 敌人精灵从右移动到左边的时间为2-4秒
	int minDuration = (int)2.0;
	int maxDuration = (int)4.0;
	// 从2-4秒中随机一个时间
	int rangeDuration = maxDuration - minDuration;
	int actualDuration = ( rand() % rangeDuration )+ minDuration;

	// 设置精灵从右移动到左的位置以及所花时间
	CCFiniteTimeAction* actionMove = CCMoveTo::create( (float)actualDuration, 
		ccp(0 - target->getContentSize().width/2, actualY) );
	// 设置精灵完成动作后进行的操作(在回调函数spriteMoveFinished中实现)
	CCFiniteTimeAction* actionMoveDone = CCCallFuncN::create( this, 
		callfuncN_selector(HelloWorld::spriteMoveFinished));
	target->runAction( CCSequence::create(actionMove, actionMoveDone, NULL) );
}

在这我们通过callfuncN_selector(HelloWorld::spriteMoveFinished)回调了spriteMoveFinished函数,我们需要在HelloWorldScene.h文件中声明它,并在cpp文件里实现它

// 移除敌人精灵
void HelloWorld::spriteMoveFinished(CCNode *sender )
{
	CCSprite *sprite = (CCSprite *)sender;
	this->removeChild(sprite, true);

}

温馨提示

1.关于随机函数。srand和rand是C标准库函数。对于每一个平台来说,你可以先获取毫秒级时间来得到一个随机数。
2. 回调函数,在objc中用selector:@selector(spriteMoveFinished),但在cpp中实现就比较复杂了,你可以参考cocos2dx\include\selector_protocol.h里的声明。一共有5种回调函数类型
 schedule_selector
 callfunc_selector
 callfuncN_selector
 callfuncND_selector
 menu_selector

如何使用它们,根据所用函数的定义来决定。比如使用CCTimer::initWithTarget函数,它的第二个参数是SEL_SCHEDULE类型,到selector_protocol.h里查一下,可以看到对应的是schedule_selector(_SELECTOR)宏,所以调用时就需要在类里头实现一个void MyClass::MyCallbackFuncName(ccTime)函数,然后把schedule_selector(MyClass::MyCallbackFuncName)作为CCTimer::initWithTarget的第二个参数传入。

现在,我们要隔一定时间就往屏幕中加入敌人,添加如下代码到init()方法中,记得放在return之前。

// 每1.0秒执行一次指定的回调函数
		this->schedule(schedule_selector(HelloWorld::gameLogic), 1.0);

然后实现在HelloWorldScene.h文件中声明gameLogic()方法,并在cpp文件中实现它。要注意gameLogic()方法必须声明为public,否则是不能回调的。

void HelloWorld::gameLogic( float dt )
{
	addTarget();
}

好了,全部搞定,编译并运行,好好享受你的成果。


附本章源码下载:http://download.csdn.net/detail/lpkkk/4997324

文章所写的东西只是我自己的理解,如果哪里出现错误,敬请斧正。

您可以留言、微博私聊我或Email我


我的微博:http://weibo.com/u/2007282737

我的Email:pengkailiao@gmail.com


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值