cocos2d-lua notebook
创建工程
- 用cocos直接创建
- cmd命令行创建
1.cd C:\Cocos\Cocos2d-x\cocos2d-x-3.10\tools\cocos2d-console\bin
2.python cocos.py new 游戏名 -p ID号 -l lua -d 游戏路径
载入场景
--class("PlayScene",...)PlayScene自己定义的类名
local PlayScene = class("PlayScene", cc.load("mvc").ModuleBase)--继承类MoubleBase
PlayScene.RESOURCE_FILENAME = "game/Pork/PlayScene.csb"--载入cocos studio设置的场景 csb格式
读取cocos studio中场景控件
function PlayScene:onCreate()
self.button=self.mView["button"]
--变量名 = self.mView["cocos sdudio中设置的控件名"]
end
require
- 加载指定的模块(类似#include),加载了该模块,那么就可已使用模块中的全局函数和全局数据
- require 用于搜索 Lua 文件的路径是存放在全局变量 package.path 中
- import() 与 require() 功能相同,但具有一定程度的自动化特性。
--直接 切换场景
require("logic.game.Pork.PlayScene"):create():showWithScene()
--读取这个路径下文件,并赋值给前面的变量
local playscene = require("logic.game.Pork.PlayScene")
playScene.new:showWithScene()--切换
- 具体可见菜鸟教程 http://www.runoob.com/lua/lua-modules-packages.html
Lua中函数使用:
定义方式:
1. tab.func=function ( 参数)
end
2. function tab.func( 参数)
end
3. function tab:func( 参数)
end
调用方式:
- b.func(参数)
- tab:func(参数)
ps:调用方式可采用self:func()
如果用self.func() 会报错,正确用法self.func(self)
moveTo & moveBy
存在坐标pos1(x1,y1),pos2(x2,y2)
cc.MoveTo:由pos1移动到pos2
cc.MoveBy:终坐标pos3=pos1+pos2 (相对偏移向量)
进度条的属性
- left:setMidpoint(cc.p(0, 0))
setMidpoint()函数是设置进度条的起始点
(0,y)表示最左边
(1,y)表示最右边
(x,1)表示最上面
(x,0)表示最下面 - right:setBarChangeRate(cc.p(1, 0))
setBarChangeRate()函数是用来设置进度条动画方向的
(1,0)表示横方向
(0,1)表示纵方向 - 通过cocos studio中控件直接设置
self.loadingBar:setPercent(100-count)
- 具体可见 https://blog.csdn.net/tropicofcancer9/article/details/80018091
和 https://www.2cto.com/kf/201407/317409.html
贝塞尔曲线 + 翻转
local flipxAction = cc.FlipX:create(true)
--参数(时间,{起点,控制点、终点})
local moveTo1 = cc.BezierTo:create(10, {cc.p(sprites:getPosition()), cc.p(spritePointS[1], spritePointS[2]), cc.p(spriteFinalS[1], spriteFinalS[2])})
local moveTo2 = cc.BezierTo:create(10, {cc.p(sprites:getPosition()), cc.p(spritePoint[1], spritePoint[2]), cc.p(spriteFinal[1], spriteFinal[2])})
local action = cc.Sequence:create(moveTo1, flipxAction, moveTo2, flipxAction)
画直线
local draw = cc.DrawNode:create()
:addTo(self)
draw:drawLine(cc.p(0,0),cc.p(1000,1000),cc.c4f(0,0,0,5))
--参数(起点,终点,线条颜色)
旋转
--以锚点为中心1s旋转360度
local run = cc.RotateBy:create(1,360)
local action = cc.RepeatForever:create(run)
self.sprite:runAction(action)
--停止所有动作
self.sprite:stopAllActions()
读取文件内容
function playScene:ReadScore(path)
--r 读取/ a 追加/ w 写/ b 打开二进制 /r+ 更新,之前所有数据将保存 / w+ 更新,之前所有数据将被清除 /a+ 文件末尾添加
local file = io.open(path,"r")
if file then
local content = file:read("*a")
io.close(file)
return content
end
return 0
end
将内容写入文件
function playScene:WriteScore(path, content ,mode)
local file = io.open(path, mode)
if file then
if file:write(content) == nil then
return false
end
io.close(file)
return true
else
return false
end
end
UserDefault (key-value)
local file = cc.UserDefault:getInstance()
local a = file:getIntegerForKey("key")
print(a)
file:setIntegerForKey("key", value)
local a = file:getIntegerForKey("key")
print(a)
滑动条 (坑)
-- --滑动条的使用 控制音量 失败
local function onChangedSlider(sender,eventType) --回调函数 (滑块对象, 事件类型)
local slider = sender
if eventType == ccui.SliderEventType.percentChanged then --滑块值改变事件
local percent = slider:getPercent() --获取音量
audio.stopMusic()
audio.setMusicVolume(0) --?????????
print(percent)
end
end
self.audioSlider:addEventListener(onChangedSlider)
计时器的使用
- 方法1(切换场景时存在一些问题)
local director = cc.Director:getInstance()
local function update(dt)
......
end
director:getScheduler():scheduleScriptFunc(update,1,false)
- 方法2(推荐)
function PlayScene:onCreate()
self:onUpdate(handler(self,self.update)) --刷新时间
local count = 0
end
function PlayScene:update(dt)
count = count + dt
print(count)
end
序列帧动画的播放
self.fishgroup = cc.CSLoader:createNode("res/game/try/Node.csb")
:addTo(self)
local action = cc.CSLoader:createTimeline("res/game/try/Node.csb")
self.fishgroup:runAction(action)
action:gotoFrameAndPlay(0,60,true) --0-60帧 true循环
触摸事件
--触摸回调函数
local function onTouchBegan( touch, event )
end
local function onTouchEnded( touch, event )
end
local function onTouchMoved(touch, event)
end
local listener1 = cc.EventListenerTouchOneByOne:create() --创建单点触摸事件监听
listener1:setSwallowTouches(false) --是否向下传递
--注册触摸事件
listener1:registerScriptHandler(onTouchBegan,cc.Handler.EVENT_TOUCH_BEGAN )
listener1:registerScriptHandler(onTouchMoved,cc.Handler.EVENT_TOUCH_MOVED )
listener1:registerScriptHandler(onTouchEnded,cc.Handler.EVENT_TOUCH_ENDED )
local eventDispatcher = self:getEventDispatcher()
eventDispatcher:addEventListenerWithFixedPriority(listener1,-1) --分发监听事件
self._listener = listener1
弹幕lua
https://blog.csdn.net/u011755031/article/details/50931089
遇到的问题
- 使用cocos studio创建ui时:
路径发步与打包必须时res中,否则后续会导致很多错误,这步非常关键 - 关于世界坐标和本地坐标的转换失败的情况,暂时我也没弄懂,等我弄懂了就来补坑,目前我的解决方法是不要设置场景元素的父子节点,直接全都放在世界场景中。
- 瞬时动作和延时动作在刷新时间函数的时候可能会产生冲突,可用Sequence解决
local action = cc.Sequence:create(... , ...)
...:runAction(action)
- UserDefault数据未永久保存,可能是文档里面缺少root