quick-cocos2d-x 学习系列之 开篇杂记

quick-cocos2d-x 学习系列之 开篇杂记,第1张

概述         开始学习quick-cocos2d-x这个工具了,边学边记录吧。 邮箱[email protected] 欢迎各界交流 1.  官方链接 1.1    quick-x-player 使用说明 http://quick.cocoachina.com/?p=39   1.2    初窥 quick-cocos2d-x http://quick.cocoachina.com/?p=1 这 @H_301_0@ 开始学习quick-cocos2d-x这个工具了,边学边记录吧。

@H_301_0@邮箱[email protected]

@H_301_0@欢迎各界交流

1.官方链接 1.1quick-x-player 使用说明 @H_301_0@http://quick.cocoachina.com/?p=39

1.2初窥 quick-cocos2d-x @H_301_0@http://quick.cocoachina.com/?p=1

@H_301_0@这篇文档讲的甚是明白

1.3用 Eclipse LDT 调试 quick-cocos2d-x 游戏 @H_301_0@http://quick.cocoachina.com/?p=1527

@H_301_0@断点调试编码必备

@H_301_0@需要什么信息,可以直接在官网上进行搜索,必定会得到你想要的结果。

2.Quick和cocos2d-x区别 @H_301_0@引用自官方文档:quick 和 cocos2d-x 的主要区别有如下几点:

@H_301_0@1.更完善的 Lua 支持,包括一个 Lua 框架对 C++ 接口进行了二次封装

@H_301_0@2.补充了大量cocos2d-x 没有提供,但游戏需要的功能

@H_301_0@3.为提高开发效率,提供了Objective-C 和 Java 的桥接模块,以及强化的 windows/Mac 模拟器

3.PLAYER @H_301_0@引用官方:quick-cocos2d-x 里附带了一个功能强大的模拟器,称为 quick-x-player(后文简称 player)。

@H_301_0@player 可以在 Mac 和 windows 环境中模拟游戏引擎的绝大部分功能。在开发过程中,利用 player 可以高效的测试游戏功能。

2.1从命令行启动 player @H_301_0@Player支持从命令行启动,感觉貌似作用不大了,因为现在直接可在图形化 *** 作了。具体参数参看官网。

4.动态实时调试举例 @H_301_0@这里先通过Player创建一个项目后,

@H_301_0@在src目录中便可找到config.lua。

@[email protected]文件中,定义了程序的一些特性是否开启,如是否调试、是否显示FPS信息等。

@H_301_0@ 在code-IDe中编辑MainScene.lua文件,修改如下文件

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存档路径 @[email protected]获得存档文件保存目录

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 引擎级事件

@[email protected]_EVENT=0

@[email protected]_ENTER_FRAME_EVENT=1

@[email protected]_touch_EVENT=2

@[email protected]_touch_CAPTURE_EVENT=3

@[email protected]_ITEM_CliCKED_EVENT=4

@[email protected]_EVENT=5

@[email protected]_EVENT=6

@H_301_0@event参数里,里面有namexyprevXprevY 这五个变量,分别代表着

@H_301_0@·event.name 是触摸事件的状态:began,moved,ended,cancelled,added(仅限多点触摸),removed(仅限多点触摸);

@H_301_0@·event.x,event.y 是触摸点当前位置;

@H_301_0@·event.prevX,event.prevY 是触摸点之前的位置;

8.8触摸捕获世界

触摸捕获事件的优先级要比触摸事件要高,换句话说,触摸捕获事件会比触摸事件先响应,并且有权不分发给触摸事件响应。举例如下

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. 添加事件监听addNodeEventListener

local 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.androID
2
、在proj.androID目录下执行./build_native(Mac)或者build_native.bat(windows)拷贝资源和编译C++文件。

@H_301_0@编译完成后我们可以在proj.androID目录下面的assets中有ressrc文件夹,这两个文件夹就是我们的资源文件夹。(此处处理后第45步就不用 *** 作了)

@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\srcjava代码

@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 学习系列之 开篇杂记所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1034874.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存