GVKun编程网logo

cocos2d-x v3.3 RotateTo and RotateBy(windows)

16

这篇文章主要围绕cocos2d-xv3.3RotateToandRotateBy(windows)展开,旨在为您提供一份详细的参考资料。我们将全面介绍cocos2d-xv3.3RotateToandR

这篇文章主要围绕cocos2d-x v3.3 RotateTo and RotateBy(windows)展开,旨在为您提供一份详细的参考资料。我们将全面介绍cocos2d-x v3.3 RotateTo and RotateBy(windows),同时也会为您带来Cocos2d-html5之RotateTo&RotateBy、Cocos2d-x + Android + Eclipse + Windows 8、Cocos2d-x +Android + Windows 7、Cocos2d-x 3.0 Windows下Android环境搭建的实用方法。

本文目录一览:

cocos2d-x v3.3 RotateTo and RotateBy(windows)

cocos2d-x v3.3 RotateTo and RotateBy(windows)

Rotateto和RotateBy可以使精灵旋转,区别在与Rotateto是旋转到指定的角度;而RotateBy是从当前角度旋转指定的角度。举个例子,假定精灵当前的角度是x,分别给Rotateto和RotateBy指定一个角度y,那么Rotateto和RotateBy最终的效果分别如下:

Rotateto:x → y

RotateBy:x → (x + y)

Rotateto和RotateBy各属一类,它们的继承关系如下:

接下来看每个类有什么接口,并结合实例说明。

RotateBy:

1、成员变量:

protected:
bool _is3D; // false: 使用带角度的3D旋转方式;true: 使用真正的3D旋转方式。
Vec3 _dstAngle; // 目标角度。
Vec3 _startAngle; // 起始角度。
Vec3 _diffAngle; // 目标角度与起始角度之差。

private:
CC_disALLOW_copY_AND_ASSIGN(Rotateto); // 禁用拷贝构造函数和拷贝赋值操作符。

2、成员方法:

(1) static RotateBy* create(float duration,float deltaAngle);
static RotateBy* create(float duration,float deltaAngleZ_X,float deltaAngleZ_Y);
static RotateBy* create(float duration,const Vec3& deltaAngle3D);

使用create()创建一个RotateBy动作。第一个函数实现平面旋转,正的角度顺时针旋转,负的角度逆时针旋转;第二个函数实现带角度的3D旋转;第三个函数实现真正的3D旋转。

关于第二个和第三个函数,正负旋转角度对应的旋转效果不太好描述,各位试一下就明了了。但要注意一点,这两个函数指定的围绕哪个轴旋转指的是精灵本身的坐标轴,而非世界或者说是屏幕的坐标轴。

例如,将精灵初始角度设为100°,此时调用第二个create()让精灵沿X轴旋转,看看效果。

duration:动作持续时间。

deltaAngle:需要旋转的角度。

deltaAngleZ_X:X轴需要旋转的角度。

deltaAngleZ_Y:Y轴需要旋转的角度。

deltaAngle3D:需要旋转的3D角度。

实例:

// 用10秒的时间,顺时针平面旋转360°。

auto myRotateBy = RotateBy::create(10,360);

// 用10秒的时间,X轴带角度的旋转360°。

// 当X轴和Y轴均设置为360时,和上面的例子效果相同。

auto myRotateBy = RotateBy::create(10,360,0);

// 用10秒的时间,围绕X轴3D旋转360°。

auto myRotateBy = RotateBy::create(10,Vec3(360,0));

RotateBy只是创建了一个动作,要向让精灵真正的转起来,可参考如下代码:

auto mySprite = Sprite::create("mysprite.png");

mySprite->setPosition(Vec2(100,100));

this->addChild(mySprite);

mySprite->runAction(RotateBy::create(10,360));

mysprite.png放在工程的Resources目录下。

实现源码:

// 平面旋转。

RotateBy* RotateBy::create(float duration,float deltaAngle)
{
RotateBy *rotateBy = new (std::nothrow) RotateBy(); // 创建RotateBy对象。
rotateBy->initWithDuration(duration,deltaAngle); // 调用内部函数,见下。
rotateBy->autorelease(); // 让该对象在不使用时自动释放。

return rotateBy;
}

bool RotateBy::initWithDuration(float duration,float deltaAngle)
{
if (ActionInterval::initWithDuration(duration)) // 动画的持续时间是由其父类负责的。
{
_deltaAngle.x = _deltaAngle.y = deltaAngle; // X轴和Y轴旋转相同的角度。
return true;
}

return false;
}

// 带角度的3D旋转。

RotateBy* RotateBy::create(float duration,float deltaAngleX,float deltaAngleY)
{
RotateBy *rotateBy = new (std::nothrow) RotateBy();
rotateBy->initWithDuration(duration,deltaAngleX,deltaAngleY);
rotateBy->autorelease();
return rotateBy;
}

bool RotateBy::initWithDuration(float duration,float deltaAngleY)
{
if (ActionInterval::initWithDuration(duration))
{

/* X轴和Y轴可以旋转不同的角度。

! 这里有一个疑问,见下面的疑问部分。

*/
_deltaAngle.x = deltaAngleX;
_deltaAngle.y = deltaAngleY;
return true;
}
return false;
}

// 真正的3D旋转。

RotateBy* RotateBy::create(float duration,const Vec3& deltaAngle3D)
{
RotateBy *rotateBy = new (std::nothrow) RotateBy();
rotateBy->initWithDuration(duration,deltaAngle3D);
rotateBy->autorelease();

return rotateBy;
}

bool RotateBy::initWithDuration(float duration,const Vec3& deltaAngle3D)
{
if (ActionInterval::initWithDuration(duration))
{
_deltaAngle = deltaAngle3D; // 3D旋转角度,其中包括X,Y和Z轴需要旋转的角度。
_is3D = true; // 设置RotateBy::_is3D,之后update()中根据该变量判断3D还是2D旋转。
return true;
}

return false;
}

关键点总结:

♂ 通过向RotateBy::create()传递不同种类的旋转坐标,可以实现2D旋转,带角度的3D旋转以及真正的3D旋转。函数可以设置旋转动作的持续时间,旋转角度的正负控制旋转方向。

♂ 让精灵围绕X,Y,Z轴旋转,并不是指的世界或是屏幕的坐标轴,而是精灵本身的坐标轴。

♂ RotateBy并没有具体实现运动的过程,它只相当于一个配置。并且配置还进行了细化,其父类负责动画的持续时间,而RotateBy只负责旋转的坐标。

♂ 个人觉得

bool RotateBy::initWithDuration(float duration,float deltaAngle)和

bool RotateBy::initWithDuration(float duration,float deltaAngleY)

可以合并,均使用第二个。2D旋转调用initWithDuration()时传递的deltaAngleX和deltaAngleY相同即可,就像下面RotateBy::clone()中做的那样。

疑问:

auto myRotateBy1 = RotateBy::create(3,0);
auto myRotateBy2 = RotateBy::create(3,0));

mySprite->runAction(Sequence::create(myRotateBy1,myRotateBy2,nullptr));

以上代码的意图是想让精灵以带角度的2D旋转方式围绕X轴旋转360°后,再以真正的3D旋转方式围绕X轴旋转360°。但以上代码编译执行后会报错:

看提示是在判断X轴和Y轴的旋转角度必须相同的时候报错了。myRotateBy1和myRotateBy2单独执行或者两个动作顺序倒过来执行都不会报错,看来是由于myRotateBy1在create()的时候设置的X轴和Y轴的旋转角度不同导致的,这也可以联想到CCActionInterval.h的388行对于这种create()的一个warning:/** @warning The physics body contained in Node doesn't support rotate with different x and y angle. */。查了查资料,猜测是所使用的物理引擎不支持导致的,但具体原因说不明,望高手赐教。

(2) virtual RotateBy* clone() const override;

使用该函数克隆一个RotateBy动作。

实例:

auto myRotateBy = RotateBy::create(1,360);

auto myRotateByClone = myRotateBy->clone();

实现源码:

RotateBy* RotateBy::clone() const
{
// no copy constructor
auto a = new (std::nothrow) RotateBy();
if(_is3D)
a->initWithDuration(_duration,_deltaAngle);
else
a->initWithDuration(_duration,_deltaAngle.x,_deltaAngle.y);
a->autorelease();
return a;
}

因为之前的动作明确定义了_is3D,这里相当于将3个create()汇总。

(3) virtual RotateBy* reverse(void) const override;

使用该函数创建一个与原先RotateBy相反的RotateBy动作。

实例:

auto myRotateBy = RotateBy::create(1,360);

auto myRotateByReverse = myRotateBy->reverse();

实现源码:

RotateBy* RotateBy::reverse() const
{
if(_is3D) // 真3D旋转,X,Y,Z轴均取反。
{
Vec3 v;

// Vec3.inl中重载了减号运算符,

// 为什么不直接return RotateBy::create(_duration,-_deltaAngle);?
v.x = - _deltaAngle.x;
v.y = - _deltaAngle.y;
v.z = - _deltaAngle.z;
return RotateBy::create(_duration,v);
}
else // 2D旋转或者带角度的3D旋转,X,Y轴取反。
{
return RotateBy::create(_duration,-_deltaAngle.x,-_deltaAngle.y);
}
}

关键点总结:

♂ 源码实现部分可以更加简洁,真3D旋转中直接return RotateBy::create(_duration,–_deltaAngle);

(4) virtual void startWithTarget(Node *target) override;
virtual void update(float time) override;

这两个函数是cocos2d-x引擎内部调用的。稍微具体一点,startWithTarget()是在runAction()内部调用,用于将精灵(Sprite)和该精灵所要执行的动作(MoveBy)绑定起来;而update()是在MoveBy的step()方法中(继承自ActionInterval)调用的,用于不停地更新精灵的位置(使用setRotation3D()或setRotationSkewX()、setRotationSkewY())。

target:待与动作绑定的精灵。

time:流逝的时间。这里传进来的时间是以秒为单位,但注意形参的类型是float,所以传进来的时间有可能是毫秒,微秒。

实例:

无。

实现源码:

void RotateBy::startWithTarget(Node *target)
{
ActionInterval::startWithTarget(target); // 父类将精灵与动作的其余相关信息绑定。

// 根据旋转方式的不同,通过不同接口获取精灵的当前角度作为旋转的起始角度。
if(_is3D)
{
_startAngle = target->getRotation3D();
}
else
{
_startAngle.x = target->getRotationSkewX();
_startAngle.y = target->getRotationSkewY();
}
}

void RotateBy::update(float time)
{
// FIXME: shall I add % 360
if (_target) // 这个是RotateBy父类Action的成员变量,实际上就代表待移动的精灵。
{
if(_is3D) // 真3D旋转。
{
Vec3 v;

// Vec3.inl中封装了operator*和operator+,

// 为何不直接_target->setRotation3D(_startAngle + _deltaAngle * time);?
v.x = _startAngle.x + _deltaAngle.x * time;
v.y = _startAngle.y + _deltaAngle.y * time;
v.z = _startAngle.z + _deltaAngle.z * time;
_target->setRotation3D(v);
}
else
{
#if CC_USE_PHYSICS // 是否使用物理引擎。

// 2D旋转,精灵的X轴与Y轴的角度始终相等。
if (_startAngle.x == _startAngle.y && _deltaAngle.x == _deltaAngle.y)
{
_target->setRotation(_startAngle.x + _deltaAngle.x * time);
}
else // 带角度的3D旋转。
{
// _startAngle.x != _startAngle.y || _deltaAngle.x != _deltaAngle.y
if (_target->getPhysicsBody() != nullptr)
{
cclOG("RotateBy WARNING: PhysicsBody doesn't support skew rotation");
}
_target->setRotationSkewX(_startAngle.x + _deltaAngle.x * time);
_target->setRotationSkewY(_startAngle.y + _deltaAngle.y * time);
}
#else
_target->setRotationSkewX(_startAngle.x + _deltaAngle.x * time);
_target->setRotationSkewY(_startAngle.y + _deltaAngle.y * time);
#endif // CC_USE_PHYSICS
}
}
}

关键点总结:

♂ 2D旋转:getRotationSkewX()、getRotationSkewY()、setRotation()。精灵的X轴与Y轴的角度始终相等。

带角度的3D旋转:getRotationSkewX()、getRotationSkewY()、setRotationSkewX()、setRotationSkewY()。

真3D旋转:getRotation3D()、setRotation3D()。

♂ update()的真3D旋转部分可以使用重载的运算符使得代码更加简洁。

Rotateto:

Rotateto与RotateBy大部分内容均相同,下面只说明不同的部分。

1、成员变量:

protected:
Vec3 _dstAngle; // 目标角度。
Vec3 _diffAngle; // 目标角度与起始角度之间的差值。

2、成员方法:

(1) void calculateAngles(float &startAngle,float &diffAngle,float dstAngle);

使用该函数更新_startAngle,赋值_diffAngle。

该函数在Rotateto::startWithTarget()中被调用。

startAngle:起始角度。对应_startAngle.x,_startAngle.y,_startAngle.z。

diffAngle:目标角度与起始角度之间的差值。对应_diffAngle.x,_diffAngle.y,_diffAngle.z。

dstAngle:目标角度。对应_dstAngle.x,_dstAngle.y,_dstAngle.z。

实例:

无。

实现源码:

void Rotateto::calculateAngles(float &startAngle,float dstAngle)
{

// 将startAngle更新为对360.0°求余的角度。

// 比如startAngle传进来是721.7°,更新后为1.7°。
if (startAngle > 0)
{
startAngle = fmodf(startAngle,360.0f);
}
else
{
startAngle = fmodf(startAngle,-360.0f);
}

diffAngle = dstAngle - startAngle; // 得到目标角度与起始角度之间的差值。

// 这里这么设计可能是想遵循就近原则,但这么写有问题,不知是否算Bug,见下

// 185° → -175°;390° → 30°;从541°开始已不遵循就近原则;从720°开始有悖于原先设计,至少多转了一圈。
if (diffAngle > 180)
{
diffAngle -= 360;
}

// -185° → 175°;-390° → -30°;从-541°开始已不遵循就近原则;从-720°开始有悖于原先设计,至少多转了一圈。
if (diffAngle < -180)
{
diffAngle += 360;
}
}

关键点总结:

♂ 如上实现源码分析中总结,我觉得如果是想按照就近原则设计,那么dstAngle也应该进行fmodf()。

(2) virtual void startWithTarget(Node *target) override;
virtual void update(float time) override;

这两个函数与RotateBy中对应的函数大致相同,下面只说说有区别的部分。

void Rotateto::startWithTarget(Node *target)
{

……

// 更新_startAngle,更主要的是为了得到_diffAngle。
calculateAngles(_startAngle.x,_diffAngle.x,_dstAngle.x);
calculateAngles(_startAngle.y,_diffAngle.y,_dstAngle.y);
calculateAngles(_startAngle.z,_diffAngle.z,_dstAngle.z);
}

update()中_is3D部分就很简洁了,没有使用中间变量Vec3 v。其他与RotateBy::update()的区别只是所有_deltaAngle换成了_diffAngle。

Cocos2d-html5之RotateTo&RotateBy

Cocos2d-html5之RotateTo&RotateBy

Cocos2d-html5测试用版本:2.2.1。

Rotateto:将 cc.Node 对象旋转到一个特定的角度。

RotateBy:将 cc.Node 对象旋转一个特定的角度。

使用cc.Roateto.create(duration,deltaAngleX,deltaAngleY)和cc.RotateBy.create(duration,deltaAngleY)来创建动作。

duration
运动周期,单位为s。
deltaAngleX
水平旋转角度
deltaAngleY
垂直旋转角度,如果省略,则取deltaAngleX的值。

请看下列代码:

  1. var GameScene = cc.Scene.extend({
  2. enemy1: null, // 敌人1
  3. enemy2: null, // 敌人2
  4. enemy3:null, // 敌人3
  5. layer: null, // 布景
  6. winSize: null, // 游戏运行窗口尺寸
  7. onEnter: function () {
  8. this._super();
  9. this.initData();
  10. },
  11. initData: function () {
  12. // 获取尺寸
  13. this.winSize = cc.Director.getInstance().getWinSize();
  14. // 添加布景
  15. this.layer = cc.LayerColor.create(cc.c4(200,200,255),this.winSize.width,this.winSize.height);
  16. this.addChild(this.layer);
  17. // 创建动作
  18. var actionTo = cc.Rotateto.create(2,45,90);
  19. var actionBy = cc.RotateBy.create(2,180,360);
  20. var actionByBack = actionBy.reverse();
  21. // 添加敌人1
  22. this.enemy1 = cc.Sprite.create(s_enemy_1);
  23. this.enemy1.setPosition(cc.p(300,300));
  24. this.layer.addChild(this.enemy1);
  25. this.enemy1.runAction(actionTo);
  26. // 添加敌人2
  27. this.enemy2 = cc.Sprite.create(s_enemy_2);
  28. this.enemy2.setPosition(cc.p(100,100));
  29. this.layer.addChild(this.enemy2);
  30. this.enemy2.runAction(cc.Sequence.create(actionBy,actionByBack));
  31. // 添加敌人3
  32. this.enemy3 = cc.Sprite.create(s_enemy_3);
  33. this.enemy3.setPosition(cc.p(200,200));
  34. this.layer.addChild(this.enemy3);
  35. this.enemy3.runAction(cc.RotateBy.create(2,90,120));
  36. }
  37. });

以下是运行结果截图:

Cocos2d-x + Android + Eclipse + Windows 8

Cocos2d-x + Android + Eclipse + Windows 8

琢磨着弄弄Cocos2d-x,配置下Cocos2d-x + Android + Eclipse + Windows 8的开发环境,过程比较心酸曲折,做个记录以备后用

我的基础环境

不做详述,不清楚查阅[Android开发环境搭建]的文档即可

- Windows8

- Eclipse Helios 3.6.2

- JDK1.6

- Android SDK/ADT

安装 Cocos2d-x

-cocos2d-2.1rc0-x-2.1.2.zip

- 这里下载更新的版本

- 下载完成后,解压缩



安装 CDT

- Eclipse的C/C++插件,如不需要在Eclipse中编写C/C++代码可先不用安装

- CDT-7.0.2 for Helios

- 其他版本

- 这里需要注意的是,不同版本的Eclipse要安装不同版本的CDT插件;

我的Eclipse版本是Helios,则对应cdt-master-7.0.2.zip。

- 下载完成后解压缩;本地插件安装方法,在Eclipse根目录下新建links文件夹,

在links文件夹里新建cdt.link,里面的内容填写为:path= 你的CDT目录,例如:

Java代码
  • path=F:\\eclipse-plugins\\cdt-master-7.0.2
  • 再打开Eclipse,插件就已经装好了.

    安装 NDK

    -android-ndk-r8e-windows-x86.zip

    - 其他版本

    - 下载完成后,解压缩

    -配置NDK_ROOT环境变量(直接配置在WINDOWS环境变量中即可)

    右键计算机->属性->高级系统设置->高级->环境变量->在系统变量中新建

    变量名:NDK_ROOT

    变量值:你的NDK目录(例如F:\android\android-ndk-r8e)

    然后找到名为Path的系统变量,在句首添加%NDK_ROOT%;别忘记分号

    安装 Cgywin

    - 由于NDK开发大都涉及到C/C++在GCC环境下编译、运行,所以在Windows环境下,需要模拟Linux模拟编译环境

    - 下载setup.exe

    - 运行setup程序,直接点击Next进入下一步。

    - 选择安装方式,第一次可以采用Direct Connection在线下载安装,如有现成的离线包,可以选择离线安装(Install from Local Directory)。

    - 选择安装目录

    - 选择本地包存储目录(第三部所说,下次即可直接使用该本地包进行离线安装Cygwin)

    - 设置网络连接方式以及选择镜像站点地址

    - 选择安装项,在这里我们只选择当前需要的,点击列表中Devel,将后面的Default改为Install,下载

    - 下载完成后会自动安装到上文设置的安装目录。运行cygwin,在弹出的命令行窗口输入:cygcheck -c cygwin命令,会打印出当前cygwin的版本和运行状态,如果status是ok的话,则cygwin运行正常




    - 配置文件权限管理

    Cygwin一样模拟了Linux的权限管理体系,这也没有什么不好的,但是跟Microsoft Windows的默认权限管理却有些不对付。常会出现权限问题,一个文件可以手动改,但如果是多个文件就比较麻烦了,我这里采用彻底的解决方法是,在安装好Cygwin以后,禁止Cygwin采用POSIX体系的权限管理。使用文本编辑器打开 Cygwin目录\etc\fstab,末尾添加如下行:

    Java代码
  • none/cygdrivebinary,user,noacl,posix=000
  • 创建 Android 项目

    - 进入cocos2d-x目录,右键点击create-android-project.bat,编辑,更改批处理里的参数;

    - 将_CYGBIN设置为cycgwin\bin安装的的绝对路径(例:F:\Cygwin\bin)

    - 将_ANDROIDTOOLS设置为android sdk/tools绝对路径(例:F:\android\android-sdk-windows\tools)

    - 将_NDKROOT设置为android ndk的绝对路径(例:F:\android\android-ndk-r8e)

    - 修改完毕,保存后,双击create-android-project.bat开始工程创建向导

    - 首先是输入包名(建议按照android的命名规则),如org.yourname.test

    - 然后输入工程名称(注意不要输入已有的文件夹的名字,如果同名,会被覆盖掉的)如TestCocos2dx

    - 选择target id,他会列出不同API方案用ID来标识,根据你的需要选择

    - 创建完成(如果创建过程中遇到权限错误,请确认上述Cygwin文件权限管理是否配置过了)

    - 查看cocos2d-x的目录下,则多了一个文件夹,文件夹名则为你刚刚输入的工程名称TestCocos2dx

    进去看到三个文件夹:

    Classes 存放默认工程的C++文件

    proj.androidandroid的eclipse工程项目

    Resources资源文件

    - 编译刚创建的TestCocos2dx项目

    打开cygwin,进入到TestCocos2dx/proj.android下,输入 ./build_native.sh 开始编译,如下图


    关于build_native.sh,进去查看即可知道,这是一个检查NDK_ROOT变量,拷贝资源文件,然后编译的一个脚本。

    将项目导入Eclipse;File->Import->Android->Existing Android Code Into Workspace

    Root Directory 选择刚刚创建的TestCocos2dx项目下的proj.android,如下图

    导入后,出现一个错误:The import org.cocos2dx.lib cannot be resolved

    那我们将设置一下cocos2d-x的引用即可

    右键项目->build path->link source->browse->选择地址

    F:\android\cocos2d\cocos2d-2.1rc0-x-2.1.2\cocos2dx\platform\android\java\src

    Folder name 填写为一个不与src冲突的名称,如cocos2dx-src 即可,然后finish

    现在项目就可以正常跑起来了,连上真机,Run as Android Application

    需要注意的是模拟器不支持opengl es2.0,所以用模拟器跑是有问题的。

    运行结果如下图:

    关于脱离Cygwin,配置Eclipse自动编译的补充

    还是以上述项目来说;

    在Eclipse里,右键项目->properties->builders->new->program->ok


    main面板下->location->browse file system->选择你的NDK目录下的ndk-build.cmd

    main面板下->working directory->browse workspace..->选择当前项目


    refresh面板下的specific resource选择为当前目录下的jni文件夹,如下图


    environment面板下->new...->如下所示

    value处填写

    cocos2d-x的根目录+分号+cocos2d-x的根目录/cocos2dx/platform/third_party/android/prebuilt


    或者

    在当前项目的jni文件夹下,编辑Application.mk 末行添加(更改为你自己的路径)

    Java代码
  • NDK_MODULE_PATH:=f:/android/cocos2d/cocos2d-2.1rc0-x-2.1.2;f:/android/cocos2d/cocos2d-2.1rc0-x-2.1.2/cocos2dx/platform/third_party/android/prebuilt
  • 以上两种方法任选其一;

    需要注意的是:路径里不能含空格符,这里windows是以分号做分隔符,linux是以冒号做分隔符

    Build Options面板下,Specify Resouces..选择当前项目的jni文件夹,其他配置如下图:


    最后,OK,配置好后,Project->Clean,则会开始自动编译,控制台显示信息如下:


    如果遇到AssetManager.a的错误,清空obj文件夹里的内容即可。

    Cocos2d-x +Android + Windows 7

    Cocos2d-x +Android + Windows 7

    折腾了一天,看了好些人写的配置,但是似乎没有一个能解决所有问题。这里记录下我的安装配置过程、遇到的问题以及解决方法。

    1. 安装Java JDK和Eclipse IDE

    基本的Java编程环境安装,具体参考这里。

    2. 安装Android SDK

    安装路径不要包含空格!

    安装成功后Eclipse界面会多出上面标记的三个按钮,点击第一个按钮选择需要安装的Android版本。

    3. 安装ADT(Android Development Tools)

    依次Eclipse >Help > Install New Software > Add, Name栏输入“ADT Plugin”, 地址栏输入“https://dl-ssl.google.com/android/eclipse/”,选择OK。然后选择Developer Tools安装

    配置ADT:依次Window > Preferences > Android,配置SDK的路径(第2步),例如“C:\Users\Andy\AppData\Local\Android\android-sdk”

    配置AVD(Android虚拟机):选择第一张图的第二个按钮,配置相关参数。点击Start可以查看效果。

    到这里就可以用Java进行Android开发了!但是我们的目标是用Cocos2d-x、C++开发,还得继续。

    4. 安装NDK

    NDK可以让Android程序的部分代码用C/C++实现,为后面安装Cocos2D-x做准备。将压缩包解压到一个不包括空格的路径即可。例如“E:\cocos2d-x\android-ndk-r8b”

    5. 安装Cygwin

    Cygwin在windows环境下模拟Linux编译环境,支持跨平台开发。具体可以参考这篇博客。

    6. 安装Cocos2d-x

    我选择的最新版本cocos2d-2.0-x-2.0.4,解压到不包含空格的路径,例如“E:\cocos2d-x\cocos2d-2.0-x-2.0.4”。

    打开“cocos2d-win32-vc2010.sln”编译,可以试一试运行demo有没有问题

    双击“install-templates-msvc.bat”可以生成VS 2010(2008)工程模板,方便创建win32工程。其实以后开发Android或者IOS应用的时候,底层都是用C++创建的Win32开发,只是最后发布到不同的平台时,有不同的配置和编译环境。例如例程MoonWarriors的目录结构为:

    Classes里面都是C++代码,项目的主体部分同时也是跨平台的部分。proj.win32就是用VS在Win32平台下开发相关的少量代码以及工程配置。而proj.android和proj.ios是生成的对应平台下的项目文件。NDK就参入了C++代码的编译以及生成可以在android平台下使用的库文件(libgame.so),可以想象proj.android里面少量的代码可能就是加载libgame.so让他运行在android平台上。下面是生成proj.android的相关配置。

    7. 创建Android工程。

    • 修改Cocos2D安装目录下的“create-android-project.bat”文件。将_CYGBIN、_ANDROIDTOOLS、_NDKROOT三个分别设置成Cygwin的bin目录(c:\cygwin\bin)、Android SDK的tools目录(C:\Users\Andy\AppData\Local\Android\android-sdk\tools)、NDK根目录(E:\cocos2d-x\android-ndk-r8b)。
    • 运行“create-android-project.bat”生成android工程,依次按要求输入,最终在Cocos2D的根目录下会产生所输入的项目名目录,例如“HelloWorld”。
    • 用Cygwin客户端进入HelloWorld下的proj.android目录,运行build_native.sh,如果提示没有定义NDK_ROOT的话,可以在Windows的环境变量里面设置(网上有人说这里需要的是linux环境下的变量,在windows里面定义没用,事实是可以,试了一些其他的方法都没有用,可能和我下载都是最新版本的包有关系)。没有错误的话,最后剩下的就是用Eclipse编译Java部分的代码
    • Eclipse > File > New > Project > Android Project From Existing Code,选择HelloWorld下的proj.android路径。然后选择项目,选择Run As > Android Application。
    • 如果有编译错误提示无法识别cocos2dx,可以Properties > Java Build path > Link Source,选择E:\cocos2d-x\cocos2d-2.0-x-2.0.4\cocos2dx\platform\android\java\src路径,Name不与src冲突即可。
    • 运行成功的话弹出HelloWorld界面。我在模拟器运行一直出错,后来发现是模拟器不支持gles2.0导致的,用真机没有问题。

    update: 用这篇博客(win7下把win32游戏移植到Android平台)的设置可以不用运行native_build直接全在eclipse里面编译

    可以开始Android游戏开发了,从这里开始。

    Cocos2d-x 3.0 Windows下Android环境搭建

    Cocos2d-x 3.0 Windows下Android环境搭建

    1. 配置JDK

    • JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html

    本人的系统是Win7 64位版,但安装的是JDK7,Windows X86版。

    假设安装目录在:C:\Program Files (x86)\Java\jdk1.7.0_21;当然也可以是其他地方

    • 设置环境变量:

    JAVA_HOME=C:\Program Files (x86)\Java\jdk1.7.0_21

    CLAsspATH=.;%JAVA_HOME%\lib;

    Path增加%JAVA_HOME%\bin;


    本文假设你知道怎么设置环境变量,如果不知道,请使用搜索引擎查找相关资料,设置完后打开cmd,输入java -version

    如果出现下面提示,表明环境变量设置成功:

    C:\Users\arlin>java -version

    java version "1.7.0_21"

    Java(TM) SE Runtime Environment (build 1.7.0_21-b11)

    Java HotSpot(TM) Client VM (build 23.21-b01,mixed mode,sharing)

    2. 下载Android SDK

    Google为Android开发者提供了ADT(Android Developer Tools),里面包含了SDK和Eclipse。

    下载地址是:http://developer.android.com/sdk/index.html

    可以选择32位或64位版本,我选择的是32位版的,把它解压到一个目录,我这里是:d:\adt-bundle-windows-x86\,目录结构如下:

    --<adt-bundle-windows-x86>

    --<eclipse>

    --<sdk>

    --SDK Manager.exe

    3. 下载Android NDK

    下载地址是:http://developer.android.com/tools/sdk/ndk/index.html

    同样有32位和64位版可选,我选择的是32位版的,把它解压到adt同目录下,现在adt的目录结构如下:

    --<android-ndk-r8e>

    --SDK Manager.exe

    4. 下载ANT

    ANT是为了自动构建Android程序用。

    下载地址是:http://ant.apache.org/bindownload.cgi

    我选择的是:apache-ant-1.9.3-bin.zip,同样解压到adt目录下,现在adt的目录结构如下:

    --<adt-bundle-windows-x86>

    --<eclipse>

    --<sdk>

    android-ndk-r8e>

    --<apache-ant-1.9.3>

    --SDK Manager.exe

    5. 下载Python
    • 原来cocos2dx在不同平台下必须用不同的脚本来创建和构建工程,3.0以后都统一用python了,所以Windows下需要安装python环境:

    下载地址:https://www.python.org/ftp/python/2.7.3/python-2.7.3.msi

    原来下载了最新的版本,使用setup.py的时候发现有语法错误,所以最好使用2.7.3版本,亲测过没有问题

    • 配置环境变量:最新版本可以自动加进path环境变量,但2.7.3不行,所以我们只能自己设置一下,假设我的Python安装在:d:\Python27\

    把这个路径加到path环境变量中,当我们在cmd下输入python,出现下面字样,就说明环境变量设置正确了:

    C:\Users\arlin>python

    Python 2.7.3 (default,Apr 10 2012,23:31:26) [MSC v.1500 32 bit (Intel)] on win32

    Type "help","copyright","credits" or "license" for more information.

    >>>

    cocos2d-x下载与配置


    1. 下载cocos2d-x

    目前最新版本是3.0RC,下载地址是:http://cocostudio.download.appget.cn/Cocos2D-X/3.0RC0/cocos2d-x-3.0rc0.zip

    下载完解压到一个地方,我这里:f:\cocos2dx\cocos2d-x-3.0rc0\

    2. 设置环境变量

    cc需要下面几个环境变量,用于后面的新建工程,构建工程等:

    • COCOS_CONSOLE_ROOT: cocos控制台路径,控制台用于新建,构建,发行工程。

    • NDK_ROOT: NDK根目录

    • ANDROID_SDK_ROOT: SDK根目录

    • ANT_ROOT: ANT根目录

    这几个环境变量是通过cocos2d-x根目录下的setup.py来配置的,我们启动cmd,运行setup.py:

    F:\cocos2dx\cocos2d-x-3.0rc0>setup.py


    此时脚本需要我们提供NDK,SDK,ANT的路径,我们根据之前放的路径输入就是了,整个命令过程如下:

    Setting up cocos2d-x...


    -> Adding COCOS2D_CONSOLE_ROOT environment variable... OK

    -> Added: COCOS_CONSOLE_ROOT = F:\cocos2dx\cocos2d-x-3.0rc0\tools/cocos2d-cons

    ole/bin

    -> Looking for NDK_ROOT envrironment variable... NOT FOUND

    Please enter its path (or press Enter to skip):d:\adt-bundle-windows-x8

    6\android-ndk-r8e

    ADDED

    -- Added: NDK_ROOT = d:\adt-bundle-windows-x86\android-ndk-r8e

    -> Looking for ANDROID_SDK_ROOT envrironment variable... NOT FOUND

    D:\adt-bundle-windows-x8

    6\sdk

    -> Added: ANDROID_SDK_ROOT = D:\adt-bundle-windows-x86\sdk

    -> Looking for ANT_ROOT envrironment variable... NOT FOUND

    Please enter its path (or press Enter to skip): d:\adt-bundle-windows-x8

    6\apache-ant-1.9.3\bin

    -> Added: ANT_ROOT =d:\adt-bundle-windows-x86\apache-ant-1.9.3\bin

    Set up successfull:

    COCOS_CONSOLE_ROOT was added into registry

    NDK_ROOT was added into registry

    ANDROID_SDK_ROOT was added into registry

    ANT_ROOT was added into registry

    Please restart the terminal or restart computer to make added system variables t

    ake effect

    命令最后提示我们重启终端或者重启系统,以让这些环境变量生效,一般我们关闭cmd和资源浏览器就行了,如果后面遇到环境变量找不到的错误,直接重启系统试试吧。

    要测试环境变量是否生效,重新打开cmd,输入下面命令查看,正常应该是这样:

    F:\cocos2dx\cocos2d-x-3.0rc0>set NDK_ROOT

    NDK_ROOT=d:\adt-bundle-windows-x86\android-ndk-r8e

    F:\cocos2dx\cocos2d-x-3.0rc0>set ANT_ROOT

    ANT_ROOT=d:\adt-bundle-windows-x86\apache-ant-1.9.3\bin

    F:\cocos2dx\cocos2d-x-3.0rc0>set ANDROID_SDK_ROOT

    ANDROID_SDK_ROOT=D:\adt-bundle-windows-x86\sdk

    F:\cocos2dx\cocos2d-x-3.0rc0>set COCOS_CONSOLE_ROOT

    COCOS_CONSOLE_ROOT=F:\cocos2dx\cocos2d-x-3.0rc0\tools/cocos2d-console/bin

    新建和构建工程


    1. 新建工程

    我们要用tools\cocos2d-console这个工具来新建工程,这个工具提供了下面几个功能:

    • new 创建一个新的工程

    • compile 编译当前工程,生成二进制文件,个人觉得写为build更贴切一些。

    • deploy 发布程序到一个平台

    • run 编译和发布,和运行程序

    我们现在只用到new,让我们看看new提供了哪些参数,打到cmd,输入:

    cocos new --help

    得到下面帮助:

    usage: cocos new [-h] [-p PACKAGE_NAME] -l {cpp,lua,js} [-d DIRECTORY]

    [-t TEMPLATE_NAME] [--no-native]

    [PROJECT_NAME]


    创建一个新工程


    必要参数:

    PROJECT_NAME 工程名

    可选参数:

    -h,--help 显示帮助信息

    -p PACKAGE_NAME,--package PACKAGE_NAME

    设置包名,如com.colin.mbgame

    -l {cpp,js},--language {cpp,js}

    使用的主要语言,可以是:[cpp | lua | js]

    -d DIRECTORY,--directory DIRECTORY

    工程所在的目录

    -t TEMPLATE_NAME,--template TEMPLATE_NAME

    要创建的工程模板名

    lua/js 工程参数:

    --no-native No native support.

    现在我们在cmd中输入:

    F:\cocos2dx>cocos new mygame1 -p com.colin.mbgame -l cpp -d f:\cocos2dx\mbgame


    得到下面输出:

    F:\cocos2dx>python F:\cocos2dx\cocos2d-x-3.0rc0\tools\cocos2d-console\bin\/cocos.py

    new mygame1 -p com.colin.mbgame -l cpp -d f:\cocos2dx\mbgame

    Runing command: new

    > copy template into f:\cocos2dx\mbgame\mygame1

    > copying cocos2d-x files...

    > Rename project name from 'HelloCpp' to 'mygame1'

    > Replace the project name from 'HelloCpp' to 'mygame1'

    > Replace the project package name from 'org.cocos2dx.hellocpp' to 'com.colin.mbgame'

    这表明我们已经成功创建一个工程,到f:\cocos2dx\mbgame\看看,工程目录结构如下:

    --<mygame1>

    --<Classes>

    --<cocos2d>

    --<proj.android>

    --<proj.ios_mac>

    --<proj.linux>

    --<proj.win32>

    --<Resources>

    --.cocos-project.json

    --CMakeLists.txt


    可以看到各种平台下的工程都创建出来了,同时它把cocos2d整个框架都拷贝过来了,这种好坏就见仁见智了,

    2. 构建Android工程

    同时是用到cocos2d-console,这里要用的是compile这个命令,在cmd输入下面查看帮助:

    f:\cocos2dx\mbgame\mygame1>cocos compile --help


    usage: cocos compile [-h] [-s SRC_DIR] [-q] [-p PLATFORM] [-m MODE] [-j JOBS]

    [--ap ANDROID_PLATFORM] [--source-map]

    把当前工程编译为二进制

    可选参数:

    ottom:0px; margin-top:8px; margin-bottom:8px; line-height:25.200000762939453px; font-size:13px; color:rgb(51,--help 显示帮助信息

    -s SRC_DIR,--src SRC_DIR

    工程根目录,比如上面应该是f:\cocos2dx\mbgame\mygame1

    如果不设,就为当前目录(cmd定位到的那个目录)

    -q,--quiet less output

    -p PLATFORM,--platform PLATFORM

    选择一个平台 android|ios|mac|web|win32|linux

    -m MODE,--mode MODE 编译模式 debug|release,默认为debug.

    -j JOBS,--jobs JOBS 半行编译,如果你有4核,可以设为4。

    Android Options:

    --ap ANDROID_PLATFORM

    指定SDK版本?没试过,不敢枉下定论,保留英文:

    parameter for android-update.Without the parameter,the

    script just build dynamic library for project. Valid

    android-platform are:[10|11|12|13|14|15|16|17|18|19]

    Web Options:

    --source-map Enable source-map

    现在我们在cmd输入:

    F:\cocos2dx\mbgame\mygame1>cocos compile -p android -j 4


    意思就是说我们要编译当前目录下的Android工程,同时可以有4个编译任务,所以我的4核机器就满负的跑了,如无意外,应该可以看到编译开始了,最后如果看到下面这几句,说明编译成功:

    BUILD SUCCESSFUL
    Total time: 7 seconds
    Move apk to F:\cocos2dx\mbgame\mygame1\bin\debug\android
    build succeeded.

    我们到f:\cocos2dx\mbgame\mygame1\proj.android\bin\,可以看到mygame1-debug.apk,说明构建完成。

    我把它安装到手机上试跑,发现好像启动速度是快了很多,不知是不是心理作用。


    在Eclipse下运行程序

    还记得我们下的adt里面有eclipse吗,现在我们就来把工程导入到eclipse跑跑看

    • d:\adt-bundle-windows-x86\eclipse打到eclipse.exe

    第一次会提示设置工作区,你可以设置工作区放在哪里,我这里为了演示就默认了。

    • 接下来我们要看看SDK和NDK的路径是否正确:

      • 选择Windwos/Preferences菜单项,打开选项对话框。

      • 选择Android结点,看看SDK Location是否正确,我这里为F:\software\adt-bundle-windows-x86-20131030\sdk,说明是正确的,如果没有值,就手动把SDK的根目录设进去。

      • 接着选择Android/NDK结点,在NDK Location输入d:\adt-bundle-windows-x86\android-ndk-r8e

    • 接下来我们来导入工程,选择file/import,打开导入对话框:

      • Root Directory输入F:\cocos2dx\mbgame\mygame1\proj.android

      • 此时会列出mygame1工程,点击finish把工程导进来。

      • Root Directory输入F:\cocos2dx\mbgame\mygame1\cocos2d\cocos\2d\platform\android\java

      • 此时列出libcocos2dx工程,点击finish把工程导进来。

      • 选择Android/Existing Android Code Into Workspace,然后Next

      • 第一步要先把libcocos2dx导进来:

      • 第二步导入我们的工程:

      • 最后连接手机,选择运行或调试就可以跑程序了。

    • 在导入工程到Eclipse时遇到几个坑,在这里记下来,免得后面的人继续踩这些坑:

      • 没有导libcocos2dx,只导mygame1时不会有编译错误,但跑起来后会ClassNotFound异常,说找不到org/cocos2dx/lib/Cocos2dxHelper类,这个问题搞了我好久,后来在论坛看到贴子才明白,希望后续官方有详细的文档。

      • 因为adt只包含了android4.4(api-19)的版本,所以默认使用的是这个版本,我自己拷了几个更低的版本,然后把Build target设为android2.3(api-9),此时运行程序会提示下面错误:

    Unable to execute dex: java.nio.BufferOverflowException


    后来在网上查了一下,发现是Android SDK Build tools的BUG,把它升级到19.0.3后就好了:打开SDK Manager,找到19.0.3的Android SDK Build Tools,安装之。

    今天的关于cocos2d-x v3.3 RotateTo and RotateBy(windows)的分享已经结束,谢谢您的关注,如果想了解更多关于Cocos2d-html5之RotateTo&RotateBy、Cocos2d-x + Android + Eclipse + Windows 8、Cocos2d-x +Android + Windows 7、Cocos2d-x 3.0 Windows下Android环境搭建的相关知识,请在本站进行查询。

    本文标签: