喵星战争(八):游戏主模块的实现-2

      游戏中一般需要在游戏循环的每帧中控制渲染和逻辑。在Cocos2d-x引擎中已经不需要再控制渲染,可以根据游戏的需要加入每帧更新的逻辑函数,在初始化函数中调用scheduleUpdate函数,然后重写updata函数便可以在游戏循环中控制逻辑。

     本游戏中需要在更新函数中做以下几件事:

     1、游戏背景的移动;

     2、主角和敌人的碰撞检测;

     3、主角和敌人子弹的碰撞检测;

     4、主角子弹和敌人的碰撞检测。

    update函数代码如下:

void GameMain::update(float time)
{
	//背景移动逻辑
	bg1->setPosition(ccp(bg1->getPosition().x , bg1->getPosition().y -2));
	bg2->setPosition(ccp(bg2->getPosition().x , bg2->getPosition().y -2));
	if (bg2->getPosition().y < 0)
	{
		float temp = bg2->getPosition().y + 480;
		bg1->setPosition(ccp(bg2->getPosition().x , temp));
	}
	if (bg1->getPosition().y < 0)
	{
		float temp = bg1->getPosition().y + 480;
		bg2->setPosition(ccp(bg1->getPosition().x , temp));
	}

	CCPoint	hpos = hero->getPosition();
	//敌人和主角子弹的碰撞检测
	for (int i = 0; i< 3; i++)
	{
		GameObjEnemy *enemy = ((GameObjEnemy *)enemys->objectAtIndex(i));
		CCPoint epos = enemy->getPosition();
		if (enemy->islife)
		{
			for (int i = 0; i < bullets->capacity(); i++)
			{
				if (((GameHeroBullet *)bullets->objectAtIndex(i))->getIsvisable())
				{
					if (isCollion(((GameHeroBullet *)bullets->objectAtIndex(i))->getPosition(), epos, 5, 13, 21, 28))
					{
						enemy->setdie();
						gamemark->addnumber(200);
						break;
					}
				}
			}
		}
		//敌人和主角的碰撞检测
		if (!isreduce && enemy->islife && isCollion(hpos ,epos , 21, 22, 5, 21, 28))
		{
			enemy->setdie();
			setherohurt();
		}
	}

	//主角和敌人子弹的碰撞检测
	if (!isreduce)
	{
		for (int i = 0; i < enemybullets->capacity(); i++)
		{
			if (isCollion(hpos ,((GameEnemyBullet *)enemybullets->objectAtIndex(i))->getPosition(),21 ,22 ,5 ,13))
			{
				setherohurt();
			}
		}
	}
}


主角受伤逻辑,代码如下:

void GameMain::setherohurt()
{
	//主角受伤,减血
	hero->stopAllActions();
	switch(blood)
	{
	case 3:
		blood1->setVisible(false);
		blood--;
		break;
	case 2:
		blood2->setVisible(false);
		blood--;
		break;
	case 1:
		blood3->setVisible(false);
		blood--;
		break;
	case 0:
		if (!isover)
		{
			isover = true;
			setover();
		}
		break;
	}
	CCActionInterval* action = CCBlink::create(5, 10);
	hero->runAction(action);
	schedule(schedule_selector(GameMain::resetreduce), 5.0f);
	isreduce = true;
}


下面先讲述下知识点:

1.scheduleUpdate():该函数是为了把当前节点(比如CCLayer)添加到队列里,只要把节点添加到队列里后,那么这个节点在游戏运行的每一帧被调用一次update函数。

2.CCActionInterval家族(持续动作):

持续动作,顾名思义,就是该动作的执行将持续一段时间。因此持续动作的静态生成函数,往往附带一个时间值Duration。

持续动作比立即动作的数量多很多,常用的CCActionInterval子类动作有:

简单的:

CCMoveTo:移动到

CCMoveBy:按......移动

CCJumpTo:t跳跃到

CCJumpBy:按......跳跃

CCBezierTo:贝兹移动到

CCBezierBy:按……贝兹移动

CCRotateTo:旋转到

CCRotateBy:按……旋转

CCScaleTo:缩放到

CCScaleBy:按……缩放

CCSkewTo:切变到

CCSkewBy:按……切变

CCTintTo:颜色渐变到

CCTintBy:按……颜色渐变

CCFadeIn:从无到有,也叫淡入

CCFadeOut:从有到无,也叫淡出

CCFadeTo:改变不透明度到某个值

CCBlink:闪耀

CCDelayTime:延时


复杂的:

CCAnimate:帧动画,这个我们在第四节讲过,关于动画的问题不是一句两句就能说完,以后会慢慢展开

CCGridAction家族:网格动画

包装器:CCRepeat:重复执行几次、CCRepeatForever:永远执行、CCSequence:按序列执行、CCSpawn:同时执行、CCActionEase家族:补间动画

更详细的链接:http://4137613.blog.51cto.com/4127613/762768


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值