在第一篇《如何制作一个简单的游戏》基础上,增加旋转炮塔功能,原文《How To Make A Simple iPhone Game with Cocos2D 2.X Part 2》,在这里继续以Cocos2d-x进行实现。有关源码、资源等在文章下面给出了地址。
步骤如下:
1.使用上一篇的工程;
2.下载本游戏所需的资源,将资源放置"Resources"目录下:

删除旧的资源player.png和projectile.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
如文章存在错误之处,欢迎指出,以便改正。
本文基于《如何制作一个简单的游戏》系列,介绍如何在Cocos2d-x 2.1.2中为游戏添加旋转炮塔功能。通过修改代码,实现了根据触摸位置调整炮塔射击方向,并加入平滑旋转效果,详细步骤包括资源替换、计算射击角度、添加旋转动作等。提供源码和资源下载链接。
2万+

被折叠的 条评论
为什么被折叠?



