如何制作飞镖忍者(2) Cocos2d-x 2.1.2

本文基于《如何制作一个简单的游戏》系列,介绍如何在Cocos2d-x 2.1.2中为游戏添加旋转炮塔功能。通过修改代码,实现了根据触摸位置调整炮塔射击方向,并加入平滑旋转效果,详细步骤包括资源替换、计算射击角度、添加旋转动作等。提供源码和资源下载链接。

在第一篇《如何制作一个简单的游戏》基础上,增加旋转炮塔功能,原文《How To Make A Simple iPhone Game with Cocos2D 2.X Part 2》,在这里继续以Cocos2d-x进行实现。有关源码、资源等在文章下面给出了地址。

步骤如下:
1.使用上一篇的工程;
2.下载本游戏所需的资源,将资源放置"Resources"目录下:

删除旧的资源player.pngprojectile.png
3.在HelloWorldScene.cpp文件,ccTouchesEnded函数,修改创建子弹精灵:

CCSprite *projectile = CCSprite::create("projectile2.png");

4.编译运行,可以看到炮塔发射出了子弹,但是有一点奇怪,射击的时候,炮塔并没有朝向那个方向,如下图所示:


5.接下去,就是让炮塔可以旋转射击。在HelloWorldScene.h文件中,添加如下代码:

   CCSprite* player;
    void finishShoot(CCNode* node,void *sender);
    CCPoint actualPoint;
    float realMoveDuration;
    void update(float delta);
修改 HelloWorldScene.cpp 文件中的 init 函数,如下:

player = CCSprite::create("player2.png");
6.计算炮塔旋转的角度。看下面图:


数学的知识就是,tan(angle) = 对边 / 邻边,利用反正切angle = arctan(对边 / 邻边),这时计算出的是弧度,用CC_RADIANS_TO_DEGREES宏转换成角度。另外在数学中,逆时针为正,在Cocos2D-x中,顺时针为正,就如下图所示:

需要将最后计算出的角度乘以-1。在ccTouchesEnded函数里,添加如下代码在projectile精灵runAction之前:

   //计算旋转角度的公式如下:
    // CCPoint normalized = ccpNormalize(ccp(目标点或触摸点的X轴坐标 - 需要转角的精灵的x轴坐标, 目标点或触摸点的Y轴坐标 - 需要转角的精灵的Y轴坐标);
    //目标点和当前人物的标准化坐标点
    CCPoint normalized = ccpNormalize(ccp(location.x - _player->getPosition().x, location.y - _player->getPosition().y));
    //计算弧度的方法
    float angleRadians = atan2(normalized.y, -normalized.x);
    //精灵转的角度  后面的加180 主要是根据初始图片的角度得到的,最简单的方法是试试如下4个数0、90、180、270,就能解决问题。
    _player->setRotation(CC_RADIANS_TO_DEGREES(angleRadians) + 180);
7.编译运行,这时就可以看到炮塔旋转射击了。如下图所示:


8.旋转再射击。炮塔的旋转是瞬间完成的,这不符合现实,需要让它有个动作移动炮塔的方向。在HelloWorldScene.h文件中,添加如下声明:

修改ccTouchesEnded函数,并且添加finishShoot方法代码如下:

 //计算子弹发射的速度
    float offRealX = actualX - projectile->getPosition().x;
    float offRealY = actualY - projectile->getPosition().y;
    float length = sqrtf(offRealX * offRealX + offRealY * offRealY);
    float velocity = 480 / 1;
    realMoveDuration = length / velocity;
    
    
    
    //计算转角的速度
    
    CCPoint normalized = ccpNormalize(ccpSub(player->getPosition(),touchLocation ));
    float angleRadians = atan2(normalized.y, -normalized.x);
    float angleDegrees =  CC_RADIANS_TO_DEGREES(angleRadians) ;
    float degreesDiff = player->getRotation()  - angleDegrees;
    float rotateDuration = fabs(degreesDiff / 360);
    CCLOG("%f",angleDegrees);
    //子弹的目标点。
     actualPoint = ccp(actualX, actualY);
    
    
    CCCallFuncND* callND = CCCallFuncND::create(this, callfuncND_selector(HelloWorld::finishShoot), (void*)projectile);
    
    player->runAction(CCSequence::create(CCRotateTo::create(rotateDuration, angleDegrees),callND,NULL));

void HelloWorld::finishShoot(CCNode* node,void *sender)
{
    CCSprite* bullet = (CCSprite*)sender;
    bullet->getPosition();
    CCMoveTo* moveTo = CCMoveTo::create(realMoveDuration, actualPoint);
    bullet->runAction(moveTo);
}
在函数开头检验 projectile 变量,如果非空表示炮塔正在旋转中。不把projectile立即加到场景中,等待旋转完毕再加入场景。炮塔旋转的速度,为半秒钟旋转半个圆,计算所旋转角度所需的时间。

9.编译运行,可以看到炮塔可以在旋转后进行射击了,如下图所示:


参考资料:
1.How To Make A Simple iPhone Game with Cocos2D 2.X Part 2http://www.raywenderlich.com/25791/rotating-turrets-how-to-make-a-simple-iphone-game-with-cocos2d-2-x-part-2
2.(译)如何使用cocos2d开发一个简单的iphone游戏:旋转炮塔。(第二部分)http://www.cnblogs.com/zilongshanren/archive/2011/03/28/1997820.html

非常感谢以上资料,本例子源代码附加资源下载地址http://download.csdn.net/detail/akof1314/4878521


iOS版下载地址:  http://vdisk.weibo.com/s/EWRvH

新版加注释iOS代码下载  http://vdisk.weibo.com/s/BDn59yfnBUMLW  


如文章存在错误之处,欢迎指出,以便改正。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杜甲同学

感谢打赏,我会继续努力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值