function MainScene:ctor()
cc.ui.UILabel.new({
UILabelType = 2,text = "Hello,World",size = 64})
:align(display.CENTER,display.cx,display.cy)
:addTo(self)
@H_301_0@end @H_301_0@将text = "Hello,World",修改为text = "YES,World" 保存后即可见修改。 5.程序入口 @H_301_0@每个程序都有自己的入门,这个基于LUA的项目入门函数在main.lua函数中, @H_301_0@然后进入MyApp.lua文件,该文件中的 @H_301_0@function MyApp:run() @H_301_0@该函数会实现跳转,到达MainScene.lua文件中的函数。 6.创建新类 @H_301_0@新建一个LUA文件,输入代码如local Player = class("Player",function()
local sprite = display.newSprite("image/diji.png")
return sprite
end)
function Player:ctor()
end
@H_301_0@return Player @H_301_0@即可实现新类创建。 @H_301_0@然后在MainScene.lua中输入 @H_301_0@一下代码即可
local Player =import("..role.Player")
local Player = class("Player",function()
@H_301_0@return display.newSprite("image/diji.png") end)function MainScene:ctor()
cc.ui.UILabel.new({
--其他代码省略
self.player = Player.new() --display.newSprite("#player1-1-1.png")
self.player:setposition(display.left + self.player:getContentSize().wIDth/2,display.cy)
self:addChild(self.player)
@H_301_0@end @H_301_0@ 类的构造函数是ctor。 @H_301_0@ @H_301_0@ @H_301_0@ 7.code IDe工具使用 7.1注释 @H_301_0@ctrl+shift+C 会加上或者去掉--注释 @H_301_0@ 7.2Code IDE函数注释显示乱码 @H_301_0@在工具上选中Window –> Preferences – >General –> Workspace,Text fileenCoding,选成UTF-8即可。退出code-IDe重进,问题解决。 7.3代码修改刷新程序 @H_301_0@和刷新网页一样,F5即可。主要保护F5键盘。 8.代码细节 8.1增加搜索路径 @H_301_0@添加资源搜索路径 @H_301_0@CCfileUtils:sharedfileUtils():addSearchPath("res/") 8.2存档路径 @H_301_0@device.writablePath获得存档文件保存目录 8.3屏幕分辨率 @H_301_0@可以用 display.wIDth,display.height 获得屏幕分辨率。 8.4创建菜单cc.ui.UIPushbutton.new("Closenormal.png" )
:setbuttonLabel(cc.ui.UILabel.new({text= "Use Ccsloader"}))
:onbuttonpressed(function(event)
event.target:setScale(1.2)
print("pressed")
@H_301_0@ end) 8.5抖动菜单效果按钮,果冻按钮效果 @H_301_0@这里假设大家已熟悉quick开发的基础知识。 @H_301_0@Quick版本是3.3的。 @H_301_0@在ctor()函数中加入如下函数即可是实现一个抖动菜单local button1 = cc.ui.UIPushbutton.new("Closenormal.png")
:align(display.CENTER,display.cy + 40)
:onbuttonpressed(function(event)
local function zoom1(offset,time,scale,onComplete)
local x,y = event.target:getposition()
local size = self:getContentSize()
local scaleX = event.target:getScaleX() * (size.wIDth + scale) / size.wIDth
local scaleY = event.target:getScaleY() * (size.height - scale) / size.height
Transition.moveto(event.target,{y = y - offset,time = time})
Transition.scaleto(event.target,{
scaleX = scaleX,
scaleY = scaleY,
time = time,
onComplete = onComplete,
})
end
local function zoom2(offset,y = event.target:getposition()
local size = self:getContentSize()
Transition.moveto(event.target,{y = y + offset,time = time / 2})
Transition.scaleto(event.target,{
scaleX = 1.0,
scaleY = 1.0,
})
end
zoom1(20,0.08,500, function()
zoom2(20,0.09, function()
zoom1(10,0.10,400, function()
zoom2(10,0.11, function()
end)
end)
end)
end)
print("pressed")
end)
@H_301_0@ :addTo(self) 8.6定时器使用 8.6.1每帧调用 @H_301_0@文件头处输入: @H_301_0@local scheduler = require("framework.scheduler") @H_301_0@函数中输入local time = 0
local function update(dt)
time = time + 1
print(time)
end
@H_301_0@ scheduler.scheduleUpdateGlobal(update) 8.6.2间隔一定时间调用local time = 0
local function onInterval(dt)
time = time + 1
print(time)
end
@H_301_0@ scheduler.scheduleGlobal(onInterval,1) @H_301_0@ 8.6.3间隔时间调用一次local time = 0
local function onInterval(dt)
time = time + 1
print(time)
print("over")
end
@H_301_0@ scheduler.performWithDelayGlobal(onInterval,1) 8.6.4停止定时器 scheduler.unscheduleGlobal() |
参数是前面那些定时器返回的句柄,所以如果需要在后面停止掉,在创建的留一个返回值
8.7触摸local layer = display.newLayer()
self:addChild(layer)
layer:settouchEnabled(true)
layer:settouchMode(cc.touch_MODE_ONE_BY_ONE)
layer:addNodeEventListener(cc.NODE_touch_EVENT,function (event)
local x,y,prevX,prevY = event.x,event.y,event.prevX,event.prevY
if event.name == "began" then
print("layer began")
elseif event.name == "moved" then
print("layer moved")
elseif event.name == "ended" then
print("layer ended")
end
@H_301_0@ end) @H_301_0@·cc.touch_MODE_ONE_BY_ONE 是单点触摸 @H_301_0@·cc.touch_MODE_ALL_AT_ONCE 是多点触摸 @H_301_0@在添加节点事件监听addNodeEventListener中,我们设置监听事件的类型是cc.NODE_touch_EVENT @H_301_0@这个监听事件类型,其定义了几个引擎级事件,分别是, @H_301_0@-- Cocos2d-x 引擎级事件@H_301_0@c.NODE_EVENT=0 @H_301_0@c.NODE_ENTER_FRAME_EVENT=1 @H_301_0@c.NODE_touch_EVENT=2 @H_301_0@c.NODE_touch_CAPTURE_EVENT=3 @H_301_0@c.MENU_ITEM_CliCKED_EVENT=4 @H_301_0@c.ACCELERATE_EVENT=5 @H_301_0@c.KEYPAD_EVENT=6 |
触摸捕获事件的优先级要比触摸事件要高,换句话说,触摸捕获事件会比触摸事件先响应,并且有权不分发给触摸事件响应。举例如下
local layer = display.newLayer()
self:addChild(layer)
layer:settouchEnabled(true)
layer:settouchSwallowEnabled(false)
layer:settouchMode(cc.touch_MODE_ONE_BY_ONE)
layer:addNodeEventListener(cc.NODE_touch_EVENT,function (event)
if event.name == "began" then
print("layer began")
elseif event.name == "moved" then
print("layer moved")
elseif event.name == "ended" then
print("layer ended")
end
return true
end)
layer:addNodeEventListener(cc.NODE_touch_CAPTURE_EVENT,function (event)
if event.name == "began" then
print("layer capture began")
elseif event.name == "moved" then
print("layer capture moved")
elseif event.name == "ended" then
print("layer capture ended")
end
return true
end)
local sp = display.newSprite("HelloWorld.png",display.cy)
layer:addChild(sp)
--self:addChild(sp)
sp:settouchEnabled(true)
sp:settouchSwallowEnabled(false)
sp:settouchMode(cc.touch_MODE_ONE_BY_ONE)
sp:addNodeEventListener(cc.NODE_touch_EVENT,function (event)
if event.name == "began" then
print("sp began")
elseif event.name == "moved" then
print("sp moved")
elseif event.name == "ended" then
print("sp ended")
end
return true
end)
sp:addNodeEventListener(cc.NODE_touch_CAPTURE_EVENT,function (event)
if event.name == "began" then
print("sp capture began")
elseif event.name == "moved" then
print("sp capture moved")
elseif event.name == "ended" then
print("sp capture ended")
end
return true
@H_301_0@ end) 8.9多点触摸 @H_301_0@多点触摸如下:local layer = display.newLayer()
self:addChild(layer)
layer:settouchEnabled(true)
layer:settouchMode(cc.touch_MODE_ALL_AT_ONCE)
layer:addNodeEventListener(cc.NODE_touch_EVENT,function (event)
if event.name == "began" or event.name == "added" then
for ID,point in pairs(event.points) do
printf("%d,%f,%f",ID,event.points[ID].x,event.points[ID].y)
end
elseif event.name == "removed" then
print("touch removed")
elseif event.name == "moved" then
print("touch moved")
elseif event.name == "ended" then
print("touch ended")
end
return true
@H_301_0@end) 8.10硬件按键 @H_301_0@硬件按键是设备上的触摸屏之外的按键。 @H_301_0@预定义的层事件主要有两个: @H_301_0@·cc.ACCELERATE_EVENT:重力感应事件 @H_301_0@·cc.KEYPAD_EVENT:硬件按键事件 @H_301_0@要实现一个按键响应事件主要就两步: @H_301_0@·1. 打开键盘功能setKeypadEnabled(true) @H_301_0@·2. 添加事件监听addNodeEventListenerlocal layer = display.newLayer()
self:addChild(layer)
layer:setKeypadEnabled(true)
layer:addNodeEventListener(cc.KEYPAD_EVENT,function (event)
if event.key == "back" then
print("back")
device.showAlert("Confirm Exit","Are you sure exit game ?",{"YES","NO"},function (event)
if event.buttonIndex == 1 then
CCDirector:sharedDirector():endTolua()
else
device.cancelAlert()
end
end)
elseif event.key == "menu" then
print("menu")
end
@H_301_0@ end) 8.11其他事件 @H_301_0@预定义的节点事件: @H_301_0@·cc.NODE_EVENT - enter,exit等事件 @H_301_0@·cc.NODE_ENTER_FRAME_EVENT -帧事件 @H_301_0@·cc.NODE_touch_EVENT - 触摸事件 @H_301_0@·cc.NODE_touch_CAPTURE_EVENT- 捕获触摸事件 @H_301_0@ @H_301_0@预定义的层事件: @H_301_0@·cc.ACCELERATE_EVENT - 重力感应事件 @H_301_0@·cc.KEYPAD_EVENT - 硬件按键事件 @H_301_0@ @H_301_0@预定义的菜单事件: @H_301_0@·cc.MENU_ITEM_CliCKED_EVENT- Ccmenu 菜单项点击事件 9.断点调试 @H_301_0@如果开发没有断点调试实在是让人异常头疼,好吧,蛤蟆就记录下如何是是实现QUICK项目的断点调试。 @H_301_0@需要quick 的develop版本。只有DEVEOP版本才有断点调试。 @H_301_0@仓库地址:https://github.com/chukong/quick-cocos2d-x @H_301_0@下载后运行加压包中的 setup_win.bat进行环境变量配置 @H_301_0@然后按下网址代码进行配置 @H_301_0@http://quick.cocos.org/?p=1527 @H_301_0@Player3后的调试,查看官网 @H_301_0@《在 Code IDE 中调试 Quick 工程》 @H_301_0@CODE IDE 调试 @H_301_0@http://cn.cocos2d-x.org/article/index?type=quick_doc&url=/doc/cocos-docs-master/manual/framework/quick/V3/how-to/use-codeide/zh.md @H_301_0@命令行启动带CONSolE @H_301_0@D:\cocos\quick-3.3\quick\player\win32>player3.exe-workdir F:\cocosIDe_zhizuo\com 10.状态机实现记录 @H_301_0@创建状态机self.fsm_ = {}
cc.GameObject.extend(self.fsm_)
:addComponent("components.behavior.StateMachine")
:exportMethods()
self.fsm_:setupState({
-- 初始状态
initial = "IDle",
-- 事件和状态转换
events = {
-- t1:clickScreen; t2:clickEnemy; t3:beKilled; t4:stop
{name = "clickScreen",from = {"IDle","attack"},to = "walk" },
{name = "clickEnemy","walk"},to = "attack"},
{name = "beKilled","walk",to = "dead"},
{name = "stop",from = {"walk",to = "IDle"},
},
-- 状态转变后的回调
callbacks = {
onIDle = function () print("IDle") end,
onwalk = function () print("move") end,
onattack = function () print("attack") end,
ondead = function () print("dead") end
},
})
@H_301_0@end @H_301_0@增加doEvent函数 @H_301_0@命名规则·onbeforexxx: 执行xxx事件前的响应函数;
·onxxx或者onafterxxx: 执行xxx事件完成的响应函数;
·onenterxxx或者onxxx: 进入xxx状态时的响应函数;
·onleavexxx: 离开xxx状态时的响应函数;
·onbeforeevent: 执行所有事件之前会执行该响应函数,事件信息以参数形式下发;
·onafterevent或者onevent: 执行所有事件完成之后执行该响应函数,事件信息以参数形式下发;
·onchangestate: 改变状态时的响应函数,事件信息会以参数的形式下发;
·onenterstate: 进入状态时的响应函数,事件信息会以参数形式下发:
·onleavestate: 离开状态时的响应函数,事件信息会以参数形式下发。
@H_301_0@设置状态逻辑是重写setupState方法,这其中有这么几个字段参数, @H_301_0@·initial:状态机的初始状态 @H_301_0@·terminal (final):结束状态 @H_301_0@·events:状态发生转变时对应的事件 @H_301_0@·callbacks:发生转变时的回调函数 @H_301_0@接下来一个重点是callbacks参数,即所谓回调了,就是事件触发,会执行一系列的函数。 @H_301_0@·onbeforeEVNET:在事件EVENT开始前被激活 @H_301_0@·onleaveSTATE:在离开旧状态STATE时被激活 @H_301_0@·onenterSTATE 或 onSTATE:在进入新状态STATE时被激活 @H_301_0@·onafterEVENT 或 onEVENT:在事件EVENT结束后被激活 @H_301_0@此外还有5种通用型的回调来捕获所有事件和状态的变化: @H_301_0@·onbeforeevent:在任何事件开始前被激活 @H_301_0@·onleavestate:在离开任何状态时被激活 @H_301_0@·onenterstate:在进入任何状态时被激活 @H_301_0@·onafterevent:在任何事件结束后被激活 @H_301_0@·onchangestate:当状态发生改变的时候被激活 @H_301_0@这里面的名称是不可以修改的,它是针对于任何事件和任何状态的。 @H_301_0@最后,就是调用这些事件了,通过self.fsm:doEvent(event)就可以了,参数event对应events参数名称。此外还有这些, @H_301_0@·fsm:isReady():返回状态机是否就绪 @H_301_0@·fsm:getState():返回当前状态 @H_301_0@·fsm:isstate(state):判断当前状态是否是参数state状态 @H_301_0@·fsm:canDoEvent(eventname):当前状态如果能完成eventname对应的event的状态转换,则返回true @H_301_0@·fsm:cannotDoEvent(eventname):当前状态如果不能完成eventname对应的event的状态转换,则返回true @H_301_0@·fsm:isFinishedState():当前状态如果是最终状态,则返回true @H_301_0@·fsm:doEventForce(name,...):强制对当前状态进行转换 11.quick-coco2dx-x烧写到androID/ios真机 @H_301_0@官网链接如下: @H_301_0@http://cn.cocos2d-x.org/tutorial/show?id=1471 @H_301_0@文章二 @H_301_0@http://cn.cocos2d-x.org/article/index?type=quick_doc&url=/doc/cocos-docs-master/manual/framework/quick/V3/how-to/compile-android/zh.md @H_301_0@文章三 @H_301_0@http://cn.cocos2d-x.org/article/index?type=quick_doc&url=/doc/cocos-docs-master/tutorial/framework/quick/chap1/zh.md蛤蟆实践过程如下:
androID环境编译手动记录,下面这些是必须的:
·Quick-Cocos2d-x引擎
·JDK
·androID-sdk
·androID-ndk(r9以上)
@H_301_0@环境变量中需要设置ANDROID_NDK_ROOT @H_301_0@1、进入项目\upgrade_bak\frameworks\runtime-src\proj.androID2、在proj.androID目录下执行./build_native(Mac)或者build_native.bat(windows)拷贝资源和编译C++文件。 @H_301_0@编译完成后我们可以在proj.androID目录下面的assets中有res和src文件夹,这两个文件夹就是我们的资源文件夹。(此处处理后第4、5步就不用 *** 作了) @H_301_0@3、通过Eclipse来打包。 @H_301_0@使用Eclipse打包相对来说要简单的多,打开Eclipse,点击
file->import
,在d出的界面中选择Existing AndroID Code Into Workspace
: @H_301_0@选择刚才创建的工程,导入完成后点击Finish
结束导入。 @H_301_0@4、将LUA 项目中\upgrade_bak \cocos2d-x\cocos\platform\androID\java\src中java代码 @H_301_0@复制到ECliPSE项目中的\src 中,覆盖之。 @H_301_0@5、最后将LUA代码复制到Eclipse 项目中assets/src/ 下 @H_301_0@ 如果有图片等资源存放至:\assets\res\ @H_301_0@ @H_301_0@6、编译运行。 @H_301_0@成功! 1.4出错问题 @H_301_0@运行Build_native.bat出错 @H_301_0@'./obj/local/armeabI/ObJs-deBUG/extra_static/F_\cocosIDe_zhizuo\test\upgra @H_301_0@de_bak\frameworks\runtime-src\proj.androID\/__/Classes/quick-src/extra/luabindin @H_301_0@g/lua_cocos2dx_extension_filter_auto.o.d': @H_301_0@Error opening output file @H_301_0@答:项目路径超长 @H_301_0@复制\upgrade_bak文件夹出来到分区根目录下重命名后编辑即可。 @H_301_0@ 12.相关链接 @H_301_0@升级到最新3.2rc0 @H_301_0@http://cn.cocos2d-x.org/article/index?type=quick_doc&url=/doc/cocos-docs-master/manual/framework/quick/V3/how-to/upgrade/zh.md 13.其他友情链接 13.1王信文(刀塔传奇)创业笔记 @H_301_0@http://www.verypig.com/ 13.2创业不简单:一个失败手游创业者的自白 @H_301_0@ @H_301_0@http://www.niaogebiji.com/article-4056-1.html 13.3鸟哥笔记 @H_301_0@http://www.niaogebiji.com/article-1948-1.html 13.4Hadoop开源社区 @H_301_0@http://www.oschina.net/question/tag/hadoop 总结 以上是内存溢出为你收集整理的quick-cocos2d-x 学习系列之 开篇杂记全部内容,希望文章能够帮你解决quick-cocos2d-x 学习系列之 开篇杂记所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)