参考网址“:http://www.it165.net/pro/html/201407/17309.html
一年之前学的cocos2dx,那时候还是用C++编写的,但学完之后就找的一个新的方向——Unity3D开发的岗位,对我而言是一个新的方向,那时候经过了几个月的每天熬夜奋战,从”0“基础到最后项目开发,那时候是在的是个小公司,总体而言还算比较轻松,可能效率利用的比较低,现在刚出来了,来到一家大公司,感觉到很多不一样的变化,方向又改变了,还是回到之前的cocos2dx开发,但用的不是C++,而是lua脚本语言来开发,对我而言又是一个新的方向,既来之则安之,在接触了那么多方向之后,是该选择一个确定的研究方向深入下去。来这该公司一周了,感受到一种之前所没有的紧迫感,每天要给自己下定任务,并且按时按量的去完成,同事都很厉害,都是在这行业工作了多少年的,很有工作经验,希望以后像他们多多请教,公司好多女程序,都很厉害,我的直属上司杨总就是当时面试我的,我以为当时面试的时候他旁边的那位是秘书的,挺漂亮的一个女”上司“,我一直以为是秘书,看起来很年轻,后来从同事那儿了解到她是我们所有人的上司,是公司的技术总监,好吧,我惊讶了,原来她是公司元老级别的程序了。第一天入职,办理好入职手续,下午的时候老大递给了我一般Lua编程的教程,不是太厚,但也不薄,三百多页吧。后来花了两天左右的时间将它看完,由于之前学的语言都是编译型语言,用上强大的Visutial studio+VA提示功能非常强大,导致现在要用文本编辑器来写lua语言有点痛苦,很容易手误,但还是要慢慢习惯,任何事物都有两面性,没有所谓绝对的完美。
花两天时间看完lua语法,然后花了一天看了下cocos2dx lua的Demo,接下来就可以进行项目开发了,不然每天开例会总是处于学习阶段总感觉不好,公司不会养两种人,懒人和闲人,所以还是多花点业余时间来弥补自己的缺陷,跟上大部队的开发。
我这里使用的是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的一大优点。
001.
require
"AudioEngine"
002.
--
for
CCLuaEngine traceback
003.
function __G__TRACKBACK__(msg)
004.
print(
"----------------------------------------"
)
005.
print(
"LUA ERROR: "
.. tostring(msg) .. "
006.
")
007.
print(debug.traceback())
008.
print(
"----------------------------------------"
)
009.
end
010.
011.
--打印函数
012.
local cclog = function(...)
013.
print(string.format(...))
014.
end
015.
016.
function main()
017.
--调用其他脚本的方法
018.
require
"hello2"
019.
--调用其他lua的脚本中的方法
020.
cclog(
"调用hello2脚本的方法:Result = "
..myadd(
3
,
5
))
021.
--获取屏幕分辨率
022.
local visibleSize = CCDirector:sharedDirector():getVisibleSize()
023.
--获取屏幕分辨率的起始坐标
024.
local origin = CCDirector:sharedDirector():getVisibleOrigin()
025.
026.
print(
"可视区域的起点坐标:"
,origin.x,origin.y)
027.
print(
"屏幕分辨率:"
,visibleSize.width,visibleSize.height)
028.
029.
--创建一个场景
030.
local scene = CCScene:create()
031.
--创建一个层
032.
local layer = CCLayer:create()
033.
--创建一个文本
034.
local label = CCLabelTTF:create(
"你好 Lua"
,
"simkai"
,
50
) --如果中文不显示的话,必须要将lua文件保存为中文
035.
label:setPosition(ccp(visibleSize.width/
2
+
30
,visibleSize.height/
2
+
100
))
036.
layer:addChild(label)
037.
--创建一个Sprite图标
038.
local iconSprite = CCSprite:create(
"Icon.png"
)
039.
iconSprite:setPosition(ccp(
80
,
260
))
040.
layer:addChild(iconSprite)
041.
042.
----------------------------创建一个动画精灵---------------------------------------------------
043.
local function createDog()
044.
--创建一个动画(这里是两张图片合成的一张,所以要根据矩形分割)
045.
local frameWidth =
105
046.
local frameHeight =
95
047.
--纹理块管理器创建一个图片文理
048.
local textureDog = CCTextureCache:sharedTextureCache():addImage(
"dog.png"
)
049.
local rect = CCRectMake(
0
,
0
,frameWidth,frameHeight)
050.
--创建精灵帧
051.
local frame0 = CCSpriteFrame:createWithTexture(textureDog,rect)
052.
rect = CCRectMake(frameWidth,
0
,frameWidth,frameHeight)
053.
local frame1 = CCSpriteFrame:createWithTexture(textureDog,rect)
054.
--创建一个精灵
055.
local spriteDog = CCSprite:createWithSpriteFrame(frame0)
056.
spriteDog.isPaused =
false
057.
spriteDog:setPosition(origin.x+visibleSize.width-
60
,origin.y + visibleSize.height/
2
)
058.
059.
local animFrames = CCArray:create()
060.
061.
animFrames:addObject(frame0)
062.
animFrames:addObject(frame1)
063.
--由容器类实例对象创建一个动画帧对象,设定每
0.4
秒更新一帧
064.
local animation = CCAnimation:createWithSpriteFrames(animFrames,
0.4
) --第二个参数是播放的速率,值越小播放越快
065.
--创建一个动画
066.
local animate = CCAnimate:create(animation)
067.
--设置精灵循环播放这个动作
068.
spriteDog:runAction(CCRepeatForever:create(animate))
069.
070.
--设置精灵颜色
071.
--spriteDog:setColor(ccc3(
0
,
255
,
0
))
072.
073.
--自定义一个定时器
074.
local function tick()
075.
if
spriteDog.isPaused then
return
end
076.
local x,y = spriteDog:getPosition() --获取坐标
077.
if
x60
then
078.
x = origin.x+visibleSize.width-
60
079.
else
080.
x = x -
1
081.
end
082.
083.
spriteDog:setPositionX(x)
084.
end
085.
--启动定时器
086.
CCDirector:sharedDirector():getScheduler():scheduleScriptFunc(tick,
0
,
false
)
087.
088.
return
spriteDog
089.
end
090.
091.
092.
093.
---------------------------------创建一个可移动的背景层-----------------------------------------
094.
local function createMoveLayer()
095.
local layerFarm = CCLayer:create()
096.
097.
--添加背景
098.
local bg = CCSprite:create(
"farm.jpg"
)
099.
bg:setPosition(origin.x+visibleSize.width/
2
+
80
,origin.y+visibleSize.height/
2
-
20
)
100.
layerFarm:addChild(bg)
101.
102.
--添加地面田地
103.
for
i =
0
,
3
do
104.
for
j =
0
,
1
do
105.
local spriteLand = CCSprite:create(
"land.png"
)
106.
spriteLand:setPosition(
200
+j*
180
- i%
2
*
90
,
10
+ i*
95
/
2
)
107.
layerFarm:addChild(spriteLand)
108.
end
109.
end
110.
111.
--添加植物(一个
4
*
1
的图片)
112.
local frameCrop = CCSpriteFrame:create(
"crop.png"
,CCRectMake(
0
,
0
,
105
,
95
))
113.
for
i =
0
,
3
do
114.
for
j =
0
,
1
do
115.
local spriteCrop = CCSprite:createWithSpriteFrame(frameCrop)
116.
spriteCrop:setPosition(
10
+
200
+j*
180
- i%
2
*
90
,
30
+
10
+i*
95
/
2
)
117.
layerFarm:addChild(spriteCrop)
118.
end
119.
end
120.
121.
--------------------触摸事件-------------------------------------------
122.
local touchBeginPoint = nil
123.
--开始触摸
124.
local function onTouchBegan(x,y)
125.
cclog(
"onTouchBegin:%0.2f,%0.2f"
,x,y)
126.
touchBeginPoint = {x = x,y = y}
127.
return
true
128.
end
129.
--触摸移动
130.
local function onTouchMoved(x,y)
131.
cclog(
"onTouchMoved:%0.2f,%0.2f"
,x,y)
132.
if
touchBeginPoint then
133.
local cx,cy = layerFarm:getPosition()
134.
layerFarm:setPosition(cx+x-touchBeginPoint.x,cy+y-touchBeginPoint.y)
135.
touchBeginPoint = {x = x,y = y}
136.
end
137.
end
138.
--结束触摸
139.
local function onTouchEnded(x,y)
140.
cclog(
"onTouchEnded:%0.2f,%0.2f"
,x,y)
141.
touchBeginPoint = nil
142.
end
143.
--判断触摸动作
144.
local function onTouch(eventType,x,y)
145.
if
eventType ==
"began"
then
146.
return
onTouchBegan(x,y)
147.
elseif eventType ==
"moved"
then
148.
return
onTouchMoved(x,y)
149.
else
150.
return
onTouchEnded(x,y)
151.
end
152.
end
153.
154.
--调用layerFarm的registerScriptTouchHnadler函数注册按下的事件相应函数
155.
layerFarm:registerScriptTouchHandler(onTouch)
156.
--使layerFarm能够相应屏幕按下的事件
157.
layerFarm:setTouchEnabled(
true
)
158.
return
layerFarm
159.
160.
end
161.
162.
--------------------------创建菜单-----------------------------------------------------
163.
local function createLayerMenu()
164.
165.
local layerMenu = CCLayer:create()
166.
167.
local menuPopup,menuTools,effectID --菜单栏、左下角的工具栏按钮、音效ID
168.
169.
--关闭菜单栏
170.
local function menuCallBackClosePopup()
171.
172.
AudioEngine.stopEffect(effectID) --根据ID号来关闭这个声音
173.
menuPopup:setVisible(
false
)
174.
175.
end
176.
177.
--开启菜单栏
178.
local function menuCallBackOpenPopup()
179.
180.
local effectPath = CCFileUtils:sharedFileUtils():fullPathForFilename(
"effect1.wav"
)
181.
effectID = AudioEngine.playEffect(effectPath) --播放一个声音然后赋值给某个ID
182.
menuPopup:setVisible(
true
)
183.
184.
end
185.
186.
--添加一个选择菜单
187.
local menuPopupItem = CCMenuItemImage:create(
"menu2.png"
,
"menu2.png"
) -- 菜单选项
188.
menuPopupItem:setPosition(
0
,
0
)--选项卡的位置
189.
menuPopupItem:registerScriptTapHandler(menuCallBackClosePopup) --点击事件
190.
menuPopup = CCMenu:createWithItem(menuPopupItem) --根据菜单选项创建菜单
191.
menuPopup:setPosition(origin.x+visibleSize.width/
2
,origin.y+visibleSize.height/
2
) --设置菜单的位置
192.
menuPopup:setVisible(
false
) --设置面板的不显示
193.
layerMenu:addChild(menuPopup) --将菜单添加到菜单层中
194.
195.
--添加左下角的工具图标
196.
local menuToolsItem = CCMenuItemImage:create(
"menu1.png"
,
"menu1.png"
)
197.
menuToolsItem:setPosition(
0
,
0
)
198.
menuToolsItem:registerScriptTapHandler(menuCallBackOpenPopup)
199.
menuTools = CCMenu:createWithItem(menuToolsItem)
200.
local itemWidth = menuToolsItem:getContentSize().width --获取图片的宽
201.
local itemHeight = menuToolsItem:getContentSize().height --获取图片的高
202.
menuTools:setPosition(origin.x + itemWidth/
2
,origin.y + itemHeight/
2
) --设置位置
203.
layerMenu:addChild(menuTools)
204.
205.
return
layerMenu
206.
207.
end
208.
209.
210.
---------------------------添加背景音乐-----------------------------------------------
211.
--循环播放背景音乐
212.
--SimpleAudioEngine:sharedEngine():playBackgroundMusic(
"background.mp3"
,
true
)
213.
--或者
214.
local bgMusicPath = CCFileUtils:sharedFileUtils():fullPathForFilename(
"background.mp3"
)
215.
AudioEngine.playMusic(bgMusicPath,
true
)
216.
217.
218.
-- 取得声音引擎的实例对象并调用其preloadEffect函数将声音文件“effect1.wav”预加载进内存。这里并不播放,预加载是为了在播放时不造成卡顿感。
219.
--SimpleAudioEngine:sharedEngine():preloadEffect(
"effect1.wav"
);
220.
--或者
221.
local effectPath = CCFileUtils:sharedFileUtils():fullPathForFilename(
"effect1.wav"
)
222.
AudioEngine.preloadEffect(effectPath)
223.
224.
225.
--添加动画狗
226.
layer:addChild(createDog(),
4
) --第二个参数是Z(深度),值越大越在前面
227.
228.
--添加可移动的背景层到主场景中
229.
scene:addChild(createMoveLayer())
230.
--添加menu菜单
231.
scene:addChild(createLayerMenu())
232.
--添加自己绘制的图标和文字层
233.
scene:addChild(layer)
234.
--运行场景
235.
CCDirector:sharedDirector():runWithScene(scene)
236.
end
237.
238.
239.
--脚本的入口函数,前面一个参数是调用执行的函数,后面一个是错误处理的函数
240.
xpcall(main, __G__TRACKBACK__)
注意:如果要显示中文,解决方案将lua文件保存为utf8格式
关于内存问题可以参考:http://blog.csdn.net/honghaier/article/details/7906629