首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >cocos2dx-lua游戏开发

cocos2dx-lua游戏开发

作者头像
三尺青锋
发布2023-01-01 15:24:49
1.1K0
发布2023-01-01 15:24:49
举报
文章被收录于专栏:淡忘的博客淡忘的博客

开发环境: mac,cocos2dx 3.17 开发语言: lua

前言

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

(adsbygoogle = window.adsbygoogle || []).push({});

横屏竖屏

打开工程目录下的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种创建方法

创建按钮及按钮事件

方法1:

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)

方法2:

local button = ccui.Button:create()
	button:setPosition(display.centor)
	button:addTo(self)
	button:setEnable(true)    --是否禁用

链接

单点触摸事件

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)

如果数据是表格
cc.UserDefault:getInstance():setStringForKey("biaoge", json.encode(sss))

读取数据

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

如果数据是表格
cc.UserDefault:getInstance():getStringForKey("biaoge")

艺术字体

首先在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)

AtlasLabel 数字标签

local AtlasLabel = ccui.TextAtlas:create("0123456789",img, 9, 12, "0")
-- 参数分别是  数字 图片 宽 高 首个数字

延时函数

global.countDown.createTimer("time", time )
     local node = cc.Node:create()
     node:addTo(self)
     performWithDelay(node,function()
         print("时间到")
         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.root:getChildByName('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() --游戏继续

两个矩形的碰撞

local juxingA = A:getBoundingBox()
local juxingB = B:getBoundingBox()
if (cc.rectIntersectsRect(juxingA,juxingB))then
        print("撞到了")
    end

点是否在矩形内

local juxingA = A:getBoundingBox()
local Point = {x = x1, y = y1}

if (cc.rectContainsPoint(juxingA,Point)) then
        print("撞到了")
    end

解析json数据

在文件中添加下面语句
local json = cc.load("tools").json

背景音乐与音效

AudioEngine.playMuisc(“bg.mp2”, true)      --播放背景音乐,第二个参数为true表示循环播放,默认情况下为false
AudioEngine.stopMusic()                    --停止播放背景音乐

AudioEngine.pauseMusic()                   --暂停播放背景音乐

AudioEngine.resumeMusic()                  --恢复播放背景音乐

AudioEngine.isMusicPlaying()               --判断背景音乐是否播放

AudioEngine.preloadEffect(“effect.mp3”)    --预加载音效

AudioEngine.playEffect(“effect.mp3”)       --播放音效

AudioEngine.pauseEffect(id)                --暂停播放音效,id是playEffect返回的参数

AudioEngine.pauseAllEffect()               --暂停所有音效的播放

AudioEngine.resumeEffect(id)               --继续播放某个音效

AudioEngine.resumeAllEffect()              --继续播放所有音效

AudioEngine.stopEffect(id)                 --停止播放某一音效

AudioEngine.stopAllEffect()                --停止所有音效播放

AudioEngine.setMusicVolume(0.5)            --设置背景音乐音量

AudioEngine.setEffectsVolume(0.5)          --设置音效音量

AudioEngine.getMusicVolume()               --获得背景音乐音量

AudioEngine.getEffectsVolume()             --获得音效音量

容器添加点击事件

Panel:addTouchEventListener(function(sender,eventType)
    if 2 == eventType then
    end
end)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 横屏竖屏
  • 屏幕适配
  • 添加精灵
  • 创建按钮及按钮事件
  • 单点触摸事件
  • 存放数据
  • 读取数据
  • 艺术字体
  • 字体
  • AtlasLabel 数字标签
  • 延时函数
  • 滚动容器
  • 拖动精灵
  • 获取鼠标点击位置
  • 游戏暂停
  • 滑动条的使用
  • 播放帧动画
  • 求夹角
  • 画二次贝塞尔曲线
  • 精灵的运动
    • 旋转
      • 直线运动
        • 跳跃运动
          • 停止运动
            • 按顺序运动
              • 渐入渐出
                • 放大缩小
                • 画直线
                • 游戏暂停、继续
                • 两个矩形的碰撞
                • 点是否在矩形内
                • 解析json数据
                • 背景音乐与音效
                • 容器添加点击事件
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档