`
dongk
  • 浏览: 3190 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
最近访客 更多访客>>
社区版块
存档分类
最新评论

How to make a cocos2d-x simple game(第二部分)

阅读更多
该文是接续cocos2d-x.org网站上的 Tutorials:How to make a cocos2d-x simple game

基本照搬子山龙王翻译的文章(译)如何使用cocos2d开发一个简单的iphone游戏:旋转炮塔。(第二部分),把其中Object-c代码修改为c++代码。


1.准备工作:

阅读cocos2d-x.org网站上的Tutorials,生成的代码可在此下载

接下来,下载新的 player sprite 和 projectile sprite图片,然后把它们加到工程Resource文件夹里面。

然后,修改代码,把每个sprite添加进去。
HelloWorldScene.cpp的init方法中:
CCSprite *player = CCSprite::spriteWithFile("Player2.png");


HelloWorldScene.cpp的ccTouchesEnded方法中:
CCSprite *projectile = CCSprite::spriteWithFile("Projectile2.png");


注意,这一次我们并没有指定精灵的宽度和高度,而是让cocos2d替我们来处理这些事情。

编译并运行你的工程,如果一切顺利的话,你将会看到一个炮塔正在发射子弹。然后,这并不是很好,因为炮塔在射击的时候并没有面朝那个方向。因此,接下来让我们来解决这个问题。

2.旋转并射击

在我们旋转炮塔之前,首先,我们需要保存Player精灵的引用,以便后面旋转它的时候使用。打开HelloWorldScene.h,然后修改类文件并包含以下成员变量:
CCSprite *_player;


然后修改init方法中的代码,把Player对象加入到层(layer)中。代码如下:
//the new add player code
_player = CCSprite::spriteWithFile("Player2.png");
_player->setPosition( ccp(_player->getContentSize().width/2, winSize.height/2) );
this->addChild(_player);
//注释掉原来的添加player代码
//CCSprite *player = CCSprite::spriteWithFile("Player2.png");
//player->setPosition( ccp(player->getContentSize().width/2, winSize.height/2) );
//this->addChild(player);


好了,现在让我们取出player对象的引用并且旋转它吧!为了旋转它,我们首先需要计算出旋转的角度。为了解决这个问题,想想我们在高中时候学过的三角代数吧。还记得sin cos tan吗?为了便于理解,下面使用一张图来解释一下:tan = 对面/邻边。

如上所示,我们想要旋转的角度是arctangent(angle),即对offY/offX求arctangent运算。

然而,这里还有两件事情,我们需要放在心上。首先,当我们计算actangent(offY/offX)的时候,这个结果是弧度,但是cocos2d使用的却是角度。还好,cocosd2d提供了一个非常方便的宏,可以使得角度和弧度之间方便转化。

第二点,我们假定上面的图中angle的偏转是正20度,但是,cocos2d里面顺时针方向为正(而不是上图所示的逆时针为正)。让我们看到下面这个图:

因此,为了得到正确的方向,我们把运算结果乘以一个-1就可以了。比如,如果我们把上面那幅图片里的角度乘以-1的话,我们就得够得到-20度,这个角度其实就是逆时针方向的20度。(感觉老外说话好啰嗦啊,聪明的读者恐怕早就明白了吧!:)

好了,讲得够多了!让我们来写一点代码吧。在ccTouchesEnded里面加入以下代码,添加位置在你的projectile->runAction之前。
//Determine angle to face
float angleRadians = atanf((float)offRealY/(float)offRealX);
float angleDegrees = CC_RADIANS_TO_DEGREES(angleRadians);
float cocosAngle =-1* angleDegrees;
_player->setRotation(cocosAngle);

编译并运行工程,现在我们的炮塔在射击的时候可以改变方向了。

3.旋转之后再射击

目前来说还不错,但是有一点点怪。因为,这个炮塔好像突然一下跳到一个方向射击,有点不够流畅。我们可以解决这个问题,但是在这之前,我们需要重构一下代码。

首先,打开HelloWorldScene.h,然后在你的类里添加如下成员变量:

CCSprite *_nextProjectile;


然后,修改你的ccTouchesEnded方法,并且添加一个新的方法,叫做finishShoot,如下所示:

	if (_nextProjectile !=NULL){
		return;
	}

	// Choose one of the touches to work with
	CCTouch* touch = (CCTouch*)(touches->anyObject());
	CCPoint location = touch->locationInView();
	location = CCDirector::sharedDirector()->convertToGL(location);
	if(location.x <= 20) return;

	// Set up initial location of projectile
	CCSize winSize = CCDirector::sharedDirector()->getWinSize();
	_nextProjectile = CCSprite::spriteWithFile("Projectile2.png");
	_nextProjectile->retain();
	_nextProjectile->setPosition(ccp(20,winSize.height/2));

	// Determinie offset of location to projectile
	int offX = location.x - _nextProjectile->getPosition().x;
	int offY = location.y - _nextProjectile->getPosition().y;

	// Bail out if we are shooting down or backwards
	if(offX<0)
	{
		return;
	}

	// Ok to add now - we've double checked position
	//this->addChild(_nextProjectile);
	// Determine where we wish to shoot the projectile to
	int realX = winSize.width + (_nextProjectile->getContentSize().width/2);
	float ratio = (float)offY / (float)offX;
	int realY = (realX * ratio) + _nextProjectile->getPosition().y;
	CCPoint realDest = ccp(realX, realY);

	// Determine the length of how far we're shooting
	int offRealX = realX - _nextProjectile->getPosition().x;
    int offRealY = realY - _nextProjectile->getPosition().y;
    float length = sqrtf((offRealX * offRealX) + (offRealY*offRealY));
	float velocity = 480/1; // 480pixels/1sec
	float realMoveDuration = length/velocity;

	//Determine angle to face
	float angleRadians = atanf((float)offRealY/(float)offRealX);
	float angleDegrees = CC_RADIANS_TO_DEGREES(angleRadians);
	float cocosAngle =-1* angleDegrees;
	float rotateSpeed =0.5/ M_PI; // Would take 0.5 seconds to rotate 0.5 radians, or half a circle
	float rotateDuration = fabs(angleRadians * rotateSpeed); 
	_player->runAction(CCSequence::actions(CCRotateTo::actionWithDuration((ccTime)rotateDuration,cocosAngle),
										   CCCallFunc::actionWithTarget(this,callfunc_selector(HelloWorld::finishShoot)),
										   NULL
										   ));
	//_player->setRotation(cocosAngle);

	_nextProjectile->runAction( CCSequence::actions(CCMoveTo::actionWithDuration(realMoveDuration, realDest),
												CCCallFuncN::actionWithTarget(this, callfuncN_selector(HelloWorld::spriteMoveFinished)), 
												NULL) );
	// Add to projectiles array
	_nextProjectile->setTag(2);
	//_projectiles->addObject(_nextProjectile);  


void HelloWorld::finishShoot() {

// Ok to add now - we've finished rotation!
this->addChild(_nextProjectile);
_projectiles->addObject(_nextProjectile);

// Release
_nextProjectile->release();
_nextProjectile = NULL;

}


这看上去好像有许多代码,但是,实际上我们改动的并不多--大部分只是做一些小小的重构。下面是我们所修改的内容的一个列表:
  1.在函数开头检查nextProjectile的值是否为nil。这意味着我们当前的touch事件正发生在射击过程之中。也就是说,炮塔已经发射出一个子弹了。
  2.之前,我们使用一个projectile的局部变量,并把它加入到了当前的场景中。在这个版本中,我们增加了一个nextProjectile的成员变量,但是并没有马上加到当前场景中。因为后要还要使用。
  3.定义炮塔旋转的角度,半秒钟旋转半个圆。记住,一个圆有2 PI个弧度。
  4.计算旋转特定的角度需要多长时间,这里是拿弧度乘以速度。
  5.接下来,我们使用一个sequence action来旋转我们的炮塔。最后,调用一个函数,把projectile加入到当前场景当中去。
  好,大功告成!编译并运行工程,现在炮塔可以旋转,并且很流畅地射击了!

全部代码下载:simpleGame2.zip
分享到:
评论

相关推荐

    Cocos2d-x实战:JS卷——Cocos2d-JS开发

    资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用...基础篇包括第2章~第8章,Cocos2d- 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    Cocos2d-x实战:C++卷(2版)源代码

    在Cocos2d-x中,C++作为主要的编程语言,相比初版,第二版可能涵盖了更多Cocos2d-x的新特性和优化。C++的使用可以提供更好的性能和更直接的内存管理,同时也能充分利用面向对象编程的特性来构建复杂的游戏逻辑。 源...

    Cocos2d-x 3.x游戏开发实战pdf含目录

    Cocos2d-x 是一个开源的、跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多平台的游戏开发。3.x版本是其发展中的一个重要阶段,引入了多项优化和新特性,旨在提高开发效率和性能。 本书首先会介绍...

    经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip

    12. **扩展性**:cocos2d-x提供了插件系统和扩展API,方便开发者添加自定义功能和第三方库。 在学习和使用cocos2d-x 3.8时,开发者需要注意与最新版本的差异,例如API的变化、新功能的缺失等。同时,由于3.8是旧...

    cocos2d-x API中文文档

    【cocos2d-x API中文文档】是一份详尽的资料,主要涵盖了cocos2d-x游戏引擎的API,这份文档适用于2015年的最新版本。cocos2d-x是一个基于MIT许可证的开源游戏引擎,它以快速、简单且功能强大的特性闻名,允许开发者...

    cocos2d-x windows vs2010配置

    接下来,把 F:\cocos2d-1.0.1-x-0.9.1\cocos2dx 和 F:\cocos2d-1.0.1-x-0.9.1\CocosDenshion 这两个文件夹里面的全部内容拷贝一份到 D:\cocos2d-xProjects\HelloWorld 中去。 九、设置静态链接库 接下来,打开 F:\...

    cocos2d-x-3.1.zip

    Cocos2d-x是一个开源的游戏开发框架,广泛用于2D游戏、实时渲染应用程序和其他互动内容的制作。这个压缩包“cocos2d-x-3.1.zip”包含了Cocos2d-x框架的3.1版本,这是一个经典且相对旧的版本,可能对于那些寻找历史...

    cocos2d-x--simple-Game.rar_cocos2d_cocos2d-x

    在IT领域,游戏开发是极具吸引力的一环,而cocos2d-x作为一个开源的游戏引擎,为开发者提供了强大的工具来创建跨平台的2D游戏。本篇文章将深入探讨如何使用cocos2d-x实现一个简单的小游戏,适合初学者入门学习。 ...

    Cocos2d-x实战C++卷关东升著完整版pdf

    Cocos2d-x是一个开源的、跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多个操作系统。本书以C++语言为主要编程工具,详细介绍了如何利用Cocos2d-x进行游戏开发。 首先,Cocos2d-x的基础知识是必须...

    cocos2d-x_v3.16安装及环境变量配置文档

    cocos2d-x 是一个开源的游戏开发框架,使用 C++ 语言编写,支持多平台发布,包括 iOS、Android、Windows、macOS、Linux 和 Web。cocos2d-x v3.16 是该框架的一个版本号,本文档主要介绍了该版本的安装流程以及环境...

    cocos2d-x-3.13.1 spine3.6.zip

    《Cocos2d-x 3.13.1与Spine 3.6集成详解》 Cocos2d-x是一个广泛使用的开源游戏开发框架,它基于C++,同时支持Lua和JavaScript等多种脚本语言,为开发者提供了高效、跨平台的游戏开发解决方案。在3.13.1版本中,...

    cocos2d-x-cocos2d-x-2.2.2.zip

    这个压缩包“cocos2d-x-cocos2d-x-2.2.2.zip”包含了cocos2d-x 的2.2.2版本,该版本是cocos2d-x发展中的一个重要里程碑,它提供了许多改进和优化,使得开发者能够更加高效地创建2D游戏和应用。 在cocos2d-x 2.2.2中...

    Cocos2d-x实战_Lua卷 _第2版

    《Cocos2d-x实战_Lua卷_第2版》是一本专为游戏开发者准备的指南,主要聚焦于使用Cocos2d-x框架与Lua语言进行游戏开发。Cocos2d-x是一个开源的游戏开发框架,它允许开发者用C++、Lua或者JavaScript编写游戏,并且可以...

    cocos2d-x 动画工具 Flash2Cocos2d-x 1.3

    《cocos2d-x 动画工具 Flash2Cocos2d-x 1.3:将Flash创意带入移动游戏开发》 在移动游戏开发领域,cocos2d-x是一款广泛使用的开源游戏引擎,以其高效、跨平台的特性深受开发者喜爱。而Flash2Cocos2d-x则是一个专为...

    cocos2d-x 3.0

    《cocos2d-x 3.0:游戏开发中的角色移动技术详解》 在游戏开发领域,cocos2d-x是一款广泛使用的开源2D游戏引擎,尤其在移动平台上的应用非常广泛。cocos2d-x 3.0版本带来了许多性能优化和新特性,使得开发者能够更...

    Cocos2d-x实战 JS卷 Cocos2d-JS开发

    《Cocos2d-x实战 JS卷 Cocos2d-JS开发》是一本深入探讨Cocos2d-x游戏引擎JavaScript版本使用的专业书籍。Cocos2d-x是全球范围内广泛采用的游戏开发框架,尤其适用于2D游戏的制作,而Cocos2d-JS则是其JavaScript接口...

    cocos2d-x 案例开发大全 第二章(源码)

    《cocos2d-x案例开发大全》第二章的源码主要涵盖了使用cocos2d-x进行游戏开发的各种实践技巧和示例。cocos2d-x是一个开源的游戏开发框架,基于C++,支持跨平台,包括iOS、Android、Windows等多个操作系统。本章的...

    cocos引擎老版本集合(cocos2d-x-2.2.1 - 3.5).zip

    cocos引擎老版本下载集合(cocos2d-x-2.2.1 - 3.5),分别有cocos2d-x-3.5、cocos2d-x-3.4、cocos2d-x-3.2、cocos2d-x-2.2.6、cocos2d-x-2.2.2和cocos2d-x-2.2.1。

Global site tag (gtag.js) - Google Analytics