这篇文章主要围绕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-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)
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测试用版本: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的值。
请看下列代码:
- var GameScene = cc.Scene.extend({
- enemy1: null, // 敌人1
- enemy2: null, // 敌人2
- enemy3:null, // 敌人3
- layer: null, // 布景
- winSize: null, // 游戏运行窗口尺寸
- onEnter: function () {
- this._super();
- this.initData();
- },
- initData: function () {
- // 获取尺寸
- this.winSize = cc.Director.getInstance().getWinSize();
- // 添加布景
- this.layer = cc.LayerColor.create(cc.c4(200,200,255),this.winSize.width,this.winSize.height);
- this.addChild(this.layer);
- // 创建动作
- var actionTo = cc.Rotateto.create(2,45,90);
- var actionBy = cc.RotateBy.create(2,180,360);
- var actionByBack = actionBy.reverse();
- // 添加敌人1
- this.enemy1 = cc.Sprite.create(s_enemy_1);
- this.enemy1.setPosition(cc.p(300,300));
- this.layer.addChild(this.enemy1);
- this.enemy1.runAction(actionTo);
- // 添加敌人2
- this.enemy2 = cc.Sprite.create(s_enemy_2);
- this.enemy2.setPosition(cc.p(100,100));
- this.layer.addChild(this.enemy2);
- this.enemy2.runAction(cc.Sequence.create(actionBy,actionByBack));
- // 添加敌人3
- this.enemy3 = cc.Sprite.create(s_enemy_3);
- this.enemy3.setPosition(cc.p(200,200));
- this.layer.addChild(this.enemy3);
- this.enemy3.runAction(cc.RotateBy.create(2,90,120));
- }
- });
以下是运行结果截图:
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目录,例如:
再打开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,末尾添加如下行:
创建 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 末行添加(更改为你自己的路径)
以上两种方法任选其一;
需要注意的是:路径里不能含空格符,这里windows是以分号做分隔符,linux是以冒号做分隔符
Build Options面板下,Specify Resouces..选择当前项目的jni文件夹,其他配置如下图:
最后,OK,配置好后,Project->Clean,则会开始自动编译,控制台显示信息如下:
如果遇到AssetManager.a的错误,清空obj文件夹里的内容即可。
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环境搭建
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。
3. 下载Android NDK下载地址是:http://developer.android.com/sdk/index.html
可以选择32位或64位版本,我选择的是32位版的,把它解压到一个目录,我这里是:d:\adt-bundle-windows-x86\,目录结构如下:
--<adt-bundle-windows-x86>
--<eclipse>
--<sdk>
--SDK Manager.exe
4. 下载ANT下载地址是:http://developer.android.com/tools/sdk/ndk/index.html
同样有32位和64位版可选,我选择的是32位版的,把它解压到adt同目录下,现在adt的目录结构如下:
--<android-ndk-r8e>
--SDK Manager.exe
5. 下载PythonANT是为了自动构建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
-
原来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
2. 设置环境变量目前最新版本是3.0RC,下载地址是:http://cocostudio.download.appget.cn/Cocos2D-X/3.0RC0/cocos2d-x-3.0rc0.zip
下载完解压到一个地方,我这里:f:\cocos2dx\cocos2d-x-3.0rc0\
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]
把当前工程编译为二进制
可选参数:
-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环境搭建的相关知识,请在本站进行查询。
本文标签: