一年之前学的cocos2dx,那时候还是用C++编写的。但学完之后就找的一个新的方向——Unity3D开发的岗位,对我而言是一个新方向,那时候经过了几个月的每天熬夜奋战,从”0“基础到最后项目开发,那时候是在的是个小公司,整体而言还算比較轻松,可能效率利用的比較低。如今刚出来了。来到一家大公司。感觉到非常多不一样的变化。方向又改变了,还是回到之前的cocos2dx开发,但用的不是C++,而是lua脚本语言来开发,对我而言又是差点儿是从新開始。既来之则安之,在接触了那么多方向之后,是该选择一个确定的研究方向深入下去。

来这该公司一周了,感受到一种之前所没有的紧迫感,每天要给自己下定任务,而且按时按量的去完毕,同事都非常厉害。都是在这行业工作了多少年的。非常有工作经验。希望以后像他们多多请教,公司好多女程序,都非常厉害,我的直属上司杨总就是当时面试我的,我以为当时面试的时候他旁边的那位是秘书的,挺美丽的一个女”上司“,我一直以为是秘书。看起来非常年轻,后来从同事那儿了解到她是我们全部人的上司,是公司的技术总监。好吧,我吃惊了,原来她是公司元老级别的程序了。第一天入职,办理好入职手续,下午的时候老大递给了我一本Lua编程的教程。不是太厚,但也不薄,三百多页吧。后来花了两天左右的时间将它看完。因为之前学的语言都是编译型语言,用上强大的Visutial studio+VA提示功能非常强大。导致如今要用文本编辑器来写lua语言有点痛苦。非常easy手误,但还是要慢慢习惯。不论什么事物都有两面性,没有所谓绝对的完美。

花两天时间看完lua语法,然后花了一天看了下cocos2dx lua的Demo,接下来就能够进行项目开发了,不然每天开例会总是处于学习阶段总感觉不好,公司不会养两种人,懒人和闲人,所以还是多花点业余时间来弥补自己的缺陷,跟上大部队的开发。

  • 创建Cocos2dx-Lua项目

我这里使用的是Visual Studio 2012+cocos2dx 2.2.4,前提安装上Python

打开控制台。通过命令来创建新的项目

然后打开cocos2dx的projects文件夹发现生成了刚刚创建的lua项目

假设是Windows平台就打开proj.win32->luastudy1.sln,编译一下就可以执行势力demo。

  • 效果图

cocos2dx lua项目。lua脚本放在Resources文件夹下。也就是说lua脚本也像图片。声音资源这些一样被当成是资源利用了,所以假设程序要逻辑跟新或者说有什么bug,能够直接改动lua文件然后又一次上传就可以,不需要再次编译公布。这也是lua开发cocos2dx的一大长处。

  • lua脚本

require "AudioEngine"
-- for CCLuaEngine traceback
function __G__TRACKBACK__(msg)
print("----------------------------------------")
print("LUA ERROR: " .. tostring(msg) .. "\n")
print(debug.traceback())
print("----------------------------------------")
end --打印函数
local cclog = function(...)
print(string.format(...))
end function main()
--调用其它脚本的方法
require "hello2"
--调用其它lua的脚本中的方法
cclog("调用hello2脚本的方法:Result = "..myadd(3,5))
--获取屏幕分辨率
local visibleSize = CCDirector:sharedDirector():getVisibleSize()
--获取屏幕分辨率的起始坐标
local origin = CCDirector:sharedDirector():getVisibleOrigin() print("可视区域的起点坐标:",origin.x,origin.y)
print("屏幕分辨率:",visibleSize.width,visibleSize.height) --创建一个场景
local scene = CCScene:create()
--创建一个层
local layer = CCLayer:create()
--创建一个文本
local label = CCLabelTTF:create("你好 Lua","simkai",50) --假设中文不显示的话,必需要将lua文件保存为中文
label:setPosition(ccp(visibleSize.width/2+30,visibleSize.height/2+100))
layer:addChild(label)
--创建一个Sprite图标
local iconSprite = CCSprite:create("Icon.png")
iconSprite:setPosition(ccp(80,260))
layer:addChild(iconSprite) ----------------------------创建一个动画精灵---------------------------------------------------
local function createDog()
--创建一个动画(这里是两张图片合成的一张,所以要依据矩形切割)
local frameWidth = 105
local frameHeight = 95
--纹理块管理器创建一个图片文理
local textureDog = CCTextureCache:sharedTextureCache():addImage("dog.png")
local rect = CCRectMake(0,0,frameWidth,frameHeight)
--创建精灵帧
local frame0 = CCSpriteFrame:createWithTexture(textureDog,rect)
rect = CCRectMake(frameWidth,0,frameWidth,frameHeight)
local frame1 = CCSpriteFrame:createWithTexture(textureDog,rect)
--创建一个精灵
local spriteDog = CCSprite:createWithSpriteFrame(frame0)
spriteDog.isPaused = false
spriteDog:setPosition(origin.x+visibleSize.width-60,origin.y + visibleSize.height/2) local animFrames = CCArray:create() animFrames:addObject(frame0)
animFrames:addObject(frame1)
--由容器类实例对象创建一个动画帧对象,设定每0.4秒更新一帧
local animation = CCAnimation:createWithSpriteFrames(animFrames,0.4) --第二个參数是播放的速率,值越小播放越快
--创建一个动画
local animate = CCAnimate:create(animation)
--设置精灵循环播放这个动作
spriteDog:runAction(CCRepeatForever:create(animate)) --设置精灵颜色
--spriteDog:setColor(ccc3(0,255,0)) --自己定义一个定时器
local function tick()
if spriteDog.isPaused then return end
local x,y = spriteDog:getPosition() --获取坐标
if x<origin.x+60 then
x = origin.x+visibleSize.width-60
else
x = x - 1
end spriteDog:setPositionX(x)
end
--启动定时器
CCDirector:sharedDirector():getScheduler():scheduleScriptFunc(tick,0,false) return spriteDog
end ---------------------------------创建一个可移动的背景层-----------------------------------------
local function createMoveLayer()
local layerFarm = CCLayer:create() --加入背景
local bg = CCSprite:create("farm.jpg")
bg:setPosition(origin.x+visibleSize.width/2+80,origin.y+visibleSize.height/2 -20)
layerFarm:addChild(bg) --加入地面田地
for i = 0,3 do
for j = 0,1 do
local spriteLand = CCSprite:create("land.png")
spriteLand:setPosition(200+j*180 - i%2 *90 ,10 + i*95/2)
layerFarm:addChild(spriteLand)
end
end --加入植物(一个4*1的图片)
local frameCrop = CCSpriteFrame:create("crop.png",CCRectMake(0,0,105,95))
for i = 0,3 do
for j = 0,1 do
local spriteCrop = CCSprite:createWithSpriteFrame(frameCrop)
spriteCrop:setPosition(10+200+j*180 - i%2*90,30+10+i*95/2)
layerFarm:addChild(spriteCrop)
end
end --------------------触摸事件-------------------------------------------
local touchBeginPoint = nil
--開始触摸
local function onTouchBegan(x,y)
cclog("onTouchBegin:%0.2f,%0.2f",x,y)
touchBeginPoint = {x = x,y = y}
return true
end
--触摸移动
local function onTouchMoved(x,y)
cclog("onTouchMoved:%0.2f,%0.2f",x,y)
if touchBeginPoint then
local cx,cy = layerFarm:getPosition()
layerFarm:setPosition(cx+x-touchBeginPoint.x,cy+y-touchBeginPoint.y)
touchBeginPoint = {x = x,y = y}
end
end
--结束触摸
local function onTouchEnded(x,y)
cclog("onTouchEnded:%0.2f,%0.2f",x,y)
touchBeginPoint = nil
end
--推断触摸动作
local function onTouch(eventType,x,y)
if eventType == "began" then
return onTouchBegan(x,y)
elseif eventType == "moved" then
return onTouchMoved(x,y)
else
return onTouchEnded(x,y)
end
end --调用layerFarm的registerScriptTouchHnadler函数注冊按下的事件对应函数
layerFarm:registerScriptTouchHandler(onTouch)
--使layerFarm能够对应屏幕按下的事件
layerFarm:setTouchEnabled(true)
return layerFarm end --------------------------创建菜单-----------------------------------------------------
local function createLayerMenu() local layerMenu = CCLayer:create() local menuPopup,menuTools,effectID --菜单条、左下角的工具栏button、音效ID --关闭菜单条
local function menuCallBackClosePopup() AudioEngine.stopEffect(effectID) --依据ID号来关闭这个声音
menuPopup:setVisible(false) end --开启菜单条
local function menuCallBackOpenPopup() local effectPath = CCFileUtils:sharedFileUtils():fullPathForFilename("effect1.wav")
effectID = AudioEngine.playEffect(effectPath) --播放一个声音然后赋值给某个ID
menuPopup:setVisible(true) end --加入一个选择菜单
local menuPopupItem = CCMenuItemImage:create("menu2.png","menu2.png") -- 菜单选项
menuPopupItem:setPosition(0,0)--选项卡的位置
menuPopupItem:registerScriptTapHandler(menuCallBackClosePopup) --点击事件
menuPopup = CCMenu:createWithItem(menuPopupItem) --依据菜单选项创建菜单
menuPopup:setPosition(origin.x+visibleSize.width/2,origin.y+visibleSize.height/2) --设置菜单的位置
menuPopup:setVisible(false) --设置面板的不显示
layerMenu:addChild(menuPopup) --将菜单加入到菜单层中 --加入左下角的工具图标
local menuToolsItem = CCMenuItemImage:create("menu1.png","menu1.png")
menuToolsItem:setPosition(0,0)
menuToolsItem:registerScriptTapHandler(menuCallBackOpenPopup)
menuTools = CCMenu:createWithItem(menuToolsItem)
local itemWidth = menuToolsItem:getContentSize().width --获取图片的宽
local itemHeight = menuToolsItem:getContentSize().height --获取图片的高
menuTools:setPosition(origin.x + itemWidth/2,origin.y + itemHeight/2) --设置位置
layerMenu:addChild(menuTools) return layerMenu end ---------------------------加入背景音乐-----------------------------------------------
--循环播放背景音乐
--SimpleAudioEngine:sharedEngine():playBackgroundMusic("background.mp3",true)
--或者
local bgMusicPath = CCFileUtils:sharedFileUtils():fullPathForFilename("background.mp3")
AudioEngine.playMusic(bgMusicPath,true) -- 取得声音引擎的实例对象并调用其preloadEffect函数将声音文件“effect1.wav”预载入进内存。 这里并不播放,预载入是为了在播放时不造成卡顿感。
--SimpleAudioEngine:sharedEngine():preloadEffect("effect1.wav");
--或者
local effectPath = CCFileUtils:sharedFileUtils():fullPathForFilename("effect1.wav")
AudioEngine.preloadEffect(effectPath) --加入动画狗
layer:addChild(createDog(),4) --第二个參数是Z(深度),值越大越在前面 --加入可移动的背景层到主场景中
scene:addChild(createMoveLayer())
--加入menu菜单
scene:addChild(createLayerMenu())
--加入自己绘制的图标和文字层
scene:addChild(layer)
--执行场景
CCDirector:sharedDirector():runWithScene(scene)
end --脚本的入口函数,前面一个參数是调用执行的函数。后面一个是错误处理的函数
xpcall(main, __G__TRACKBACK__)

注意:假设要显示中文。解决方式将lua文件保存为utf8格式

[cocos2dx-lua]&quot;Hello Lua&quot;分析的更多相关文章

  1. tolua++实现lua层调用c++技术分析

    tolua++技术分析 cocos2dx+lua 前言 一直都使用 cocos2dx + lua 进行游戏开发,用 Lua 开发可以专注于游戏逻辑的实现,另外一方面可以实现热更新:而且 lua 是一个 ...

  2. cocos2dx之C++调用Lua

    原文地址:http://blog.csdn.net/dingkun520wy/article/details/49839701 1.引入头文件 #include "cocos2d.h&quo ...

  3. Cocos2d-x 3.1.1 Lua实例-AccelerometerTest(重力加速计)

    Cocos2d-x 3.1.1 Lua实例-AccelerometerTest(重力加速计) 本篇博客介绍Cocos2d-x的第一个实例--重力加速计測试.效果图(注:这里无法模拟重力感应): --[ ...

  4. Cocos2d-x使用Luajit将Lua脚本编译成bytecode,启用加密

    http://www.cocoachina.com/bbs/read.php?tid=205802 lua脚本进行加密,查了一下相关的资料 ,得知lua本身能够使用luac将脚本编译为字节码(byte ...

  5. Cocos2d-x 3.1.1 Lua演示样例 ActionsProgressTest(进度条)

    Cocos2d-x 3.1.1 Lua演示样例 ActionsProgressTest(进度条) 本篇博客介绍Cocos2d-x中的进度条动画,进度条涉及以下几个重要的类和方法,笔者来给大家具体解说一 ...

  6. 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!

    [COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-1 ...

  7. Cocos2d-x使用Luajit将Lua脚本编译为bytecode,从而实现加密

    转自:http://www.58player.com/blog-2537-87218.html 项目要求对lua脚本进行加密,查了一下相关的资料 ,得知lua本身可以使用luac将脚本编译为字节码(b ...

  8. Cocos2d-x使用Luajit将Lua脚本编译为bytecode,实现加密 更新

    项目要求对lua脚本进行加密,查了一下相关的资料 ,得知lua本身能够使用luac将脚本编译为字节码(bytecode)从而实现加密,试了一下,确实可行. 以下是使用原生的lua解释器编译字节码: 1 ...

  9. Cocos2d-x 3.1.1 Lua演示样例 ActionManagerTest(动作管理)

    Cocos2d-x 3.1.1 Lua演示样例 ActionManagerTest(动作管理) 本篇博客介绍Cocos2d-x的动作管理样例,这个样例展示了Cocos2d-x的几个动作: MoveTo ...

随机推荐

  1. poj1860 解题报告

    题意:这里有N种货币,分别记为1~N,有M种货币交换的方式,每一种方式有A,B两种钱币,有RAB, CAB, RBA and CBA,四个数,表示交换率, Nick手上有其中的一种货币S,货币S的钱数 ...

  2. asp.net笔试题

    1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成 ...

  3. SVM(三)—Kernels(核函数)

    (整理自AndrewNG的课件,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 内容整理中...

  4. 我觉得主要靠积累,难度不是问题,主要靠时间积累,以及兴趣带来的学习能力(我觉得至少5年全职Qt开发经验,才能算精通)

    顺便想请教一下,你用QT有几年了? 3年不到 那感觉怎么样?是比较难,还是不难但需要时间才能掌握全部? 很多东西真的要拿来做项目了,才会懂.要靠积累.一开始看看理论貌似都很简单. 但是QT和C++本身 ...

  5. 【ASP.NET Web API教程】2.3.2 创建域模型

    原文:[ASP.NET Web API教程]2.3.2 创建域模型 Part 2: Creating the Domain Models 第2部分:创建域模型 本文引自:http://www.asp. ...

  6. [置顶] location.href你真的会用了?

    *.location.href 用法: top.location.href=”url”          在顶层页面打开url(跳出框架) self.location.href=”url”       ...

  7. POJ 2186 Popular Cows (强联通)

    id=2186">http://poj.org/problem? id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 655 ...

  8. 关于Android配色 自适应颜色的实现

    在Android4.4系统中,更加详细地介绍了关于颜色的细节并提供了使用colour的新教程,以使我们的应用更加独一无二.也就是说,作为一个设计师或者开发者,为你的APP做完美的配色已经变成了你的职责 ...

  9. Python string replace 方法

    Python string replace   方法 方法1: >>> a='...fuck...the....world............' >>> b=a ...

  10. 让MFC程序隐藏运行界面

    在MFC中隐藏运行界面确实花花点功力. 针对对话框程序,一种不是很好地实现方法是在OnPaint函数中添加如下代码: CWnd::ShowWindow(SW_HIDE); 添加后执行会发现屏幕会闪烁一 ...