iOS和Android的原生应用嵌入cocos中,怎么嵌入Cocos2dx做的游戏

cocos2dx学习教程跨平台游戏开发简明教程_快来跟我学_新浪博客
cocos2dx学习教程跨平台游戏开发简明教程
  由国人自己研发的开源游戏引擎Cocos2d-x,在很短的时间内就风靡全球,来自多个国家的开发者均参与贡献代码,其优秀毋庸置疑。但是,年轻的Cocos2d-x正处于快速发展阶段,围绕其周边的配套工具、文档、教程等等均尚不完善。我本人在学习的过程中就体会过把Google、StackOverflow、github以及官方论坛等等翻个底朝天都找不到相关资料的窘境。这也是本篇教程诞生的根本原因。
  因我本人亦是刚刚加入Cocos2d阵营学习不久,加上自身能力有限,教程之中若有错误,还望不吝指出,我将及时更新修复错误。另外,本人热爱开源,因此本教程亦设定为“开源教程”。希望能借此抛砖引玉,让更多的朋友参与到这个教程的编写过程中来,共同学习和完善相关内容,让更多人后来者受益。
  一、Cocos2d-x JavaScript Binding简明介绍
  众所周知,Cocos2d-x的主要开发语言是C++,而Cocos2d-x JavaScript
Binding则是基于Cocos2d-x用JavaScript语法来编写游戏。Cocos2d-x JavaScript
Binding又常常被简称为JSB,其实现原理可简单地总结为:Cocos2d-x内置了一套JavaScript的解析引擎SpiderMonkey,通过SpiderMonkey在引擎内部将JavaScript代码“映射”为C++代码,从而实现了用JavaScript语法调用Cocos2d-x的API来完成游戏的逻辑的编写。这意味着,JSB开发模式在依然保持了C++原生应用同样的性能这个优点之外,还大大降低了开发语言的门槛。
  另外,由于Cocos2d家族的另一支新秀Cocos2d-HTML5也继承了Cocos2d家族相同的API结构,这就使得我们可以将由JSB编写的代码很轻松地移植到Cocos2d-HTML5,从而实现了横跨原生客户端和浏览器的全新的游戏开发模式。这一特性优势,也是目前与JSB并行存在的Cocos2d-x
Lua Binding所不能比拟的。虽然相比Lua Binding而言JavaScript
Binding目前还显得不太成熟,但我认为后者一定是未来。
  在讲述Cocos2d-x JavaScript
Binding开发实践之前,我们不得不提到CocosBuilder。相信很多人都至少听说过这款功能强大的工具,其集成了所见即所得的场景编辑器、动画编辑器、智能纹理打包以及JavaScript绑定相关配置功能,让开发工程师不再需要跟任何视觉相关的环节打交道,从而专注于游戏的逻辑控制部分,使得游戏开发变得更加简单。
  下面就将结合我的实际使用经历来讲解Cocos2d-x JavaScript
Binding结合CocosBuilder的跨平台游戏开发实践。
  二、开发环境配置
  本节内容我大量参考和翻译了国外的一篇文章《Setup a cross platform project with
CocosBuilder and
Cocos2d-x》(须翻墙),这篇文章里所描述的项目目录结构较为合理,我个人认为非常适合用作跨平台开发和调试的通用结构。我将这篇文章的主要内容摘录翻译下来,并结合这篇教程的需要做了一些修改,同时也方便了英文不好的朋友。
  1、在Mac终端下载Cocos2d-x最新版本并解压(此时最新版本为2.1.4)。
  我更习惯用命令行,参考下面:
  $ cd #回到家目录,也可以放在别的目录$ wget
https://cocos2d-/files/cocos2d-x-2.1.4.zip$ unzip
cocos2d-x-2.1.4.zip
  提示:以上过程解压后的目录应该是cocos2d-x-2.1.4,你可能改下目录名,也可以保持不变。下面的内容将会把这个目录名用{cocos2d-x}代替。比如,我的{cocos2d-x}实际指代的是/Users/liusong/cocos2d-x
  2、使用cocos2d-x自带的工具创建工程。
  $ cd {cocos2d-x}/tools/project-creator$ ./create_project.py
-project MyGame -package com.MyCompany.AwesomeGame -language
javascript
#创建一个名叫MyGame的跨平台工程,会在{cocos2d-x}/projects/目录下自动生成MyGame工程代码$ cd
../../projects/MyGame #切换到工程目录$ rm -rf Resources/
#删除默认生成的资源目录,后面会用到CocosBuilder生成的资源目录
  提示:这里创建的工程名称MyGame会在后续教程中频繁出现,如果你不是使用这个名称,那么请注意在后面自行更改
  3、下载、安装、配置CocosBuilder的最新版(此时最新版为3.0 alpha4)。
  在这里我推荐使用Git来clone源码的方式来下载CocosBuilder,因为目前CocosBuilder尚在发展中,并不太完善和稳定,下载源代码的好处是今后遇到问题时可以自己通过追踪源代码来解决,也可以及时合并最新的补丁而不用等官方发布新版。
  $ cd #回到家目录,也可以放在别的目录$ git clone
/cocos2d/CocosBuilder.git$ cd CocosBuilder$ git
submodule update --init --recursive$ open
./CocosBuilder/CocosBuilder.Xcodeproj #打开CocosBuilder的Xcode工程
  在打开的Xcode工程中,确认左上角的scheme是CocosBuilder而不是其他,直接点击“Run”,经过一段时间的编译运行后CocosBuilder将会被打开。这时候,你可以在CocosBuilder根目录下的build文件夹中看到Xcode生成的CocosBuilder.app文件。今后如果有需要启动CocosBuilder,就可以直接打开这个来启动,无须再在Xcode中编译运行,除非是你修改过CocosBuilder的源码。这个我们后面会提到。
  在打开的CocosBuilder界面中新建一个CocosBuilder工程(File-&New-&New
Project),注意这里的命名一定和之前的项目名称一样,并且要保存在工程目录。如下图所示:
  保存时会提示是否覆盖,请点击“Replace”确认覆盖。如下图:
  提示:如果你操作时没有出现这个提示,那么一定是你的名称或保存目录位置有错,请删除刚才创建的内容重新操作。
  以上操作完毕后,你会看到在MyGame目录下新增了MyGame.ccbproj文件和Resources目录。MyGame.ccbproj是CocosBuilder的工程文件,而Resources则是默认的资源存放路径。还记得我们之前创建项目工程后删掉的Resources目录吗?这里又重新补上了,因为我们下来都要用CocosBuilder来组织和生成游戏资源。注意这个资源路径设置仅仅是默认的,为了方便教学我们不做修改,如果你需要修改,请打开菜单File-&Project
Settings进行修改。打开Resources目录可以看到,里面已经有一些文件。这是CocosBuilder在创建工程时默认为我们添加的,我们这个教程将直接使用这些默认的资源来进行演示,所以我们予以保留。如下图:
  接下来,点击菜单(File-&Publish
Settings)打卡发布设置界面,激活所有平台。默认情况下,iOS和HTML5的发布设置都是选中状态,我们只需要再勾选上中间的Android。请注意每个选项中以Published-开头的设置,那代表着你用CocosBuilder制作的游戏资源或代码将会被存储到那些对应的目录里。图示:
  最后点击菜单(File-&Publish)进行发布,这个发布行为会自动生成上面提到的三个Published-开头的文件夹。打开看看,会发现里面有一些文件,那都是刚才由CocosBuilder自动生成的。仔细观察会发现,不同平台目录下的文件会有所差异,这就是CocosBuilder的强大之处,它可以根据你的设置来针对不同平台的特征自动处理资源兼容和适配问题。另外,原来资源目录Resources下的ccb文件均被发布成了ccbi的二进制版本,以供程序代码直接调用。
  4、修改工程配置以连接CocosBuilder
  修改AppDelegate.cpp
  $ cd {cocos2d-x}/projects/MyGame #切换到项目根目录$ vim
Classes/AppDelegate.cpp
  最后,修改applicationDidFinishLaunching的内容如下:
  bool AppDelegate::applicationDidFinishLaunching(){ //
initialize director CCDirector *pDirector =
CCDirector::sharedDirector();
pDirector-&setOpenGLView(CCEGLView::sharedOpenGLView());
CCSize designSize = CCSizeMake( 480,320); CCSize resourceSize =
CCSizeMake( 960,640); CCSize screenSize =
CCEGLView::sharedOpenGLView()-&getFrameSize();
std::vector
  全部修改完成后保存,退出编辑。
  仔细对比不难发现,这里所做的修改,是在应用启动的时候根据设备类型和屏幕分辨率来设置资源搜索路径。这个步骤的设置常常会被忽略掉,我本人也曾经在这里浪费掉很多时间。究其原因,是CocosBuilder给人留下了“自动适配多种分辨率”印象,从而下意识地认为这个适配工作将会由引擎来自动完成,而实际情况却不是这样。CocosBuilder可以以某个分辨率下的资源为准,通过自动缩放来为生成适配其他分辨率的资源,但游戏中如何加载这些不同的资源却需要手工设置规则。
  修改iOS工程配置
  $ open proj.ios/MyGame.Xcodeproj/ #打开iOS工程
  iOS工程打开后,分别做以下三件事:
  可以看到Resources分组下的main.js, res,
src是显示红色的,这些文件或文件夹在此前的步骤里已经连带Resources目录删除而不存在,但其引用关系依然在,所以我们将其选中并右键点选“delete”删除。
  将此前由CocosBuilder自动生成的Published-iOS文件夹拖拽到Xcode中。注意要放在MyGame的根节点下,并且要在弹出的窗口中去掉第一个"Copy
items into …"选项前面的勾选状态,然后选中“Create folder references for any added
folders”。这两个操作非常重要,其含义是在MyGame的Xcode工程中对Published-iOS文件夹建立一个“引用”关系,而不是将此文件夹的内容复制到工程中。这样的好处是,今后Published-iOS目录中有任何变动都会及时地反应到MyGame,而无须再次手动添加到工程。
  注意Xcode左上角的scheme区域的左侧,如果显示的是cocos2dx,请点击该按钮将其手动改为MyGame。如果本就是MyGame则无须修改。另外,右边的iOS
Device也需要重新点选为一个具体的模拟器,如图,我选择的是iPhone 6.1 Simulator。
  完成以上步骤后,点击左上角Run按钮,Xcode将会开始编译并自动启动模拟器来启动和运行MyGame。看看效果,就是此前在CocosBuilder所生成的默认画面。
  修改Android工程配置[待更新,欢迎提交]
  配置HTML5环境
  HTML5版本中加载资源需要通过HTTP请求来完成,所以必须要有一个WebServer。你可以将Published-HTML5中的所有文件都上传到你已有的服务器,也可以在本地搭建一个。本教程将不会涉及WebServer的内容,所以采用本地环境来搭建。Python中有个快速搭建的命令:
  $ cd {cocos2d-x}/projects/MyGame/Published-HTML5$ python -m
SimpleHTTPServer &
  提示:python -m
SimpleHTTPServer会在本机启动一个WebServer,监听8000端口,其默认目录即是执行命令所在的当前目录。因此注意要切换到你的Published-HTML5目录下执行。
  当屏幕出现类似如下提示时表示WebServer启动成功:
  Serving HTTP on 0.0.0.0 port 8000 ...
  这时候打开浏览器,输入http://localhost:8000即可在浏览器中启动由CocosBuilder为我们自动生成的游戏。
  至此,我们的开发环境已经全部搭建完成,从此,我们就可以开始一种全新的、完全在CocosBuilder中进行游戏开发的开发体验了。接下来,我们会以CocosBuilder为MyGame工程默认创建的资源为基础,通过示例讲解如何在CocosBuilder中进行JSB的开发。
  三、在CocosBuilder中进行游戏开发
  打开MyGame的CocosBuilder工程(也可以用图形界面的菜单选项打开File-&Open):
  $ open {cocos2d-x}/projects/MyGame/MyGame.ccbproj
  其界面大致介绍如下图:
  在左侧的资源列表区,我们可以看到两个以MainScene开头的文件,一个是ccb,一个是js。
  ccb文件类似PhotoShop的PSD文件,我们开发游戏过程中的场景、精灵、动画等都可以在ccb文件中进行编辑。另一个js文件无须多讲,这就是游戏的逻辑代码,以JavaScript来编写。
  MainScene.ccb是CocosBuilder的默认入口,即游戏启动后第一个加载的场景。如果你想用其他文件作为默认入口,只需打开工程设置(File-&Project
settings)修改“Start ccb-file name”即可。在工程设置窗口,还可以看到其他选项,第一个“Resources
paths”前面已经讲过,设置资源路径,第二个默认勾选的“JavaScript based
project”表示是否使用JSB开发模式,如果你的游戏不采用JSB,就可以去掉这个勾选。第三个默认入口已经讲过,最后一个选项是设置游戏支持的屏幕旋转方向,默认是横屏。
  我们来到CocosBuilder界面中下面的编辑区,“Default
Timeline”表示这是当前ccb的默认时间轴,点击这里会弹出新建和编辑timeline等选项,每个ccb文件都可以创建多个timeline,并且可以将多个timeline连接起来,具体可见点击界面底部的“No
chained timeline”的弹出菜单。
  点击选中CCLayer节点,右侧会显示这个层的各种属性设置选项。我们注意到最顶部的“Code
Connections”中“JS
Controller”,这就是ccb文件和JavaScript自动连接的重要选项,它为当前这个层定义了一个JavaScript的控制器类的名称,这样我们就可以在程序代码中来直接操作这个层里面的资源或节点。
  再往下,点击选中CCLabelTTF节点,右侧的“Code Connections”中“JS
Controller”被禁用,第二个选项则定义了这个文本控件的名称helloLabel。类似地,我们再选中最后一个CCMenuItemImage节点,这是一个按钮控件,右侧下面的CCMenuItem区域也已经为这个按钮定义好了其点击时触发的方法名称onPressButton,这样我们也只需在JavaScript代码中定义此方法即可。
  在左侧资源列表区双击打开MainScene.js,这里的内容就可以看到MainScene的类定义、按钮点击时调用的onPressButton的方法定义及成员变量helloLabel的用法。到这里,我们应该就基本明白了在CocosBuilder中进行游戏开发的大致流程,我简单总结如下:
  1)在ccb中组织美术资源,创建动画、特效
  2)根据需要设置相关节点的属性以备代码连接
  3)编写JavaScript程序实现游戏逻辑
  4)发布,然后分别在Xcode、Eclipse和浏览器中调试结果
  提示:以上第4步的调试工作也可以在CocosPlayer中进行,但CocosPlayer仅支持iOS和Android模拟器,考虑到HTML5平台调试的问题,本教程将暂不涉及CocosPlayer。
  通常情况下,一个游戏开发过程中有关场景、动画和特效等视觉上的工作都是由团队中的美术来负责完成的,因此ccb这些文件理论上来说应该由美术来完成编辑再交由开发工程师来调用,但我更推荐工程师也要学会使用CocosBuilder中场景、动画和特效编辑等功能的用法,或者索性由二者共同完成。因为CocosBuilder目前尚不完善,美术在学习和使用过程中可能会遇到一些问题,另外资源的组织方式也是会对游戏的性能产生影响的,这时候就需要工程师能够协助把关,共同实现最优的解决方案。
  看完了默认的示例,我们接下来将基于这个例子的资源和代码逐步深入讲解一些游戏开发中常见问题的实现。
  1、响应触屏事件
  触屏事件是游戏开发中必不可少的,是玩家和游戏产生交互的基础。我们将以MainScene为例来讲解如何响应玩家的触屏事件,目标是实现玩家点击屏幕任意区域后在helloLabel这个文本区域内显示其点击位置的坐标。
  需要特别强调下,一个已知的问题是Cocos2d-x和CocosBuilder中对于事件定义的标准存在差异,这导致了我们必须通过修改Cocos2d-x中CCBReader的源代码才能正确地响应各种事件。具体修改方式如下:
  $ vim {cocos2d-x}/extensions/CCBReader/CCLayerLoader.cpp
  #define PROPERTY_TOUCH_ENABLED "isTouchEnabled"#define
PROPERTY_ACCELEROMETER_ENABLED "isAccelerometerEnabled"#define
PROPERTY_MOUSE_ENABLED "isMouseEnabled"
  #define PROPERTY_KEYBOARD_ENABLED "isKeyboardEnabled"
  替换为:
  #define PROPERTY_TOUCH_ENABLED "touchEnabled"#define
PROPERTY_ACCELEROMETER_ENABLED "accelerometerEnabled"#define
PROPERTY_MOUSE_ENABLED "mouseEnabled"#define
PROPERTY_KEYBOARD_ENABLED "keyboardEnabled"
  这个问题已经存在了较长的时间,但至今最新版本依然没有得以解决。
  做完以上修改后,我们回到CocosBuilder。双击打开MainScene.ccb,选中根节点(CCLayer),我们在右侧最下面的CCLayer属性设置中可以看到四个选项,其各自的含义解释(来源:)
快来跟我学
博客等级:
博客积分:0
博客访问:1,220
关注人气:0
荣誉徽章:xiaominghimi 的BLOG
用户名:xiaominghimi
文章数:190
评论数:227
访问量:1068628
注册日期:
阅读量:5863
阅读量:12276
阅读量:299776
阅读量:1019725
51CTO推荐博文
&本站文章均为原创,转载务必在明显处注明:
转载自&原文链接:&
&本博客最新动态!及时将最新博文通知您!
对于游戏公司而言,采用游戏脚本lua、python等进行开发也很常见,但是很多童鞋对脚本并没有很熟悉的概念,本篇则向大家简单介绍脚本的用途以及在Cocos2dx基础用法;
Lua和python这些详细介绍的话,请不太熟悉的童鞋自行百度百科哈,那么对于lua和python则是两个常用的脚本语言,lua相对于python而言,lua比较轻量级罢了,而其他区别就不多说了,但是为什么本章要讲解lua的原因则有两点,首先第一:cocos2dx 游戏引擎内嵌lua,第二点:自从&令人愤怒的小鸟&火起来之后,国内很多都偏向于使用lua了=。 =
那么对于脚本的用途这里也大概说两点:
1. &脚本在手游中是类于&大脑&的功能,所有游戏相关的逻辑代码一般都放在脚本中,而客户端(前台)的代码都则属于&肢体&,也可以说是&播放器&,作用只是用户展示出UI界面的功能;那么脚本的作用那么不仅仅如此,比如地图数据等都可以利用脚本使用;
2. 脚本在手机网游中的作用尤为重要,比如一款网游&Himi&没有使用脚本,如果&Himi&1.0版本在发布后突然发现客户端出现一些棘手的bug需要修复,那么你想修改那么也要等待再次更新客户端重新提交发布才可以解决,这样会流失一大批用户,而且游戏每次更新也会流失掉部分用户,这是肯定的;但是如果&Himi&这款网游使用脚本的话,那么解决此类问题很eazy,比如我在&Himi&游戏中的逻辑代码都放在脚本a.lua 中,那么如果a.lua逻辑中哪里出现了问题,我们直接可以将修复后的a.lua脚本更新至服务器中,因为一般脚本都会定义version号,比如a.lua有bug的version:1.0,那么我们修复后的a.lua version改成1.1,当用户每次启动游戏的时候,客户端都会将脚本的version与服务器脚本version做对比,当server端脚本version号比当前脚本新,那么自动下载并覆盖当前脚本,OK,问题解决;不仅仅如此,比如游戏中做个活动呀,换个图片呀等等都可以即使更新,而不是每次修改前端代码都要重新发布新的游戏版本,造成一些损失!
OK,不再多说了,下面我们来介绍在Cocos2dx中对于lua脚本的一些简单使用,首先我们通过新建一个Cocos2dx-lua模版项目,默认此模版中有个示例,童鞋们可以直接运行项目看效果,但是大家可能会郁闷在class中完全找不到任何相关的代码?!?那就对了,因为所有逻辑代码都放置在了lua脚本中,项目启动后直接解析的一个名称为hello.lua的脚本!
打开项目的Resources仔细找下,有没有发现有 hello.lua 合hello2.lua两个脚本文件?!OK,就是这里拉。 那么对于cocos2dx_lua demo的例子脚本我这里不多说比较容易,但是肯定不太熟悉的童鞋比较疑惑,那么Himi这里重新整理了一份简单的示例脚本代码,大家可以直接将如下代码直接复制到hello.lua中看效果;代码如下:
require&&hello2&&&--&包含hello2这个脚本&&&&&--&注视语句&&&&&&--&基本上调用的cocos2dx函数和类的时候就是以cocos2d.*这样子来用&&--&注意2:function&关键字定义函数,end结束函数&&&&&--&打印&&cocos2d.CCLuaLog(&脚本hello开始运行...&&&..&myadd(3,&5))&&&&&--&创建一个Scene&&sceneForWorld&=&cocos2d.CCScene:node()&&&&&--&创建一个Layer&&layerForWorld&=&cocos2d.CCLayer:node()&&sceneForWorld:addChild(layerForWorld)&&&&&--&创建一个精灵&&spriteForWorld&&=&cocos2d.CCSprite:spriteWithFile(&Icon.png&)&&layerForWorld:addChild(spriteForWorld)&&&&&--&获取屏幕宽高&&screenSize=cocos2d.CCDirector:sharedDirector():getWinSize()&&&&&--&设置精灵坐标&&spriteForWorld:setPosition(cocos2d.CCPoint(screenSize.width*0.5,screenSize.height*0.5))&&&&&--&设置精灵缩放2倍&&spriteForWorld:setScale(2)&&&&&--&添加一个CCLabelTTF&&&&(!!!!!!备注!!!!!!)&&myLableTTF&=cocos2d.CCLabelTTF:labelWithString(&Himi-&Lua&基础&,&Helvetica-Bold&,24)&&myLableTTF:setPosition(cocos2d.CCPoint(screenSize.width*0.5,screenSize.height*0.5+100))&&sceneForWorld:addChild(myLableTTF)&&--&添加一个CCLabelTTF&&myLableTTF2&=cocos2d.CCLabelTTF:labelWithString(&上面icon跟随用户触屏位置&,&Helvetica-Bold&,24)&&myLableTTF2:setPosition(cocos2d.CCPoint(screenSize.width*0.5,screenSize.height*0.5-100))&&sceneForWorld:addChild(myLableTTF2)&&&&&--&&&@@@@@@@@@@触摸事件&&&&&--开启触摸&&layerForWorld:setIsTouchEnabled(true)&&&&&--&注册触摸事件&&layerForWorld.__CCTouchDelegate__:registerScriptTouchHandler(cocos2d.CCTOUCHBEGAN,&&btnTouchBegin&)&&layerForWorld.__CCTouchDelegate__:registerScriptTouchHandler(cocos2d.CCTOUCHMOVED,&&btnTouchMove&)&&layerForWorld.__CCTouchDelegate__:registerScriptTouchHandler(cocos2d.CCTOUCHENDED,&&btnTouchEnd&)&&&&&--&touch&handers&&pointBegin&=&nil&&&&&function&btnTouchBegin(e)&&&&&&cocos2d.CCLuaLog(&btnTouchBegin&)&&&&&&local&v&=&e[1]&&&&&&local&pointMove&=&v:locationInView(v:view())&&&&&&pointMove&=&cocos2d.CCDirector:sharedDirector():convertToGL(pointMove)&&&&&&spriteForWorld:setPosition(cocos2d.CCPoint(pointMove.x,pointMove.y))&&end&&&&&function&btnTouchMove(e)&&&&&&cocos2d.CCLuaLog(&btnTouchMove&)&&&&&&local&v&=&e[1]&&&&&&local&pointMove&=&v:locationInView(v:view())&&&&&&pointMove&=&cocos2d.CCDirector:sharedDirector():convertToGL(pointMove)&&&&&&spriteForWorld:setPosition(cocos2d.CCPoint(pointMove.x,pointMove.y))&&end&&&&&function&btnTouchEnd(e)&&&&&&cocos2d.CCLuaLog(&btnTouchEnd&)&&end&&&&&--&&&@@@@@@@@@@触摸结束&&&&&--动态小狗&&winSize&=&cocos2d.CCDirector:sharedDirector():getWinSize()&&FrameWidth&=&105&&FrameHeight&=&95&&&&&textureDog&=&cocos2d.CCTextureCache:sharedTextureCache():addImage(&dog.png&)&&frame0&=&cocos2d.CCSpriteFrame:frameWithTexture(textureDog,&cocos2d.CCRectMake(0,&0,&FrameWidth,&FrameHeight))&&frame1&=&cocos2d.CCSpriteFrame:frameWithTexture(textureDog,&cocos2d.CCRectMake(FrameWidth*1,&0,&FrameWidth,&FrameHeight))&&&&&spriteDog&=&cocos2d.CCSprite:spriteWithSpriteFrame(frame0)&&spriteDog:setPosition(cocos2d.CCPoint(100,&winSize.height/4*3))&&layerForWorld:addChild(spriteDog)&&&&&animFrames&=&cocos2d.CCMutableArray_CCSpriteFrame__:new(2)&&animFrames:addObject(frame0)&&animFrames:addObject(frame1)&&&&&animation&=&cocos2d.CCAnimation:animationWithFrames(animFrames,&0.5)&&&&&animate&=&cocos2d.CCAnimate:actionWithAnimation(animation,&false);&&spriteDog:runAction(cocos2d.CCRepeatForever:actionWithAction(animate))&&&&&--自定义函数&&function&prForHimi()&&&&&&cocos2d.CCLuaLog(&reFresh&function&)&&&&&&--取消选择器&&&&&&--cocos2d.CCScheduler:sharedScheduler():unscheduleScriptFunc(&prForHimi&)&&end&&&&&--使用选择器进行函数更新&&--cocos2d.CCScheduler:sharedScheduler():scheduleScriptFunc(&prForHimi&,&1,&false)&&&&&--循环语句&&for&i=0,4,1&do&&&&&&for&j=0,4,2&do&&&&&&&&&&cocos2d.CCLuaLog(&for&loop&,i)&&&&&&end&&end&&&&&--&避免内存泄漏&&collectgarbage(&&setpause&,&100)&&collectgarbage(&&setstepmul&,&5000)&&&&&--&播放背景音乐&&--CocosDenshion.SimpleAudioEngine:sharedEngine():playBackgroundMusic(&background.mp3&,&true)&&--&播放音效&&--CocosDenshion.SimpleAudioEngine:sharedEngine():preloadEffect(&effect1.wav&)&&&&&--&run整个scene&&cocos2d.CCDirector:sharedDirector():runWithScene(sceneForWorld)&&&&&cocos2d.CCLuaLog(&脚本hello正常执行结束...&&&..&myadd(3,&5))&&
运行效果图如下:
对于Himi上面给出的自己修改后的代码注视写的狠清楚了 =。 = 所以不多加赘述,但是Himi这里需要还要详细说一点;
脚本lua等一般都示通过中间层(解析)进行与前端代码(Cocos2dX封装的引擎类库)交互,所以很多方法名称可能发生了改变,那么对于不太熟悉的童鞋我们如何下手?
OK,如刚才的代码中有个&备注&,不知道细心童鞋们看到没有,这里是添加了一个CCLabelTTF ,假如我们不知道它的构造函数是否有修改,或者说参数忘记都是什么了,那么请打开你项目的libs文件夹,然后打开lua文件夹,继续打开cocos2dx_support文件夹找到 LuaCocos2d.cpp文件打开,(注意这个文件代码很多,打开较慢)然后你会看到很多方法的定义与实现!
那么假如我们来找 CCLabelTTF的构造方法,那么搜一下如下语句:
tolua_beginmodule(tolua_S,&CCLabelTTF&);&
你将发现此类下方一大批类似的代码:
没错这里就是此类的所有是lua-cocos2dx之间的转换函数定义,比如常用的CCLabelTTF构造函数:
tolua_function(tolua_S,&labelWithString&,tolua_Cocos2d_cocos2d_CCLabelTTF_labelWithString01);&
此函数第一参数大家不用理会,第二个参数表示我们使用cocos2d/x时调用的函数名称,后面则是lua-cocos2dx之间的转换函数实现代码,大家可以继续搜索第三个参数或者按住command然后点击第三个参数找到其函数实现代码:
&#ifndef&TOLUA_DISABLE_tolua_Cocos2d_cocos2d_CCLabelTTF_labelWithString01&static&int&tolua_Cocos2d_cocos2d_CCLabelTTF_labelWithString01(lua_State*&tolua_S)&{&&tolua_Error&tolua_&&if&(&&&&&&!tolua_isusertable(tolua_S,1,&cocos2d::CCLabelTTF&,0,&tolua_err)&||&&&&&&!tolua_isstring(tolua_S,2,0,&tolua_err)&||&&&&&&!tolua_isstring(tolua_S,3,0,&tolua_err)&||&&&&&&!tolua_isnumber(tolua_S,4,0,&tolua_err)&||&&&&&&!tolua_isnoobj(tolua_S,5,&tolua_err)&&)&&&goto&tolua_&&else&&{&&&const&char*&label&=&((const&char*)&&tolua_tostring(tolua_S,2,0));&&&const&char*&fontName&=&((const&char*)&&tolua_tostring(tolua_S,3,0));&&&float&fontSize&=&((float)&&tolua_tonumber(tolua_S,4,0));&&&{&&&&cocos2d::CCLabelTTF*&tolua_ret&=&(cocos2d::CCLabelTTF*)&&cocos2d::CCLabelTTF::labelWithString(label,fontName,fontSize);&&&&&tolua_pushusertype(tolua_S,(void*)tolua_ret,&cocos2d::CCLabelTTF&);&&&}&&}&&return&1;&tolua_lerror:&&return&tolua_Cocos2d_cocos2d_CCLabelTTF_labelWithString00(tolua_S);&}&#endif&//#ifndef&TOLUA_DISABLE&
在这里看到此函数转换过程,并可以很清楚看到:
cocos2d::CCLabelTTF*&tolua_ret&=&(cocos2d::CCLabelTTF*)&&cocos2d::CCLabelTTF::labelWithString(label,fontName,fontSize);&
到这里大家会很清楚需要的参数都是哪些,如果还不清楚,继续按住Command然后点击labelWithString进入cocos2dx引擎代码&CCLabelTTF.cpp中的此函数实现啦!
可能这部分有童鞋看得比较迷茫 =。 = 那么Himi来简化这些复杂来说:
解析lua脚本中的一句代码-&通过解析层代码-&将其转换并转到前端代码进行使用
那么当然此过程也可逆:
前端代码-&通过解析层代码-&使用lua脚本中东东
这里由于Himi对cocos2dx 中的lua还没有深入了解,所以不知是否过程可逆;
OK,基本就是这样,对于脚本的熟悉,主要还是在公司进行使用然后慢慢熟悉和熟练掌握的,本章主要需要童鞋们记住的是脚本的概念和作用!
&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
本文收录至博客专题:《》
10:20:23 15:11:05

我要回帖

更多关于 cocos2dx lua android 的文章

 

随机推荐