cocos2dx(3.17)-lua 开发 (持续更新)

cocos2dx-lua 游戏开发

开发环境: mac,cocos2dx 3.17

开发语言: lua

前言

cocos2dx 英文官网:http://www.cocos2d-x.org/
cocos2dx 中文社区:http://www.cocos.com/

横屏竖屏

  打开工程目录下的config.json文件,横屏竖屏由isLandscape控制,true为横屏,flase为竖屏,其中widthheight是控制模拟器的大小

屏幕适配

  打开工程目录下src/config.lua文件,修改CC_DESIGN_RESOLUTION下的参数,具体修改方法可参考博客

添加精灵

  打开工程目录下src/app/views/MainScene.lua文件,添加一下代码

    local png = "2.png" --文件路径
    local sprite = cc.Sprite:create(png)--,cc.rect(0,0,0,0))
    self:addChild(sprite)
    sprite:setPosition(display.width/2,display.height/2)

具体可以参考博客cocos2dx-lua中sprite精灵的3种创建方法

创建按钮及按钮事件

    local playBotton = cc.MenuItemImage:create("botton.png","botton.png")
        :onClicked(function (  )
            print("点击按钮,到MainScene")
            self:getApp():enterScene("PlayScene")
        end)
        cc.Menu:create(playBotton)
            :move(display.cx-200, display.cy+200)
            :addTo(self)

链接

单点触摸事件

local layer = cc.Layer:create()
self:addChild(layer)

local sprite = cc.Sprite:create("res/13.png")
--sprite:setPosition(cc.p(origin.x + size.width/2 - 80, origin.y + size.height/2 + 80))
sprite:setPosition(300,300)
layer:addChild(sprite, 10)

--实现事件触发回调
local function onTouchBegan(touch, event)
local target = event:getCurrentTarget()

local locationInNode = target:convertToNodeSpace(touch:getLocation())
local s = target:getContentSize()
local rect = cc.rect(0, 0, s.width, s.height)

if cc.rectContainsPoint(rect, locationInNode) then
return true
end
return false
end
local function onTouchMoved(touch, event)
end
local function onTouchEnded(touch, event)
print("触摸事件")
sprite:setPosition(300,500)
end


local listener = cc.EventListenerTouchOneByOne:create() -- 创建一个事件监听器
listener:setSwallowTouches(true)
listener:registerScriptHandler(onTouchBegan, cc.Handler.EVENT_TOUCH_BEGAN)
listener:registerScriptHandler(onTouchMoved, cc.Handler.EVENT_TOUCH_MOVED)
listener:registerScriptHandler(onTouchEnded, cc.Handler.EVENT_TOUCH_ENDED)

local eventDispatcher = self:getEventDispatcher() -- 得到事件派发器
eventDispatcher:addEventListenerWithSceneGraphPriority(listener, sprite) -- 将监听器注册到派发器中

存放数据

cc.UserDefault:getInstance():setIntegerForKey("hightscore1", self.hightscore1)

读取数据

self.hightscore1 = cc.UserDefault:getInstance():getIntegerForKey("hightscore1")

艺术字体

首先在res文件中加入字体文件:".fnt"以及".png"文件
然后调用下面命令

local bmFont  = ccui.TextBMFont:create()
	:move(display.cx, display.cy -200 )    --坐标
	:addTo(self)    --加入场景
	bmFont:setFntFile("res/myFont.fnt")
	bmFont:setString("内容")

字体

local label = cc.Label:createWithTTF("用户登录","res/font1.ttf",50 )
        :setColor(ccc3(0,0,0))			--设置字体颜色
        :move(display.cx - 500 ,display.cy)
        :addTo(self)

延时函数

performWithDelay(node,function()  
	print("Hello")  
	end,time) 

滚动容器

-- 测试 pageView  
local pageView = ccui.PageView:create()  
--设置pageView长宽  
pageView:setContentSize(600,600)  
--设置是否响应触摸事件  
pageView:setTouchEnabled(true)  
--设置锚点  
pageView:setAnchorPoint(cc.p(0.5,0.5))  
--设置位置在中心位置  
pageView:setPosition(display.center)  

for i=1,5 do  
---然后layout,每个layout保存一个page  
local layout = ccui.Layout:create()  
--为了演示这里做个小图片  
layout:setContentSize(600,600)  
layout:setPosition(0,0)  
--创建一个button  
local btn= ccui.Button:create("game/dian/Maininterface/tuichu.png","game/dian/Maininterface/tuichi.png","game/dian/Maininterface/weizi.png"):setPosition(300,300)  
layout:addChild(btn)  
pageView:addChild(layout)---一个layout 为一个page内容   page:addPage(layout)  
end  
--添加pageView 到场景中  
self:addChild(pageView)  

--添加事件响应  
pageView:addEventListener(handler(self, self.onEvent))  

--事件响应方法  
function MainScene:onEvent(sender,event)  
print("1234")
-- if event == ccui.PageViewEventType.turning then  
--     local pageNum = sender:getCurrentPageIndex()  
--     print("is turning,this PageNum:"..pageNum)  
-- end  
end 

拖动精灵

local sprite = cc.Sprite:create("")--自己随便找个图片试一试
    local function onTouchBegan( touch, event )
            local point = touch:getLocation()      --获取鼠标坐标
            local rect = sprite:getBoundingBox()    --  获取精灵的范围   
            if (cc.rectContainsPoint(rect,point)) then   --判断鼠标是否在精灵范围内,是触发
                return true;
            end
            return false
            --这里必须判断,不然拖动屏幕精灵也会移动
    end
    local function onTouchEnded( touch, event )
        -- body
    end
 
    local function onTouchMoved(touch, event)
        local target = sprite  --获取当前的控件(这里是精灵)
        local posX,posY = target:getPosition()  --获取当前的位置
        local delta = touch:getDelta() --获取滑动的距离
        target:setPosition(cc.p(posX + delta.x, posY + delta.y)) --给精灵重新设置位置
    end
 
    local listener1 = cc.EventListenerTouchOneByOne:create()  --创建一个单点事件监听
    listener1:setSwallowTouches(true)  --是否向下传递
    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:addEventListenerWithSceneGraphPriority(listener1, sprite) --分发监听事件

获取鼠标点击位置

        local location = touch:getLocation()   --获取鼠标的位置
        local event_x = location["x"] or 0
        local event_y = location["y"] or 0
        print("event_x = " .. event_x .. "           event_y = " .. event_y)

游戏暂停

说明,点击“go”按钮,按钮变成“stop”

 local spriteFrame = cc.SpriteFrameCache:getInstance()
    spriteFrame:addSpriteFrames("Plist.plist")
    local goSprite = cc.Sprite:createWithSpriteFrameName("go.png")
    local stopSprite = cc.Sprite:createWithSpriteFrameName("stop.png")
    local goToggleMenuItem = cc.MenuItemSprite:create(goSprite, goSprite)  
    local stopToggleMenuItem = cc.MenuItemSprite:create(stopSprite,stopSprite)  
    local toggleMenuItem = cc.MenuItemToggle:create(goToggleMenuItem,stopToggleMenuItem)  
    toggleMenuItem:setPosition(cc.Director:getInstance():convertToGL(cc.p(930,540)))
    local a = cc.Menu:create(toggleMenuItem)
    a:setPosition(cc.p(0,0))
    self:addChild(a)

滑动条的使用

    self.jindutiao = self.mView['jindutiao']
    self.jindutiao:addEventListener(function(sender ,eventType)
        local volume = self.jindutiao:getPercent()  
        pritn(volume)
    end)

说明:

getPercent()  --获取滑动条当前值
getMaxPercent()  --获取滑动条最大值
getMinPercent()--获取滑动条最小值
setPercent()  --设置滑动条当前值
setMaxPercent()  --设置滑动条最大值
setMinPercent()--设置滑动条最小值

播放帧动画

该方法需要提前cocos studio上将帧动画创建好

self.root = cc.CSLoader:createNode('game/basketball/Node.csb')
self.root:move(x,y)
self.root:addTo(self)
        local action = cc.CSLoader:createTimeline('game/basketball/Node.csb')
        self.root:runAction(action)
        action:pause()
        action:clearFrameEventCallFunc()
        action:gotoFrameAndPlay(0,20,false)
        --从第0帧播放到20帧,直播一次

求夹角

    local p1 = {x = x1 , y = y1}
    local p2 = {x = x2 , y = y2 }
    self:getAngleByPos(p1,p2)
    function GameScene:getAngleByPos(p1,p2)
    local p = {}
    p.x = p2.x - p1.x
    p.y = p2.y - p1.y
    local r = math.atan2(p.y , p.x) * 180/math.pi
    print("夹角为:" .. r)
end

画二次贝塞尔曲线

function GameScene:testBezier()
    if not self.drawNode then
        self.drawNode = cc.DrawNode:create(). --创建节点
        self:addChild(self.drawNode)
    end
    self.drawNode:clear()     --删除节点
    self.drawNode:drawQuadBezier(cc.p(self.xp0,self.yp0),cc.p(self.xp1,self.yp1),cc.p(self.xp2,self.yp2),1000,cc.c4f(1,1,0,1))
end
--p0,p1,p2 分别为曲线起点,控制点,终点

精灵的运动

旋转

self.sprite:runAction(cc.RepeatForever:create(cc.RotateBy:create(1,360))) --以锚点为中心不停的旋转,速度为每秒中360

直线运动

self:runAction(cc.MoveTo:create(time,cc.p(x , y)))
self:runAction(cc.MoveBy:create(time,cc.p(x , y)))
--To移动到指定位置
--By移动到相对位置

跳跃运动

self:runAction(cc.JumpTo:create(time,cc.p(x , y),a,b))
self:runAction(cc.JumpBy:create(time,cc.p(x , y),a,b))
--参数time表示时间,a表示最高点,b表示跳跃次数

停止运动

	self:stopAllActions()

按顺序运动

local run1 = self:runAction(cc.RotateTo:create(1,-80))
    local run2 = self:runAction(cc.RotateTo:create(1,80))
    local delay = cc.DelayTime:create(0.01)
  	self:runAction(cc.RepeatForever:create(cc.Sequence:create(run1,delay,run2,delay)))

渐入渐出

self:runAction(cc.FadeIn:create(0.1)) -- 渐入
self:runAction(cc.FadeOut:create(0.1)) --渐出

放大缩小

self:runAction(cc.ScaleTo:create(0.5,1)) --放大,参数:时间和缩放尺寸
self:runAction(cc.ScaleTo:create(0.2,0.6)) --缩小

画直线

    self.Yg_DrawNode = cc.DrawNode:create()
    self:addChild(self.Yg_DrawNode)
    self.Yg_DrawNode:drawLine(cc.p(qidian_x,qidian_y),cc.p(zhongdian_x ,zhongdian_y),cc.c4f(0,0,0,5)) --参数 起点坐标,终点坐标,线条的颜色

游戏暂停、继续

CCDirector.sharedDirector():pause() --游戏暂停
CCDirector.sharedDirector():resume() --游戏继续
发布了65 篇原创文章 · 获赞 141 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/Silent_F/article/details/84846000
今日推荐