您的位置:首页 > 移动开发 > Cocos引擎

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

2013-08-27 23:04 369 查看
      游戏中一般需要在游戏循环的每帧中控制渲染和逻辑。在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息