quick cocos2dx 官网 修改引擎代码后怎么打包

阅读:7325次
内容选自:
Quick-Cocos2dx-Community 是跨平台的游戏引擎,支持时下流行的 Android 移动操作系统。本节将教大家如何在 Windows 上把已经开发好的游戏打包为 Android 上可运行的 apk 文件。
Quick-Cocos2dx-Community Android 打包分以下几个步骤:
安装 Apache Ant
前 4 个步骤搭建环境,仅需做一次,除非引擎更新需要更高的开发环境,否则不建议经常更新它们。如果编译环境已配置妥当,那么直接进入第 5 步:编译项目。
本文以 Windows 7 为例进行截图。
JDK 安装包的下载请参考:。
选择对应系统的 JDK 下载,Windows 64位系统下载jdk-7u75-windows-x64.exe。下载完毕后双击 exe 文件开始安装。一路 next 安装完毕后,打开 Windows 控制台,输入命令
$java -version
如果 JDK 成功安装,将显示如下的版本信息:
java version &1.7.0_75&
Java(TM) SE Runtime Environment (build 1.7.0_75-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.75-b04, mixed mode)
为了能正确使用 ant 进行命令行编译,还需要设置 JDK 的环境变量。
右键&计算机&,选择弹出菜单中的&属性&,然后在&控制面板主页&中点击&高级系统设置&。如下图所示:
&系统属性& =& &高级& =& &环境变量&
在&环境变量&的&用户变量&中加入以下变量:
变量:JAVA_HOME 值:C:\Program Files\Java\jdk1.7.0_75
注意:请根据本人 JDK 版本以及安装路径配置上述环境变量。
ADT 安装包的下载请参考:。
配置步骤:
把 Windows 64位系统对应的 adt-bundle-windows-x86_64-.zip 解压到一个目录并更名为 adt-bundle-windows,例如D:\u0u0\adt-bundle-windows。目录下包含两个子文件夹 eclipse 和 sdk。
配置系统环境变量。
在&环境变量&的&用户变量&中加入以下两个变量:
变量:ANDROID_SDK_ROOT 值:D:\u0u0\adt-bundle-windows\sdk
变量:ANDROID_HOME 值:D:\u0u0\adt-bundle-windows\sdk
并在&系统变量&的 Path 变量的尾部添加以下字段:
;D:\u0u0\adt-bundle-windows\sdk\D:\u0u0\adt-bundle-windows\sdk\platform-tools
如下图所示:
环境变量界面打开方式参见上面的 JDK 安装。
请根据本人 ADT 解压路径配置上述环境变量。
NDK 安装包的下载请参考:。
配置步骤:
把 Windows 平台对应的 android-ndk-r9d-windows-x86_64.zip 解压到一个目录并更名为 android-ndk,例如D:\u0u0\android-ndk。
配置系统环境变量。
在&环境变量&的&用户变量&中加入以下两个变量:
变量:ANDROID_NDK_ROOT, 值:D:\u0u0\android-ndk
变量:NDK_ROOT 值:D:\u0u0\android-ndk
环境变量界面打开方式参见上面的 JDK 安装。
请根据本人 NDK 解压路径配置上述环境变量。
安装 Apache Ant
Apache Ant 安装包的下载请参考:。
配置步骤:
把 apache-ant-1.9.4-bin.zip 解压到一个目录,例如D:\u0u0\ant。
配置系统环境变量。
在&环境变量&的&用户变量&中加入以下变量:
变量:ANT_ROOT 值:D:\u0u0\ant\bin
并在&系统变量&的 Path 变量的尾部添加以下字段:
;D:\u0u0\ant\bin
环境变量界面打开方式参见上面的 JDK 安装。
请根据本人 Ant 解压路径配置上述环境变量。
在编译项目之前,我们先确认一下编译环境。
请确保,Quick-Cocos2dx-Community、JDK、ADT、NDK 和 Ant 都已正确安装,这 5 个工具均需要配置&系统环境变量&。
作者的 Quick-Cocos2dx-Community 安装在D:\cocos\quick-3.3,并使用 player3 新建了一个 test 项目位于D:\cocos\workspace\hello。
注:创建工程不勾选&Copy Source Files&,也就是不包含引擎代码。
现在就以 hello 项目为例说明如何编译 Android apk 包。
切换到 hello 的 Android 工程路径。
C:\Users\Administrator&d:
D:\&cd D:\cocos\workspace\hello\frameworks\runtime-src\proj.android
清理编译临时文件。
D:\cocos\workspace\hello\frameworks\runtime-src\proj.android&clean.bat
不一定每次都需要清理,但是建议编译 release 版本一定要先清理后打包。
编译 Quick-Cocos2dx-Community 引擎的 C++ 核心。
D:\cocos\workspace\hello\frameworks\runtime-src\proj.android&build_native.bat
这个过程调用 NDK 进行编译,并生成 libcocos2dlua.so 文件。如果一切顺利,应该看到下面的 log 信息:
[armeabi] SharedLibrary
: libcocos2dlua.so
[armeabi] Install
: libcocos2dlua.so =& libs/armeabi/libcocos2dlua.so
make.exe: Leaving directory `D:/cocos/workspace/hello/frameworks/runtime-src/proj.android'
更新 test 的 Android 项目配置信息。
D:\cocos\workspace\hello\frameworks\runtime-src\proj.android&android update project -p . -t 1
这步只需做一次即可。
更新 Quick-Cocos2dx-Community 引擎工程的 Android 项目配置信息。
D:\&cd D:\cocos\quick-3.3\cocos\platform\android\java
D:\cocos\quick-3.3\cocos\platform\android\java&android update project -p . -t 1
这步只需做一次即可。
修改 proj.android 目录下 project.properties 文件中关于 Quick-Cocos2dx-Community 引擎工程的引用路径。
android.library.reference.1=../../../../../../quick-3.3/cocos/platform/android/java
注意以下事项:
每次执行第 4 步骤后,都需要重新配置 project.properties。
android.library.reference只认相对路径,所以 Quick-Cocos2dx-Community 和 test 最好都在同一盘符下。
切换回 test 工程下的 proj.android 目录,运行 ant 打包命令。
D:\cocos\workspace\hello\frameworks\runtime-src\proj.android&ant debug
注:如果遇到类似resolve to a path with no project.properties的错误提示信息,请仔细检查 project.properties 中的引擎相对路径是否正确配置。
成功编译将看到如下 log 信息:
-post-build:
BUILD SUCCESSFUL
Total time: 19 seconds
apk 文件位于proj.android/bin/hello-debug.apk。
ant 常用命令说明:
ant debug用于生成自签名的测试 apk 包,可直接在 Android 手机上安装运行。
ant release生成发布版本的 apk 包。默认配置生成的 hello-release-unsigned.apk 包是没有签名的,不能直接安装,还需要用签名工具进行签名。
ant clean清理 java 编译环境。
注:clean.bat是清理 NDK 编译环境。
相关文章推荐
泰然网手游开发官方群:
独立游戏人:Pages: 1/2
主题 : 3.3rc1 模块化编译后的包大小
级别: 新手上路
可可豆: 84 CB
威望: 74 点
在线时间: 181(时)
发自: Web Page
来源于&&分类
3.3rc1 模块化编译后的包大小&&&
Application.mk文件中改了下面的参数CC_USE_CURL := 0CC_USE_CCSTUDIO := 0CC_USE_CCBUILDER := 0CC_USE_SPINE := 0CC_USE_PHYSICS := 0CC_USE_TIFF := 0CC_USE_WEBP := 0CC_USE_JPEG := 1CC_USE_3D := 0CC_USE_SQLITE := 0CC_USE_RUNTIME := 0然后打包出来的helloworld的apk大小是5M左右,如果不改上面的参数的话要7M多。可是,我3.3rc0都没试过改Application.mk文件,现在做的项目也都5.4M左右。还想着升级rc1后模块化编译能减少包大小,现在感觉不太行啊。现在rc0版本的项目的libcocos2dlua.so大小是10M左右,但是rc1版本的helloworld经过上述设置后编译出来的libcocos2dlua.so都13M多了所以这是什么情况,求解~[ 此帖被huanniangstudi在 02:46重新编辑 ]
级别: 精灵王
UID: 319920
发帖: 1350
可可豆: 1540 CB
威望: 1459 点
在线时间: 789(时)
发自: Web Page
要编译release版本。去掉可选模块后,apk打出来应该是不到3M的。
级别: 新手上路
可可豆: 98 CB
威望: 98 点
在线时间: 26(时)
发自: Web Page
mark&&不同于那啥,这包越小越好
级别: 圣骑士
可可豆: 3016 CB
威望: 2936 点
在线时间: 471(时)
发自: Web Page
回 楼主(huanniangstudi) 的帖子
问问LZ,为什么我设置了CC_USE_PHYSICS = 0之后build_native.sh显示错误呢
技术杂工,救火队员,各种空降...求老司机指导
级别: 新手上路
可可豆: 84 CB
威望: 74 点
在线时间: 181(时)
发自: Web Page
回 1楼(阳光七月) 的帖子
谢谢大大,正确用release打包后.so只有6M左右了。
级别: 新手上路
可可豆: 84 CB
威望: 74 点
在线时间: 181(时)
发自: Web Page
回 3楼(wen495713) 的帖子
1.你的版本也是3.3RC1?2.build_native.sh显示什么错误?一般是编译到的代码里面引用了物理模块的API才会报错,错误信息应该有报什么地方,看看是不是自己用了3.旧版的话要设置CC_USE_PHYSICS := 0APP_CPPFLAGS += -DCC_USE_PHYSICS=0
级别: 圣骑士
可可豆: 3016 CB
威望: 2936 点
在线时间: 471(时)
发自: Web Page
回 5楼(huanniangstudi) 的帖子
好吧,感谢了...但是赶脚屏蔽了不需要的模块打包出来还是很大...还是得换3.3
技术杂工,救火队员,各种空降...求老司机指导
级别: 侠客
可可豆: 245 CB
威望: 245 点
在线时间: 173(时)
发自: Web Page
还是3.2.1好用。。。2.8M包。。。
级别: 精灵王
UID: 319920
发帖: 1350
可可豆: 1540 CB
威望: 1459 点
在线时间: 789(时)
发自: Web Page
回 7楼(ase7en) 的帖子
3.3rc1的sample/luajavabridge打出来的包是2.3M,呵呵
级别: 新手上路
可可豆: 98 CB
威望: 98 点
在线时间: 26(时)
发自: Web Page
v3quick/quick/samples/luajavabridge/test/LuaJavaBridge/frameworks/runtime-src/proj.android/build_apk.sh -bldm release&& 打出来的apk 4.3M我哪里不对吗?
Pages: 1/2
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版游戏cocos2d-x(2)
quick3.3 安卓打包
以前就打包过,近来想打包了但是没想到打包不成功,研究了许久终于成功了,好记性不如烂笔头,还是记下来的好免的下次又忘了,废话说到着开撸!另:注意我的是mac下!!!
环境配好很关键
从网上载引擎并配好环境,注意ndk一定是r9d(试了r9b,和r10c都失败了)
1. cd进入引擎的目录。
2. ./setup.py根据提示输入idk,idk,ant的路径
3. 配置quick的环境
解压quick的引擎放在没有中文的目录下,cd进入引擎的根目录
运行./setup_mac.sh
4. 终端中输入cd ~进入根目录。
5. open .bash_profile打开文件
6. 在打开的文件中添加代码:
export ANDROID_NDK_ROOT=NDK绝对路径
export ANDROID_SDK_ROOT=SDK绝对路径
export ANDROID_HOME=${ANDROID_SDK_ROOT}
7. 保存并彻底退出终端,然后重新启动终端
cd进入 要打包的游戏的frameworks/runtime-src/proj.android
9. 运行./build_native.sh然后运行./build_apk.sh(直接运行也可以)。
10. 完成后会在此目录下生成两个apk文件,一个签名一个未签名的。
大功告成,欢迎各位前来讨论;
另:附上r9d的下载网址
(Mac环境)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:548次
排名:千里之外
(2)(1)(2)(1)(1)quick-cocos2d-x源文件编译及加密详解
quick-cocos2d-x是用lua脚本来写的,而lua是明文形式,如果不对脚本进行处理,那么我们所写的代码将可能暴露给别人(apk和ipa都是简单的zip包装)。
quick-cocos2d-x框架为我们提供了一个可编译和加密代码的工具compile_scripts.sh(目前只提供了mac版&),它位于quick-cocos2d-x/bin/compile_scripts.sh&。下面将对其进行详细的介绍。&
一、安装luajit&
lua脚本的编译是通过luajit来执行的,如果你之前没有安装过luajit的话,运行compile_scripts.sh会出现下面的提示:&
下面将介绍如何安装luajit。&
1、运行&path&/quick-cocos2d-x/bin/install_luajit.sh&,&path&为你具体的路径,请自行替换。&这个时候会执行luajit的构建操作。&
2、完成构建之后将进行安装,安装之前会叫你输入系统账户密码,如下图:&
3、之后就是安装过程了,完成之后会出现下图这样的界面:&
恭喜你完成了第一步。&
我们先来运行一个示例吧。这个将帮助你了解编译的过程。&
我们做的很简单,就是把代码编译成一个zip包,并把它放置到res目录下(framework_precompiled.zip也在此目录)。&
1、在bash下,设置当前工作目录到你游戏的目录下,如:
cd&/Users/myname/mygames/game01
2、运行&compile_scripts.sh&。
/Users/myname/lua/tools/quick-cocos2d-x/bin/compile_scripts.sh&-i&scripts&-o&res/game.zip
生成会显示出具体的信息,如参数是什么、源代码文件夹地址、生成了什么文件,生成文件的位置等等,如下图:&
之后就会看到game.zip在res目录下了,解压(不是必须操作,只是为了看看里面有什么)之后发现:&
它生成了一个个的二进制文件,文件名已经包含了包名。&
到这里你也一定会问,命令中-i,-o这些参数是什么意思啊?还有哪些其它的参数啊&?下面我们将对其进行详解。&
三、参数详解&
compile_scripts.sh中带有不少的参数,详情如下:&
1、&-h&帮助。显示参数的解释及使用,英文的。&
2、-i 源码目录。&
3、-o 输出文件或目录。&
4、-p 包前缀。&
5、-x 不包含在内的包。如果你有些源文件不想被编译进去的话,将会用到这个参数,只能设置包(对应文件夹),不能指定到文件,多个包的话用,(逗号)隔开。示例:-x
app.test,server,指的是app/test/.*,server/.*&这两个目录下的所有文件都不会被编译。
注:经测试,目前这个参数没有作用,已报告给作者,请等待修复。&
6、-m 编译模式。有两个值&:&
-m&zip&默认,生成的是zip格式文件;&
-m&files&生成的是一个个文件,不打包,这个时候-o参数指的就是输出的目录。&
7、-e 加密模式。可以对编译后的文件再进行&XXTEA&加密,有两个值:&
-e xxtea_zip&对应-m zip,对打包后的zip格式文件进行加密,之后再打包成zip格式。&
-e&xxtea_chunk&对编译后的文件加密,最后打不打包取决于-m。&
注:xxtea_zip一定要与-m zip编译模式对应,不然会提示出错。&
8、-ek 加密密钥。对-e有效,且设置了-e之后一定要设置-ek。&
9、-es 加密签名。对-e有效,默认值为&XXTEA&,这个只是为了让引擎知道文件是否被加密过,意义不大,所以可不设置。&
下面是一个编译及加密的例子:
compile_scripts.sh&-i&scripts&-o&res/game.zip&-e&xxtea_zip&-ek&aaa&-es&XT
10、-ex 编译后的文件的后缀名。对-m files有效,默认值为&lua&。&
11、-c 从一个文件加载参数列表。&
12、-q 生成过程不输出信息。&
四、修改&AppDelegate&.cpp&
我们编译了代码,并且把main.lua文件也包含进去了,我们要修改c++中的代码才能让程序正常运行。这个在&AppDelegate&.ccp文件中修改,把applicationDidFinishLaunching&()方法改成如下:
bool&AppDelegate::applicationDidFinishLaunching()
&&&&CCLuaStack&*pStack&=&pEngine-&getLuaStack();
&&&&//&如果设置了&-e&和&-ek&要加上下面这句
&&&&//&pStack-&setXXTEAKeyAndSign(&aaa&,&3);
&&&&//&如果设置了&-e&和&-ek&-es&则要加上下面这句
&&&&pStack-&setXXTEAKeyAndSign(&aaa&,&3,&&XT&,&2);
&&&&//&load&framework
&&&&pStack-&loadChunksFromZip(&res/framework_precompiled.zip&);
&&&&pStack-&loadChunksFromZip(&res/game.zip&);
&&&&pStack-&executeString(&require&'main'&);
&&&&return&
注意:一直有朋友不太注意,
pStack-&setXXTEAKeyAndSign(&aaa&, 3, &XT&, 2);
这一句的第二和第四个参数都是前一个参数的长度,并不是固定值,如可以这样
pStack-&setXXTEAKeyAndSign(&abcd&, 4, &SIGNCODE&, 8);
最后需要注意的是:编译发布程序的时候要记得把源代码文件夹从项目中移除(不是删除,只是不包含进项目里),不然一切都白费了。
到此整个过程结束,我们的代码已经被很好的保护起来了。
发布于 4个月前, 阅读(3851) | 评论(16) | 投票(4) | 收藏(18)&
上一篇讲了quick-cocos2d-x使用chipmunk的使用流程,介绍了World,Body,Shape的建立,这一篇将讲解如何处理物体之间的碰撞。
一、监听事件
quick-cocos2d-x中的chipmunk碰撞处理是通过监听事件来实现的。
-- 设置物体的碰撞类别,默认所有物体都是类别0
Body:setCollisionType(type)
-- handle是一个回调函数,碰撞处理将在这个函数中执行
-- collisionTypeA和collisionTypeB是两个int值,表示要监听的是哪两种物体
-- 这两个值在body中设置(上面所示的方法),两个值相同时为监听同种物体之间的碰撞
World:addCollisionScriptListener(handler, collisionTypeA, collisionTypeB)
-- handler回调函数,这个函数一定要返回true,不然碰撞后两个物体将会重合,即像是不碰撞一样
-- eventType为碰撞的类别,有四种值:
begin 开始碰撞
preSolve 持续碰撞(相交),可以设置相交时独自的摩擦,弹力等
postSolve 调用完preSolve后,做后期处理,比如计算破坏等等
separate 分开,当删除一个shape时也会调用
-- event为CCPhysicsCollisionEvent实例
onCollisionListener(eventType, event)
body:setCollisionType(1)
self.world:addCollisionScriptListener(handler(self, self.onCollisionListener), 1, 2)
function PhysicsScene:onCollisionListener(eventType, event)
print(eventType)
return true
二、&CCPhysicsCollisionEvent&
在回调函数中,有个重要的参数就是event了,CCPhysicsCollisionEvent中包含很多碰撞时的信息
-- 获取CCPhysicsWorld
event:getWorld()
-- 获取两个碰撞的body
event:getBody1()
event:getBody2()
-- 是否是两种物体第一次接触
event:isFirstContact()
-- 弹性系数,在preSolve之前设置可改变当前值
event:setElasticity(elasticity)
event:getElasticity()
-- 摩擦系数,在preSolve之前设置可改变当前值
event:setFriction(friction)
event:getFriction()
-- 碰撞时两物体的接触点数
event:getCount()
-- 获取接触点
event:getPoint(index)
三、分组碰撞&
我们在做一款游戏的时候,可能里面有很多的物体类型,我们希望某一物体只与特定的其它物体碰撞,而不是全部都碰撞,这种情况下就需要对物体进行分组了,在quick-cocos2d-x中可通过以下方法来实现
-- body所在的碰撞层,默认值为0,同层的物体才会发生碰撞
-- layers可以表示多个层,具体怎么达到的呢
-- 当我们对一个物体分层时,所用的数字应该为[1,2,4,8,16,32,...]这样形式(倍增)来分
-- 如A为1,B为2,C为4,即为基本层(layer),如果要求C可与A碰撞,则C的layers为1+4=5
Body:setCollisionLayers(layers)
-- body所在组,默认值为0,同个组的将不发生碰撞(除了0组)
-- 优先级高于layer,当group不一样的时候才会考虑layers
Body:setCollisionGroup(group)
从上面我们可以得出:
两个物体要想发生碰撞,就要
1、group不一样或都为0。
2、至少有一个layer(注意,非layers)是一样的&。
下面将通过一个具体的案例来讲解。&
假如我们设计一个游戏,内容为上古部落之间的战争,有A,B,C,D四个部落,A和B为结盟关系,C,D则是各自独立的,这是一个三角混战的关系,那么就有以下的规则:&
1)A和B分别与C,D碰撞&
2)A和B之间不发生碰撞&
3)C与A,B,D之间都碰撞&
4)D与A,B,C之间都碰撞&
5)A,B,C,D之间各自(即A与A,B与B,...)不碰撞&
我们设计的基本层为:A=1,B=2,C=4,D=8&
可由上图得出它们各自的layers为&
A.layers=1&
B.layers=2&
C.layers=1+2+4+8&
D.layers=1+2+4+8&
上面有一些是重复的层,可以进行简化&
A.layers=1&
B.layers=2&
C.layers=1+2+4+8&
D.layers=1+2&+8&
还可以把C,D放在同一层4进行简化&
A.layers=1&
B.layers=2&
C.layers=1+2+4&
D.layers=1+2+4&
具体的分法并没有一个统一的方法,只要合乎上面的原则即可,而且物体多时会比较麻烦,大家要多加注意。&
设置layers只解决了1)——4)而已,5)还是没有解决,这就用到了group这一属性,我们把A,B,C,D设为不同的group即可&
A.&group&=1&
B.&group&=2&
C.&group&=3&
D.&group&=4&
最后的代码如下:
-- 为了程序清晰,layers不用求和
A:setCollisionLayers(1)
B:setCollisionLayers(2)
C:setCollisionLayers(1+2+4+8)
D:setCollisionLayers(1+2+4+8)
A:setCollisionGroup(1)
B:setCollisionGroup(2)
C:setCollisionGroup(3)
D:setCollisionGroup(4)
发布于 5个月前, 阅读(733) | 评论(0) | 投票(1) | 收藏(2)&
chipmunk是一个用C写成的物理引擎,quick-cocos2d-x已经用C++对其进行封装,导出到lua的类有:
CCPhysicsWorld
CCPhysicsBody
CCPhysicsShape
CCPhysicsDebugNode
CCPhysicsCollisionEvent
CCPhysicsVector
可以看出,quick-cocos2d-x没有对joint(连接)进行封装,下面将就如何在quick-cocos2d-x中使用chipmunk作详细的介绍。&
1、World,Body,Shape可用下图说明其关系
可以看出,World由Body组成,而Body又由Shape组成。就像我们所处的世界一样,世界由房屋,树木等等构成,而房屋由门窗,墙壁等组成,树木由叶子,树干,树枝等组成。
2、CCPhysicsDebugNode是用于显示各个物体的边框等等信息,主要用于调试。
3、CCPhysicsCollisionEvent是物体之间发生碰撞时产生的事件,事件中携带有碰撞时的信息。
4、CCPhysicsVector则是向量,物体受力时将会用到。
二、使用流程
1、建立World
我们要使用chipmunk,首选要建立一个世界(CCPhysicsWorld)
-- 建立没有引力的世界
CCPhysicsWorld:create()
-- 指定两个方向上的引力
CCPhysicsWorld:create(gravityX, gravityY)
-- 引力向下的世界(跟地球类似)
self.world=CCPhysicsWorld:create(0,-200)
self:addChild(self.world)
2、建立Body&
在chipmunk里,Body分为两种:static和非static(普通),static是固定不动的;形状上可以分为长(正)方形、圆形、多边形和自定义类型,建立它们的方法也很多。&
1)可以通过Word里的方法创建:&
-- 当mass&=0时会创建一个StaticBody
World:createBoxBody(mass, width, height)
-- offset为偏移量
World:createCircleBody(mass, radius, offsetX, offsetY)
-- vertexes格式为{x1, y1, x2, y2, x3, y3},目前的版本有bug,不可以设置offset
World:createPolygonBody(mass, vertexes, offsetX, offsetY)
local body = self.world:createBoxBody(10, 100, 100)
local body = self.world:createCircleBody(0, 20, 50, 50)
-- 创建一个三角形
local vertexes = {0,0,50,50,100,0}
local body=self.world:createPolygonBody(0, vertexes)
2)通过Body里的方法创建:
CCPhysicsBody:createStaticBody(world)
CCPhysicsBody:create(world, mass, moment)
local body = CCPhysicsBody:createStaticBody(self.world)
-- 这种创建方式要记得把body放到world里
self.world:addBody(body)
3)重要属性或方法:
-- 摩擦系数 0-1.0
body:setFriction(friction)
-- 反弹系数 0-1.0
body:setElasticity(elasticity)
-- 是否是感应
body:setIsSensor(isSensor)
body:isSensor()
body:setVelocity(velocityX, velocityY)
body:setAngleVelocity(velocity)
body:applyForce(forceX, forceY, offsetX, offsetY)
body:applyForce(force, offsetX, offsetY)
body:applyImpulse(forceX, forceY, offsetX, offsetY)
body:applyImpulse(force, offsetX, offsetY)
-- unbind=true时将解除绑定的CCNode,但不会从场景里删除node,只是执行CC_SAFE_RELEASE_NULL(node);
-- unbind=false时CCNode将继续绑定在该Body上,默认为true
body:removeSelf(unbind)
World:removeBody(body, unbind)
World:removeBodyByTag(tag, unbind)
3、建立Shape&
Shape要放置于Body中,一般情况下是不需要单独再建立Shape的,上面创建Body的时候很多就已经创建有一个Shape了。
当一个Body由多个独立的部分组成时(比如一个人由头部,手,脚,身体组成),则要通过创建多个Shape来完成了。
1)Shape的创建都是由Body的方法来完成。
-- 线段,lowerLeft和lowerRight为CCPoint,thickness为粗细
Body:addSegmentShape(lowerLeft, lowerRight, thickness)
Body:addCircleShape(radius, offsetX, offsetY)
Body:addBoxShape(width, height)
-- 目前好像不能运行,已发issue到官方仓库
Body:addPolygonShape(vertexes, offsetX, offsetY)
2)Shape的属性
-- 摩擦系数 0-1.0
shape:setFriction(friction)
-- 反弹系数 0-1.0
shape:setElasticity(elasticity)
-- 是否是感应
shape:setIsSensor(isSensor)
shape:isSensor()
body:removeShape(shapeObject)
body:removeShapeAtIndex(index)
body:removeAllShape()
之前我们都只是建立物理世界里的物体,并没有把它们同外观联系起来,比如把一个Box同一张箱子的图片结合在一起,这个就叫做绑定,在quick-cocos2d-x里可以通过
-- node为CCNode类型
Body:bind(node)
Body:unbind()
来完成绑定和解绑。&
很简单,只要加入以下代码即可:
self.worldDebug=self.world:createDebugNode()
self:addChild(self.worldDebug)
以上就是quick-cocos2d-x中使用chipmunk的过程,有些成员方法没有一一指出,大家可自行翻看源码来了解。下一篇我将会讲到碰撞部分。
发布于 5个月前, 阅读(1222) | 评论(0) | 投票(2) | 收藏(6)&
GameState是quick-cocos2d-x中特有的一个用户信息存储类,相对于CCUserDefault而言,它增加了数据校验的功能,当数据被人为的改变之后,会被检测出来,下面介绍它的主要用法。
一、初始化
因为GameState并没有在framework中加载,所以我们要在开始的代码中去加载,如在MyApp.lua的开头位置加载
GameState=require(cc.PACKAGE_NAME .. &.api.GameState&)
二、提供的方法
1、GameState.init(eventListener_,
stateFilename_, secretKey_)
这个方法是初始化GameState,在场景初始化之前调用一次即可,如在MyApp.lua的MyApp:ctor()中调用。
eventListener_是载入或保存时调用的函数,可以写个匿名函数,后面会重点介绍;
stateFilename_是保存的文件名,如果留空或非字符串(string)则是默认的state.txt,该文件会被保存到device.writablePath下;
secretKey_是 校验文件时所用到的密钥,GameState保存的数据格式为{h = hash, s = s},s是我们要保存的数据(一个table),h则是要校验的一个md5码。如果secretKey_留空或为非字符串(string)则不加校验码, 直接保存数据,跟CCUserDefault一样了。
2、GameState.load()
载入并返回数据,一般此方法只调用一些就行,在游戏加载前调用并保存到一个全局变量GameData。
3、GameState.save(newValues)
保存数据,newValues是一个table。GameState.init对应于保存一个文件,此文件的内容就是newValues,所以我们需要更新数据的时候应该改变上面的GameData,然后保存GameData。
4、GameState.getGameStatePath()
保存的文件的完整路径。
三、eventListener(value)
此函数就是GameState.init中的第一个参数,value为一个table,此函数在载入或保存时都会被调用,相当于一个监听器。不同的情况下value的值会不一样。
注意:eventListener一定要有返回值。
1、GameState.load()中用到的eventListener
1)& 如果在这个函数中载入数据时有异常发生,value值为{name = &load&, errorCode = errorCode},name有两种值,&load&和&save&,分别对应载入和保存;errorCode分为三种:
GameState.ERROR_INVALID_FILE_CONTENTS&//不合法的文件内容,即取出来的内容不是一个table
GameState.ERROR_HASH_MISS_MATCH&//文件被人为更改过
GameState.ERROR_STATE_FILE_NOT_FOUND&//文件不存在
这个时候eventListener可返回nil。
2)& 如果载入的数据是正确的,value值为
values = values,
encode = encode,
= os.time()
values就是取出的数据;encode数据是否加密过;time当前取出的时间。这个时候eventListener返回value.values即可。
2、GameState.save(newValues)中用到的eventListener
这时value值为
values = newValues,
encode = type(secretKey) == &string&
values就是要保存的数据;encode数据是否要加密。这个时候eventListener返回value.values即可。
当然,以上的情况你都可以做一些其它的事,如弹出错误的窗口,或打印出已加载或已保存的数据。
四、加密数据
GameState保存的还是明文数据,只是加了校验码,如果我们不想被用户知道保存了什么信息,可加密了再保存,这个在eventListener中“过滤”一下就行了。
下面是一个完整的加载、初始化、载入,保存及加解密的过程代码:
//MyApp.lua(加载、初始化、载入,加解密)
require(&framework.cc.init&)
GameState=require(cc.PACKAGE_NAME .. &.api.GameState&)
-- global var
GameData={}
function MyApp:ctor()
-- init GameState
GameState.init(function(param)
local returnValue=nil
if param.errorCode then
CCLuaLog(&error&)
if param.name==&save& then
local str=json.encode(param.values)
str=crypto.encryptXXTEA(str, &abcd&)
returnValue={data=str}
elseif param.name==&load& then
local str=crypto.decryptXXTEA(param.values.data, &abcd&)
returnValue=json.decode(str)
-- returnValue=param.values
return returnValue
end, &data.txt&,&1234&)
&&&&GameData=GameState.load()
&& &if not GameData then
&& &&& &GameData={}
//保存的时候
GameData.aaa=&bbb&
GameState.save(GameData)
出处:http://my.oschina.net/lonewolf/blog?disp=2&p=1&catalog=417040
看过本文的人也看了:
我要留言技术领域:
收藏提示你已经自动关注本知识库了哦!
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?}

我要回帖

更多关于 quick cocos2d x 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信