cocos2dx lua 热更新怎么才能免编译

10033人阅读
cocos2dx(2)
首先说明你下本文使用
cocos2dx version 2.1.4
lua version 5.1
第三方摇杆 SneakyButton.cpp \
& & & & & &SneakyButtonSkinnedBase.cpp \
& & & & & &SneakyJoystick.cpp \
& & & & & &SneakyJoystickSkinnedBase.cpp \
1, create-android-project.bat 生成相应工程,下文简称Test工程
2, VS新建支持LUA的cocos2dx项目
3, 把VS工程的proj.win32, Classes, Resources拷贝到 Test工程目录内(当然也可以不拷贝,我是觉得这样方便,不用在以后完成的时候再去VS里面拷 CPP,推荐拷贝)
4, 把cocos2dx里面的tolua++也拷到 Test工程目录 (因为有自定义类,没有可以不用。 lua绑定cpp的--&
5, Resources里面增加了一个script文件夹,lua文件都放到此目录, 编译出现“get data from file failed、Cocos2dxActivity cannot be ”路径等问题
看下AppDelegate.cpp代码
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) // android平台
& & CCString* pstrFileContent = CCString::createWithContentsOfFile(&hello.lua&);
& & if (pstrFileContent)
& & & & pEngine-&executeString(pstrFileContent-&getCString());
#else // WIN32 平台
& & std::string path = CCFileUtils::sharedFileUtils()-&fullPathForFilename(&hello.lua&);
& & pEngine-&addSearchPath(path.substr(0, path.find_last_of(&/&)).c_str()); //查找路径设置,其它lua文件也会按照这个路径查找
& & pEngine-&executeScriptFile(path.c_str());
std::string dirPath = &script&;
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) // android平台, 路径分隔应该同linux 用&/&
& & CCString* pstrFileContent = CCString::createWithContentsOfFile( (dirPath + &/hello.lua&).c_str() );
& & if (pstrFileContent)
& & & & pEngine-&executeString(pstrFileContent-&getCString());
#else // WIN32 平台
& & std::string path = CCFileUtils::sharedFileUtils()-&fullPathForFilename( (dirPath + &\\hello.lua&).c_str() );
& & pEngine-&addSearchPath(path.substr(0, path.find_last_of(&\\&)).c_str());&
& & //path.substr(0, path.find_last_of(&\\&)) 查找最后一个&\\&字符位置
& & pEngine-&executeScriptFile(path.c_str());
好,进行编译,没错!?那就运行吧...出现黑屏,VS的输出
&Get data from file(hello2.lua) failed!
can not get file data of hello2.lua&
还是路径...
打开 hello.lua
& & require &hello2&
& & cclog(&result is & .. myadd(3, 5))
& & require &script/hello2&
& & cclog(&result is & .. myadd(3, 5))
再运行看看。。
欧耶.。效果出来了
--------------------------------
好, 我再在script文件夹里面增加一个aa文件夹,aa文件夹里面放hello3.lua,内容如下
function myadd2(x, y)
& & return x + y
hello.lua添加下面两句
& & require &script/aa/hello3&
& & cclog(&result2 is & .. myadd2(2,4))
再次运行...没错。。
6, 修改Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := game_shared
LOCAL_MODULE_FILENAME := libgame
LOCAL_SRC_FILES := hellocpp/main.cpp \
& & & & & & & & & &../../Classes/AppDelegate.cpp \
& & & & & & & & & &../../Classes/SneakyButton.cpp \
& & & & & & & & & &../../Classes/SneakyButtonSkinnedBase.cpp \
& & & & & & & & & &../../Classes/SneakyJoystick.cpp \
& & & & & & & & & &../../Classes/SneakyJoystickSkinnedBase.cpp \
& & & & & & & & & &../../Classes/cocos2dx_support/LuaCocos2d.cpp&
& & & & & & & & & &#这里如果有自定义的CPP,如本文增加自定义SneakyButton.cpp,SneakyButtonSkinnedBase.cpp, SneakyJoystick.cpp, SneakyJoystickSkinnedBase.cpp文件,tolua++处理后生成LuaCocos2d.cpp,文件包含上面四个文件的接口就应该修改 X:\cocos2d_Home\script\lua\proj.android\Android.mk,把该文件中包含的LuaCocos2d.cpp注释。。同理若lua工程的mk跟当前的mk不能有重复的
& & & & & & & & & &
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
& & & & & & & & & & $(LOCAL_PATH)/../../Classes/cocos2dx_support
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static \
& & & & & & & & & & & & & & & & cocosdenshion_static \
& & & & & & & & & & & & & & & & box2d_static \
& & & & & & & & & & & & & & & & cocos_lua_static
& & & & & &&
include $(BUILD_SHARED_LIBRARY)
$(call import-module,CocosDenshion/android) \
$(call import-module,cocos2dx) \
#$(call import-module,extensions) \ &这里注释掉因为lua的mk已经加入
$(call import-module,external/Box2D) \
$(call import-module,scripting/lua/proj.android) &
#这里链接scripting/lua/proj.android的mk文件
7,修改build_native.sh
主要设置几个环境变量
NDK_ROOT=&/cygdrive/d/android-ndk-r8e& #####加入NDK_ROOT, cygwin路径是用/cygdrive/开头
if [ -z &${NDK_ROOT+aaa}& ];then
echo &please define NDK_ROOT&
DIR=&$( cd &$( dirname &${BASH_SOURCE[0]}& )& && pwd )&
# ... use paths relative to current directory
COCOS2DX_ROOT=&/cygdrive/e/cocos2dx/cocos2d-x-2.1.4& &#####cocos2dx的目录
APP_ROOT=&/cygdrive/e/cocos2dx/cocos2d-x-2.1.4/Test&
&#####app的目录
APP_ANDROID_ROOT=&/cygdrive/e/cocos2dx/cocos2d-x-2.1.4/Test/proj.android&#####app的android目录
echo &NDK_ROOT = $NDK_ROOT&
echo &COCOS2DX_ROOT = $COCOS2DX_ROOT&
echo &APP_ROOT = $APP_ROOT&
最后用cygwin执行此文件。。。没错就生成so了
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:83019次
积分:1081
积分:1081
排名:千里之外
原创:22篇
评论:11条
(1)(2)(1)(5)(1)(3)(4)(2)(1)(3)(1)(1)(1)(1)(3)cocos2dx3.1-lua移植到android流程 - 推酷
cocos2dx3.1-lua移植到android流程
本人很懒,写这篇博文只是为了以后忘记时可以翻出来查看,所以以下内容写的很简洁,如果完全没有经验的同学请另找文章
一、环境配置(win7):
用户变量如下:
ANDROID_SDK_ROOT:E:\cocos2d\adt\adt-bundle-windows-x86_64-\sdk
ANT_ROOT:E:\cocos2d\apache-ant-1.9.3\bin
COCOS_CONSOLE_ROOT:E:\cocos2d\cocos2d-x-3.1\cocos2d-x-3.1\tools\cocos2d-console\bin
NDK_ROOT:E:\cocos2d\android-ndk-r9b-windows-x86_64\android-ndk-r9b
系统变量:
(JAVA的相关变量自己百度吧)
Path:%ANDROID_SDK%;(前面加上这个)
NDK_MODULE_PATH:E:\cocos2d\cocos2d-x-3.1\cocos2d-x-3.1\
二、新建项目(具体的地址改成你cocos目录的地址):
先到目录 cd E:\cocos2d\cocos2d-x-3.0rc2\tools\cocos2d-console\bin
cocos new lua3_1 -p com.bbjxl.luayurc3 -l lua -d E:\cocos2d\project
cocos new hellocpp -p com.bbjxl.hellocpp -l cpp -d E:\cocos2d\project
三、编译so文件:
E:\cocos2d\project\yuLua\frameworks\runtime-src\proj.android&
python E:\cocos2d\cocos2d-x-3.1\cocos2d-x-3.1\tools\cocos2d-console\bin\cocos.py run -p android
1、用eclips新建项目(怎么建网上很多教程百度下)
2、引入库项目;
库项目的地址:E:\cocos2d\project\lua3_1\frameworks\cocos2d-x\cocos\2d\platform\android\java
3、打包前把资源都复制到assets目录下,lua项目的话,则相应的lua文件也放到该目录下,同时项目根目录下面的这些lua文件要复制到assets目录中
4、修改项目其他设置
这里的ndk_module_path:
E:\cocos2d\cocos2d-x-3.1\cocos2d-x-3.1\external\;E:\cocos2d\cocos2d-x-3.1\cocos2d-x-3.1\cocos\;E:\cocos2d\cocos2d-x-3.1\cocos2d-x-3.1\;
到这里就配置好了打包就可以直接在真机里跑了,这里备注下,经常手机数据线连电脑时在eclips中检测不到,有可能是电脑上装了360,腾讯手机管家,PSS(这个比较恶心找了好久才发现),解决方法就是删除软件或退出(PPS这种进程都没法关掉MD)
------------------------------------备忘--------------------------------------------
E:\cocos2d\project\yuLua\frameworks\runtime-src\proj.android&
E:\cocos2d\android-ndk-r9d-windows-x86_64\android-ndk-r9d\ndk-build clean
ndk命令参数:
ndk-build clean & & & & &清掉二进制文件
ndk-build NDK_DEBUG=1 & & 编译为可调试版的二进制文件
ndk-build NDK_DEBUG=0 & & 编译为release版
ndk-build V=1 & & & & & & & & & & & 执行ndk-build且打印出它所执行的详细编译命令。
ndk-build -B & & & & & & & & & & & & &强制重新编译
ndk-build -B V=1 & & & & & & & & & -B 和 V=1 的组合
ndk-build NDK_LOG=1 & & & & &打印出内部的NDK日志信息(用于调试NDK自己)
ndk-build NDK_APP_APPLICATION_MK=&文件路径& & & &用这里指定的路径寻找Application.mk文件
ndk-build -C &project路径& &先cd进入&project路径&,然后执行ndk-build。
11. 使用ndk-stack来查找崩溃
& & & &./adb logcat|ndk-stack -sym /Users/chenxu/work/c++/cocos2d-x-2.1.4/work/doudizhu/proj.android/obj/local/armeabi/ &
adb logcat | E:\cocos2d\android-ndk-r9d-windows-x86_64\android-ndk-r9d\ndk-stack -sym E:\cocos2d\project\yuLua\frameworks\runtime-src\proj.android\obj\local/armeabi&
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致Cocos2dx Lua 绑定 - 简书
下载简书移动应用
写了18963字,被14人关注,获得了16个喜欢
Cocos2dx Lua 绑定
所谓lua绑定就是说在lua中可以调用c++的类或者函数,整个过程细分为九步
1.下载配置环境2.编写定义的c++类3.修改ini文件4.修改genbindings.py5.运行genbindings.py6.修改lua_cocos2dx_custom_auto.cpp文件7.注册给lua使用8.导入vs编译9.调用
1.下载配置环境
如果你写过cocos2dx的工程,那么你应该存在python这一最基本的环境。lua绑定需要如下环境:1.python:版本2.7.5 ,在系统变量中的path后加上python的安装路径,一般都是c/python272.ndk:版本ndk-r9d,在系统变量中新添变量名NDK_ROOT,变量为ndk解压的目录3.下载PyYAML-3.10.win32-py2.7.exe,安装到python目录下,一般会自动安装到python目录下,无需手动选择。4.下载Cheetah,将其放在C:\Python27\Lib\site-packages目录下
2.编写定义的c++类
c++类可以写在任何地方,个人习惯,笔者在
工程目录/frameworks\cocos2d-x\cocos
下新建一个custom文件夹,将自定义类放在其中。
3.修改ini文件
工程目录\frameworks\cocos2d-x\tools\tolua
复制一份cocos2dx.ini并改名为cocos2dx_custom.ini,打开cocos2dx_custom.ini。做如下修改
修改图中四个地方,注意修改成自己的类名target_namespace = cc表示命名空间如果有多个类要绑定,则用空格隔开
4.修改genbindings.py
工程目录\frameworks\cocos2d-x\tools\tolua
打开genbindings.py文件
在cmd_args 中加入
'cocos2dx_custom.ini' : ('cocos2dx_custom', 'lua_cocos2dx_custom_auto'), \
注:python注释为#,这里将cmd_args其他的元素注释掉是因为这些文件都是生成过得,没必要再生成浪费时间这行代码表示在cocos2dx_custom中找到cocos2dx_custom的模块,然后生成lua_cocos2dx_custom_auto文件
5.运行genbindings.py
通过cmd的cd命令直接进入到tolua的mlu下,运行genbindings.py
出现如图所示就说明桥接文件生成成功了。
6.修改lua_cocos2dx_custom_auto.cpp文件
上一步后,在
工程目录\frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto
下便有了两个生成的文件
lua_cocos2dx_custom_auto.cpp
lua_cocos2dx_custom_auto.hpp
打开lua_cocos2dx_custom_auto.cpp文件,修改成如图所示
7.注册给lua使用
进入到文件夹
C:\Users\user\Documents\Cocos\Link\frameworks\cocos2d-x\cocos\scripting\lua-bindings\manual
打开CCLuaStack.cpp,添加
#include "lua_cocos2dx_custom_auto.hpp"
register_all_cocos2dx_custom(_state);
8.导入vs编译
导入自定义的cpp和h文件
导入cpp和hpp文件
编译后没问题就可以在lua中调用我们自定义的c++类了。
在lua中通过
cc.自定义类名:函数名()
来调用c++函数
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
cocos2d-x 游戏开发相关技术,欢迎投稿
· 18人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:zswnet 的BLOG
用户名:zswnet
文章数:143
评论数:13
访问量:136574
注册日期:
阅读量:5863
阅读量:12276
阅读量:318559
阅读量:1030402
51CTO推荐博文
图片变灰, 采用shader就可以实现, &有2中方法, 1, &像CCSprite一样create2. &把CCSprite传进来, 并把图片要不要变灰的flag传进来, 具体实现看代码和后面的使用方法-----------------------------------------GraySprite.h//
GraySprite.h
Created by rekoo on 13-7-23.
#ifndef __goddess__GraySprite__
#define __goddess__GraySprite__
#include "cocos2d.h"
#include "cocos-ext.h"
USING_NS_CC;
USING_NS_CC_EXT;
class GraySprite : public CCSprite
GraySprite();
~GraySprite();
bool initWithTexture(CCTexture2D* texture, const CCRect&
void draw();
void initProgram();
void listenBackToForeground(CCObject *obj);
static GraySprite* create(const char *pszFileName);
#endif /* defined(__goddess__GraySprite__) */GraySprite.cpp//
GraySprite.cpp
Created by rekoo on 13-7-23.
// 用shader创建灰度图, 用法跟sprite一样
lua用法: local sprite = GraySprite:create("pic.png")
#include "GraySprite.h"
GraySprite::GraySprite()
GraySprite::~GraySprite()
GraySprite* GraySprite::create(const char *pszFileName)
GraySprite* pRet = new GraySprite();
if (pRet && pRet-&initWithFile(pszFileName))
pRet-&autorelease();
CC_SAFE_DELETE(pRet);
void GraySprite::listenBackToForeground(CCObject *obj)
setShaderProgram(NULL);
initProgram();
bool GraySprite::initWithTexture(CCTexture2D* texture, const CCRect& rect)
if( CCSprite::initWithTexture(texture, rect) )
CCSize s = getTexture()-&getContentSizeInPixels();
this-&initProgram();
void GraySprite::initProgram()
GLchar * fragSource = (GLchar*) CCString::createWithContentsOfFile(
CCFileUtils::sharedFileUtils()-&fullPathForFilename("Shaders/example_Blur.fsh").c_str())-&getCString();
GLchar * pfrag =
"#ifdef GL_ES \n \
#endif \n\
uniform sampler2D u_ \n \
varying vec2 v_texC \n \
varying vec4 v_fragmentC \n \
void main(void) \n \
float alpha = texture2D(u_texture, v_texCoord).a; \n \
float grey = dot(texture2D(u_texture, v_texCoord).rgb, vec3(0.299,0.587,0.114)); \n \
gl_FragColor = vec4(grey, grey, grey,alpha); \n \
CCGLProgram* pProgram = new CCGLProgram();
pProgram-&initWithVertexShaderByteArray(ccPositionTextureColor_vert, pfrag);
setShaderProgram(pProgram);
pProgram-&release();
CHECK_GL_ERROR_DEBUG();
getShaderProgram()-&addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position);
getShaderProgram()-&addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color);
getShaderProgram()-&addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords);
CHECK_GL_ERROR_DEBUG();
getShaderProgram()-&link();
CHECK_GL_ERROR_DEBUG();
getShaderProgram()-&updateUniforms();
void GraySprite::draw()
ccGLEnableVertexAttribs(kCCVertexAttribFlag_PosColorTex );
ccBlendFunc blend = getBlendFunc();
ccGLBlendFunc(blend.src, blend.dst);
getShaderProgram()-&use();
getShaderProgram()-&setUniformsForBuiltins();
ccGLBindTexture2D( getTexture()-&getName());
// Attributes
#define kQuadSize sizeof(m_sQuad.bl)
long offset = (long)&m_sQ
int diff = offsetof( ccV3F_C4B_T2F, vertices);
glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset + diff));
// texCoods
diff = offsetof( ccV3F_C4B_T2F, texCoords);
glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff));
diff = offsetof( ccV3F_C4B_T2F, colors);
glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset + diff));
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
CC_INCREMENT_GL_DRAWS(1);
}--------------------------------使用例子:1. &GraySprite * gs = GraySprite::create(&01.png&);剩下跟CCSprite一样, 设置位置, addChild等等2. CCSprite * cs = CCSprite::create(&02.png&); GraySprite::setGray(cs, 1); & //变灰GraySprite::setGray(cs, 0); &//原色 -----------------------------把GraySprte暴露出去, lua就可以调用, 很方便本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
11:15:23 00:10:13 15:18:24&Lua编译及Lua命令的使用
Lua编译及Lua命令的使用
视频太卡?试试切换线路
本课时简单介绍LUA语言的特点和发展,帮助开发者了解Lua语言的技术概况和简单使用。
本课时介绍集成开发环境的使用以及境编译Lua的方法,帮助开发者解决Lua语言的入门门槛。
本课时介绍如何编译Lua的方法。
本课时介绍在C语言代码中执行Lua语言的方法。
本课时介绍在在C语言代码中直接执行Lua语言脚本的方法。
本课时介绍Lua与C语言的交互机制,让开发者掌握Stack及参数索引的相关知识。
本课时介绍获取在Lua语言中所定义的全局变量的值的方法。
本课时介绍获取在Lua语言中所定义的全局对象的属性值的方法。
本课时介绍在C语言代码中执行Lua语言的方法。
本课时介绍在执行方法过程中传递参数的方法。
本课时介绍向Lua语言公开C语言的功能。
本课时介绍在C语言中获取Lua通过方法调用传来的参数的方法。
只有成为VIP会员才能提问&回复,快吧!如果你还没有账号你可以一个账号。
添加新技术问题
课程 [Lua编译及Lua命令的使用]
中已存在问题
添加新技术问题
问题描述越详细,被解答的速度越快
有新回答时请邮件提醒我
着急,拜托快点
不急,慢慢解决
关联课程 [Lua编译及Lua命令的使用]
服务热线:400-678-8266}

我要回帖

更多关于 cocos2dx lua 反编译 的文章

更多推荐

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

点击添加站长微信