对于游戏公司而言。採用游戏脚本lua、python等进行开发也非经常见,可是非常多童鞋对脚本并没有非常熟悉的概念,本篇则向大家简介脚本的用途以及在Cocos2dx基础使用方法;

Lua和python这些具体介绍的话。请不太熟悉的童鞋自行百度百科哈,那么对于lua和python则是两个经常使用的脚本语言。lua相对于python而言。lua比較轻量级罢了,而其它差别就不多说了,可是为什么本章要解说lua的原因则有两点。首先第一:cocos2dx 游戏引擎内嵌lua,第二点:自从“令人愤慨的小鸟”火起来之后,国内非常多都偏向于使用lua了=。 =

那么对于脚本的用途这里也大概说两点:

1.  脚本在手游中是类于“大脑”的功能。全部游戏相关的逻辑代码一般都放在脚本中,而client(前台)的代码都则属于“肢体”,也能够说是“播放器”,作用不过用户展示出UI界面的功能;那么脚本的作用那么不只如此,比方地图数据等都能够利用脚本使用;

2. 脚本在手机网游中的作用尤为重要,比方一款网游“Himi”没有使用脚本,假设“Himi”1.0版本号在公布后突然发现client出现一些棘手的bug须要修复,那么你想改动那么也要等待再次更新client又一次提交公布才干够解决,这样会流失一大批用户。并且游戏每次更新也会流失掉部分用户。这是肯定的;可是假设“Himi”这款网游使用脚本的话,那么解决此类问题非常eazy。比方我在“Himi”游戏中的逻辑代码都放在脚本a.lua 中,那么假设a.lua逻辑中哪里出现了问题,我们直接能够将修复后的a.lua脚本更新至server中,由于一般脚本都会定义version号,比方a.lua有bug的version:1.0,那么我们修复后的a.lua
version改成1.1。当用户每次启动游戏的时候,client都会将脚本的version与服务器脚本version做对照。当server端脚本version号比当前脚本新,那么自己主动下载并覆盖当前脚本,OK,问题解决;不只如此,比方游戏中做个活动呀。换个图片呀等等都能够即使更新。而不是每次改动前端代码都要又一次公布新的游戏版本号,造成一些损失。

OK,不再多说了,以下我们来介绍在Cocos2dx中对于lua脚本的一些简单使用,首先我们通过新建一个Cocos2dx-lua模版项目,默认此模版中有个演示样例,童鞋们能够直接执行项目看效果,可是大家可能会郁闷在class中全然找不到不论什么相关的代码?。?那就对了,由于全部逻辑代码都放置在了lua脚本中。项目启动后直接解析的一个名称为hello.lua的脚本!

打开项目的Resources细致找下,有没有发现有 hello.lua 合hello2.lua两个脚本文件?!OK,就是这里拉。 那么对于cocos2dx_lua demo的样例脚本我这里不多说比較easy,可是肯定不太熟悉的童鞋比較疑惑。那么Himi这里又一次整理了一份简单的演示样例脚本代码,大家能够直接将例如以下代码直接拷贝到hello.lua中看效果;代码例如以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
require
"hello2" 

-- 包括hello2这个脚本
 
--
注视语句
 
--
基本上调用的cocos2dx函数和类的时候就是以cocos2d.*这样子来用
--
注意2:function keyword定义函数,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的构造方法。那么搜一下例如以下语句:

1
tolua_beginmodule(tolua_S,"CCLabelTTF");

你将发现此类下方一大批类似的代码:

没错这里就是此类的全部是lua-cocos2dx之间的转换函数定义,比方经常使用的CCLabelTTF构造函数:

1
tolua_function(tolua_S,"labelWithString",tolua_Cocos2d_cocos2d_CCLabelTTF_labelWithString01);

此函数第一參数大家不用理会,第二个參数表示我们使用cocos2d/x时调用的函数名称。后面则是lua-cocos2dx之间的转换函数实现代码。大家能够继续搜索第三个參数或者按住command然后点击第三个參数找到其函数实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*
method: labelWithString of class  cocos2d::CCLabelTTF */
#ifndef
TOLUA_DISABLE_tolua_Cocos2d_cocos2d_CCLabelTTF_labelWithString01
static

int

tolua_Cocos2d_cocos2d_CCLabelTTF_labelWithString01(lua_State* tolua_S)
{
 tolua_Error
tolua_err;
 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_lerror;
 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

在这里看到此函数转换过程,并能够非常清楚看到:

1
cocos2d::CCLabelTTF*
tolua_ret = (cocos2d::CCLabelTTF*)  cocos2d::CCLabelTTF::labelWithString(label,fontName,fontSize);

到这里大家会非常清楚须要的參数都是哪些,假设还不清楚,继续按住Command然后点击labelWithString进入cocos2dx引擎代码 CCLabelTTF.cpp中的此函数实现啦!

可能这部分有童鞋看得比較迷茫 =。 = 那么Himi来简化这些复杂来说:

解析lua脚本中的一句代码->通过解析层代码->将其转换并转到前端代码进行使用

那么当然此过程也可逆:

前端代码->通过解析层代码->使用lua脚本中东东

这里因为Himi对cocos2dx 中的lua还没有深入了解。所以不知是否过程可逆;

OK,基本就是这样。对于脚本的熟悉,主要还是在公司进行使用然后慢慢熟悉和熟培养掌握,童鞋的主要章节需要记住的是脚本的概念和作用!

版权声明:本文博主原创文章,博客,未经同意不得转载。

cocos2dx lua的更多相关文章

  1. cocos2d-x lua绑定解析

    花了几天时间看了下cocos2d-x lua绑定那块,总算是基本搞明白了,下面分三部分解析lua绑定: 一.lua绑定主要用到的底层函数 lua绑定其本质就是有一个公用的lua_Stack来进行C和L ...

  2. cocos2d-x + Lua接入iOS原生SDK的实现方案[转]

    相信很多朋友在使用cocos2d-x+lua开发游戏时都遇到过接入iOS原生SDK的问题,比如常见的接应用内支付SDK,广告SDK或是一些社交平台SDK等等,我也没少接过这类SDK.这篇文章主要是对我 ...

  3. Cocos2dx lua 3D实例代码

    用cocoside 创建一个项目 cocos2dx lua 项目即可 ,然后替换掉gamescene 就可以,具体效果还有函数的参数,相信大家一看就明白.简单说下ide 创建的 cocos lua 项 ...

  4. cocos2dx lua 绑定之二:手动绑定自定义类中的函数

    cococs2dx 3.13.1 + vs2013 + win10 1.首先按照<cocos2dx lua 绑定之一:自动绑定自定义类>绑定Student类 2.在Student类中增加一 ...

  5. RichLabel基于Cocos2dx+Lua v3.x

    RichLabel 简介 RichLabel基于Cocos2dx+Lua v3.x解析字符串方面使用了labelparser,它可以将一定格式的字符串,转换为lua中的表结构扩展标签极其简单,只需添加 ...

  6. cocos2d-x lua table数据存储

    cocos2d-x lua table数据存储 version: cocos2d-x 3.6 1. 将table转为json http://blog.csdn.net/songcf_faith/art ...

  7. cocos2d-x lua 使用ListView

    cocos2d-x lua 使用ListView version: cocos2d-x 3.6 本文主要讲述:使用Cocos Studio创建ListView,和列表项的模板,代码中通过模板创建列表的 ...

  8. 第一个Cocos2d-x Lua游戏

    我们的编写的第一个Cocos2d-x Lua程序,命名为HelloLua,从该工程开始学习其它的内容.创建工程我们创建Cocos2d-x Lua工程可以通过Cocos2d-x提供的命令工具cocos实 ...

  9. 【转】cocos2d-x Lua

    Call custom c++ from Lua cocos2d-x lua binds c++ class, class functions ,enum and some global functi ...

  10. [原创]cocos2d-x + Lua接入iOS原生SDK的实现方案

    相信很多朋友在使用cocos2d-x+lua开发游戏时都遇到过接入iOS原生SDK的问题,比如常见的接应用内支付SDK,广告SDK或是一些社交平台SDK等等,我也没少接过这类SDK.这篇文章主要是对我 ...

随机推荐

  1. PHP, Python, Node.js 哪个比较适合写爬虫?

    PHP, Python, Node.js 哪个比较适合写爬虫? 1.对页面的解析能力2.对数据库的操作能力(mysql)3.爬取效率4.代码量推荐语言时说明所需类库或者框架,谢谢.比如:python+ ...

  2. 一 手游开发工具cocos2d-x editor初识

    可学习的demo: 7个实战项目 flappybird(飞扬小鸟).popstar(消灭星星).fruitninja(水果忍者).2048(数度消除). moonwarriors(月亮战神).frui ...

  3. 怎样使用jlink一键烧录整个flash Hi3518 a c e Hi3515 Hi3512

    以jlink烧录3515为例: 1\在jlink安装文件夹"C:\Program Files\SEGGER\JLinkARM_V426b"建立批处理文件"HI3515烧写 ...

  4. linux查看CPU和内存信息

    一 先来看看ps命令: 1.查看当前某个时间点的进程:ps命令就是最基本同时也是非常强大的进程查看命令.使用该命令可以确定有哪些进程正在运行和运行的状态.进程是否结束.进程有没有僵死. 哪些进程占用了 ...

  5. 最小路径覆盖 hdu 1151 hdu 3335

    Air Raid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  6. 一个简单的java僵局演示示例

    在实际编程,为了避免死锁情况,但是,让你写一个有用的程序死锁似几乎不要太简单(种面试题),下面是一个简单的死锁样例. 线程的同步化可能会造成死锁,死锁发生在两个线程相互持有对方正在等待的东西(实际是两 ...

  7. Eclipse 打JAR包,插件FatJar 安装与使用

    下载fatJar插件,解压缩后是一个.../plugins/(net...)把plugins下面的(net..)文件夹拷贝到eclipse的plugins下,重新启动Eclipse3.1,Window ...

  8. UVA - 10118Free Candies(记忆化搜索)

    题目:UVA - 10118Free Candies(记忆化搜索) 题目大意:给你四堆糖果,每一个糖果都有颜色.每次你都仅仅能拿随意一堆最上面的糖果,放到自己的篮子里.假设有两个糖果颜色同样的话,就行 ...

  9. 【转】求质数算法的N种境界

    原文地址:http://blog.csdn.net/program_think/article/details/7032600/ ★引子 前天,俺在<俺的招聘经验[4]:通过笔试答题能看出啥?& ...

  10. NLB+Application Request Route 网路负载均衡

    NLB网路负载均衡管理器详解   序言 在上一篇配置iis负载均衡中我们使用啦微软的ARR,我在那篇文章也中提到了网站的高可用性,但是ARR只能做请求入口的消息分发服务,这样如果我们的消息分发服务器给 ...