【学习笔记】Cocos2d-x Lua脚本引擎之HelloLua分析笔记

Cocos2d-x Lua开发入门:从HelloLua示例到游戏原型搭建 在游戏开发领域,跨平台引擎是构建2D移动游戏的核心工具。Cocos2d-x作为一款成熟的开源引擎,通过C++核心与Lua脚本的结合,实现了性能与开发效率的平衡。其技术价值在于提供了完整的渲染、物理、音频等模块,并支持热更新机制,特别适合快速迭代的移动游戏项目。在应用场景上,开发者常从HelloLua这样的基础示例入手,学习场景管理、资源加载和交互处理。本文聚焦于HelloLua项目的深度解析,涵盖环境配置、项目结构、代码原理及性能调试,帮助初学者掌握Cocos2d-x Lua开发的关键步骤,并基于此搭建首个 阅读详情
-- for CCLuaEngine traceback
function __G__TRACKBACK__(msg)
    print("----------------------------------------")
    print("LUA ERROR: " .. tostring(msg) .. "\n")
    print(debug.traceback())
    print("----------------------------------------")
end

local function main()
    -----------------------------------------------------------------
    -- avoid memory leak
    collectgarbage("setpause", 100)
    collectgarbage("setstepmul", 5000)
    --[[-------------------------------------------------------------
    补充说明:
        collectgrabage(opt [, arg])
        功能:垃圾收集器的通用接口,用于操作垃圾收集器
        参数:
            opt--操作方法标志
            "stop" : 停止垃圾收集器
            "restart" : 重启垃圾收集器
            "collect" : 执行一次全垃圾收集循环
            "count" : 返回当前Lua中使用的内存量(以KB为单位)
            "step" : 单步执行一个垃圾收集.步长"size"由参数arg指定.如果完成一次收集循环,将返回True
            "setpause" : 设置arg/100的值作为暂定收集的时长
            "setstepmul" : 设置arg/100的值,作为步长的增幅(即新步长 = 旧步长*(arg/100))
    --]]-------------------------------------------------------------
    
    
    
    
    -----------------------------------------------------------------
    --自定义打印函数,将字符串打印出来
    --其实这里可以调用CCLuaLog函数来打印字符串
    local cclog = function(...)
        print(string.format(...))
    end
    -----------------------------------------------------------------
    
    
    
    

    -----------------------------------------------------------------
    --包含hello2这个脚本,该脚本定义了myadd(x, y)函数
    require "hello2"
    cclog("result is " .. myadd(3, 5))
    -----------------------------------------------------------------
    
    
    
    
    -----------------------------------------------------------------
    --获取可视区域
    local visibleSize = CCDirector:sharedDirector():getVisibleSize()
    --获取可是区域的原点坐标,OpenGL坐标系 左下角为原点
    local origin = CCDirector:sharedDirector():getVisibleOrigin()
    -----------------------------------------------------------------



    -- add the moving dog
    local function creatDog()
        --dog.png的规格是 210*95, 由两个frame组成规格皆为105*95
        local frameWidth = 105
        local frameHeight = 95

        -- create dog animate
        local textureDog = CCTextureCache:sharedTextureCache():addImage("dog.png")
        --rect用于捕捉textureDog的纹理并赋给frame0
        local rect = CCRectMake(0, 0, frameWidth, frameHeight)
        local frame0 = CCSpriteFrame:createWithTexture(textureDog, rect)
        --rect用于捕捉textureDog的纹理并赋给frame1
        rect = CCRectMake(frameWidth, 0, frameWidth, frameHeight)
        local frame1 = CCSpriteFrame:createWithTexture(textureDog, rect)
        
        --创建松鼠精灵
        local spriteDog = CCSprite:createWithSpriteFrame(frame0)
        spriteDog.isPaused = false
        spriteDog:setPosition(origin.x, origin.y + visibleSize.height / 4 * 3)
        
        
        
        --接下来的代码是要创建一个CCAction对象,让spriteDog来run这个CCAction对象
        --步骤如下:
          --1.使用数组animFrames保存序列帧
          --2.利用该数组创建一个CCAnimation对象
          --3.利用CCAnimation对象创建CCAnimate对象
          --4.利用CCAnimate对象创建CCAction对象
          --5.run这个CCAction
        
        local animFrames = CCArray:create()

        animFrames:addObject(frame0)
        animFrames:addObject(frame1)

        local animation = CCAnimation:createWithSpriteFrames(animFrames, 0.5)
        local animate = CCAnimate:create(animation);
        spriteDog:runAction(CCRepeatForever:create(animate))
        -----------------------------------------------------------------




        -- moving dog at every frame
        local function tick()
            --如果暂停了,那么返回,不对spriteDog做任何操作
            if spriteDog.isPaused then return end
            
            --根据spriteDog的当前position来判断下一个position
            local x, y = spriteDog:getPosition()
            if x > origin.x + visibleSize.width then
                x = origin.x
            else
                x = x + 1
            end
            
            --更新位置
            spriteDog:setPositionX(x)
        end
        --设置每帧调用trick函数
        CCDirector:sharedDirector():getScheduler():scheduleScriptFunc(tick, 0, false)

        return spriteDog
    end

    -- create farm
    local function createLayerFarm()
        local layerFarm = CCLayer:create()

        -- add in farm background
        local bg = CCSprite:create("farm.jpg")
        bg:setPosition(origin.x + visibleSize.width / 2 + 80, origin.y + visibleSize.height / 2)
        layerFarm:addChild(bg)

        -- add land sprite
        for i = 0, 3 do
            for j = 0, 1 do
                local spriteLand = CCSprite:create("land.png")
                spriteLand:setPosition(200 + j * 180 - i % 2 * 90, 10 + i * 95 / 2)
                layerFarm:addChild(spriteLand)
            end
        end

        -- add crop
        local frameCrop = CCSpriteFrame:create("crop.png", CCRectMake(0, 0, 105, 95))
        for i = 0, 3 do
            for j = 0, 1 do
                local spriteCrop = CCSprite:createWithSpriteFrame(frameCrop);
                spriteCrop:setPosition(10 + 200 + j * 180 - i % 2 * 90, 30 + 10 + i * 95 / 2)
                layerFarm:addChild(spriteCrop)
            end
        end

        -- add moving dog
        local spriteDog = creatDog()
        layerFarm:addChild(spriteDog)
        
        
        -- handing touch events
        local touchBeginPoint = nil
        
        --触摸开始
        local function onTouchBegan(x, y)
            cclog("onTouchBegan: %0.2f, %0.2f", x, y)
            touchBeginPoint = {x = x, y = y}
            spriteDog.isPaused = true
            -- CCTOUCHBEGAN event must return true
            return true
        end
        
        --触摸移动
        local function onTouchMoved(x, y)
            cclog("onTouchMoved: %0.2f, %0.2f", x, y)
            if touchBeginPoint then
                local cx, cy = layerFarm:getPosition()
                layerFarm:setPosition(cx + x - touchBeginPoint.x,
                                      cy + y - touchBeginPoint.y)
                touchBeginPoint = {x = x, y = y}
            end
        end
        
        --触摸结束
        local function onTouchEnded(x, y)
            cclog("onTouchEnded: %0.2f, %0.2f", x, y)
            touchBeginPoint = nil
            spriteDog.isPaused = false
        end
        
        --触屏事件获得eventType:began/moved/ended
        local function onTouch(eventType, x, y)
            if eventType == "began" then   
                return onTouchBegan(x, y)
            elseif eventType == "moved" then
                return onTouchMoved(x, y)
            else
                return onTouchEnded(x, y)
            end
        end

        --注册Targeted触屏事件
        layerFarm:registerScriptTouchHandler(onTouch)
        
        layerFarm:setTouchEnabled(true)

        return layerFarm
    end


    -- create menu
    local function createLayerMenu()
        local layerMenu = CCLayer:create()

        local menuPopup, menuTools, effectID

        local function menuCallbackClosePopup()
            -- stop test sound effect
            SimpleAudioEngine:sharedEngine():stopEffect(effectID)
            menuPopup:setVisible(false)
        end

        local function menuCallbackOpenPopup()
            -- loop test sound effect
            local effectPath = CCFileUtils:sharedFileUtils():fullPathForFilename("effect1.wav")
            effectID = SimpleAudioEngine:sharedEngine():playEffect(effectPath)
            menuPopup:setVisible(true)
        end
        
        -- add a popup menu
        local menuPopupItem = CCMenuItemImage:create("menu2.png", "menu2.png")
        menuPopupItem:setPosition(0, 0)
        menuPopupItem:registerScriptTapHandler(menuCallbackClosePopup)
        menuPopup = CCMenu:createWithItem(menuPopupItem)
        menuPopup:setPosition(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2)
        menuPopup:setVisible(false)
        layerMenu:addChild(menuPopup)
        
        -- add the left-bottom "tools" menu to invoke menuPopup
        local menuToolsItem = CCMenuItemImage:create("menu1.png", "menu1.png")
        menuToolsItem:setPosition(0, 0)
        menuToolsItem:registerScriptTapHandler(menuCallbackOpenPopup)
        menuTools = CCMenu:createWithItem(menuToolsItem)
        local itemWidth = menuToolsItem:getContentSize().width
        local itemHeight = menuToolsItem:getContentSize().height
        menuTools:setPosition(origin.x + itemWidth/2, origin.y + itemHeight/2)
        layerMenu:addChild(menuTools)

        return layerMenu
    end

    -- play background music, preload effect

    -- uncomment below for the BlackBerry version
    -- local bgMusicPath = CCFileUtils:sharedFileUtils():fullPathForFilename("background.ogg")
    local bgMusicPath = CCFileUtils:sharedFileUtils():fullPathForFilename("background.mp3")
    SimpleAudioEngine:sharedEngine():playBackgroundMusic(bgMusicPath, true)
    local effectPath = CCFileUtils:sharedFileUtils():fullPathForFilename("effect1.wav")
    SimpleAudioEngine:sharedEngine():preloadEffect(effectPath)

    -- run
    local sceneGame = CCScene:create()
    sceneGame:addChild(createLayerFarm())
    sceneGame:addChild(createLayerMenu())
    CCDirector:sharedDirector():runWithScene(sceneGame)
end

xpcall(main, __G__TRACKBACK__)

LTE信令流程——切换 LTE信令流程 切换 切换是由基站发起的,不同于小区重选,小区重选是由UE发起的。 基站利用移动性管理算法给UE下发测量任务,在RRC重配置消息中携带MeasConfig信元给UE下发测量配置 切换有三种场景: 同一基站内不同小区的切换 不同基站间基于X2的切换(MME不变) 不同基站间基于S1的切换(MME/SGW可能改变) 1. 同一基站内不同小区的切换 连接态的UE在一个基站的不同小区之间移动 UE上报合适的测量报告(Measure Reports),触发基站切换 基站下发切换命令给UE, 阅读详情

相关推荐

tft_espi 中文字体及自定义字体制作(tft.eSPI模块)

tft.eSPI库自定义字体方法 先下载 processing 然后安装到mixly安装目录下找到tft_eSPI文件夹。

琢磨侠的博客 2763

cocos2d-lua自学笔记(纯属个人想法,不当之处请见谅)

UIListView(列表视图控件): UIListView是UIScrollView的扩展,创建一个列表视图具体步骤: 1.创建列表视图;2.创建列表视图项 两者有区别,通俗来说,第一步是创建一个框框,第二步则是在框框中添加具体的条目 创建视图: local list=cc.ui.UIListView.new(params)  --params参数的意思,可以创建一个列表视图也就是框框

a814949640的博客 719

Linux中断子系统(二)—— 通用框架处理

1、数据结构分析 (1)中断描述符结构structirq_desc: 1)打开CONFIG_SPARSE_IRQ宏(中断编号不连续),中断描述符以radix- tree来组织,用户在初始化时进行动态分配,然后再插入radix-tree中; 2)关闭CONFIG_SPARSE_IRQ宏(中断编号连续),中断描述符以数组的 形式组织,并且已经分配好; 3)不管哪种形式,最终都可以通过linuxirq号来找到对应的中断描述符; (2)stru...

weixin_38428439的博客 4871

cocos2dx+lua学习笔记:事件派发器CCEventDispatcher

cocos2dx内关于事件监听和派发的调度器EventDispatcher相关内容

孙君的空间站 1234

Intel AX系列网卡5G热点开启失败?Linux下3种修复方案实测(含Ubuntu/OpenWRT)

本文针对Intel AX系列网卡在Linux系统下无法开启5G热点的常见问题,深入剖析了其根源在于内核LAR机制与驱动的兼容性。文章提供了三种实测有效的修复方案:针对内核低于5.5的模块参数法、适用于高内核版本的hostapd补丁编译法以及高阶的驱动修改法,帮助用户在Ubuntu、OpenWRT等环境中成功启用5G热点功能。

weixin_29291863的博客 734

通信原理 | 随机数仿真 | 均匀、正态、双高斯、瑞利、莱斯、对数正态、nakagami、Suzuki分布的随机数仿真(matlab)

信道建模在通信系统设计和分析中扮演着至关重要的角色。它指的是使用数学和物理模型来描述和模拟无线或有线通信路径中的信号传播特性。

若北辰 1987

cocos2d-lua学习笔记1

从上一篇搭建好了cocos2d-lua环境,迫不及待的尝试一下,下面是学习的时候的代码 local MainScene = class("MainScene", cc.load("mvc").ViewBase) function MainScene:onCreate()     -- add background image     display.newSprite("Hel

pyf_914406232的博客 492

DFI协议时序

参数名称典型值应用场景关键影响tcmd_lat1-2个时钟周期命令与地址锁存同步地址错误风险tphy_wrlat1-2个时钟周期写操作响应速度写带宽与延迟2-3个时钟周期写操作端到端延迟系统吞吐量1-2个时钟周期连续写命令间隔信号干扰与资源冲突tphy_rdlat1-2个时钟周期读操作响应速度读带宽与延迟trddata_en由CL决定(如0.41 ns)读数据返回时间系统延迟10-20 ps写数据与命令对齐数据丢失风险<1 µs低功耗模式切换。

qq_43134430的博客 5103

cocos2d-x 3.7.1 lua 笔记

display.newSprite(“#xxx.png”) 带#号表示从framecache里面取图,不带则从本地文件读取。 为layer添加触摸事件 local touchLayer = display.newLayer() touchLayer:onTouch(handler(self, self.onTouch)) 事件处理,移除事件 function xxx:onTouc

klyhssrs的博客 557

基于 STM32 的全自动洗车监控系统设计与实现

本文提出一种基于 STM32F103RCT6 芯片的全自动洗车监控系统方案,通过多传感器融合与智能控制算法,实现车辆检测、洗车流程自动化及状态远程监控。系统集成硬件选型、电路设计、软件流程及通信功能,可广泛应用于智能洗车场景。

weixin_42300449的博客 964

第14.10章 高翔博士最新开源框架Lightning-LM源码解读(十):在线定位run_loc_online涉及到的核心模块总结

本文对Lightning-LM激光SLAM定位框架进行了全面剖析。该框架是一个轻量高效的激光雷达建图与定位系统,支持3D SLAM、动态图层管理等功能。文章首先介绍了项目概况和源码结构,包括核心模块如定位系统(loc_system)、激光匹配(lidar_loc)和位姿图优化(pose_graph)等。接着详细解析了各模块的关键函数和运行流程,如数据接收处理、NDT匹配和位姿优化等。最后总结了学习该框架所需的C++知识要点,包括智能指针、多线程编程等现代C++特性。该分析为SLAM开发者提供了实用的架构参考

行知SLAM 801

TRACKBACK

function __G__TRACKBACK__(msg) --引用通知,全局变量  跟踪绑定执行函数发生错误的信息并输出 print("------------------------") print("LUA ERROR: " .. tostring(msg) .. "\n") -- 字符串连接(打印出消息) print(debug.traceback()) End

lianghui0811 9894

【深度学习|多实例学习】多实例学习(Multiple Instance Learning, MIL)的起源、发展和应用,附代码(一)

【深度学习|多实例学习】多实例学习(Multiple Instance Learning, MIL)的起源、发展和应用,附代码(一)

2401_89898861的博客 1923

Cocos2d-x HelloLua 介绍

猴子原创,欢迎转载。转载请注明: 转载自Cocos2D开发网--Cocos2Dev.com,谢谢!原文地址: http://www.cocos2dev.com/?p=393最近网游使用lua做更新比较火,最近也有人问我能否写下lua的文章。刚新建了一个lua工程,看了下代码,就干脆先介绍下HelloLua吧。边看代码边写的注释,应该基本都写了。-- for CCLuaEngine tracebac

Cocos2der Game 6008

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Cocos2d-x-Lua示例项目HelloLua

针对于上面的问题,我总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料。(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_84132393的博客 865

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Cocos2d-x Lua入门:HelloLua示例项目详解与实战指南

游戏开发中,跨平台引擎是构建2D移动游戏的关键技术。Cocos2d-x作为一款成熟的开源引擎,通过Lua绑定提供了灵活的脚本化开发能力,其核心原理在于将C++引擎功能暴露给Lua层,实现逻辑与渲染分离。这种架构为开发者带来了快速迭代和热更新的技术价值,尤其适用于需要频繁调整玩法与界面的移动游戏项目。在应用场景上,从简单的“Hello World”演示到复杂的游戏Demo,理解引擎初始化流程、显示对象树和事件分发机制是基础。本文以Cocos2d-x-Lua的HelloLua示例项目为切入点,深入剖析其项目结构

weixin_33985679的博客 274

Cocos2d-x-Lua示例项目HelloLua,kotlin枚举类

》》main.cpp #include “AppDelegate.h” #include “cocos2d.h” USING_NS_CC; int main(int argc, char *argv[]) { AppDelegate app; return Application::getInstance()->run(); } 以上代码我们可以看到,在main.cpp里,通过#include引入了两个头文件,一个是AppDelegate.h、一个是cocos2d.h。 定义了我们程序的入口方法mai

m0_66264533的博客 2461

Cocos2d-x-Lua演示样例项目HelloLua

Cocos2d-x-Lua演示样例项目HelloLua 本篇博客介绍Cocos2d-x中Lua的实例项目,就是使用Cocos2d-x创建的初始项目执行所呈现的农场,这里笔者取名为HelloLua。本篇博客会具体在代码中解析Cocos2d-x 3.1.1创建的Lua项目中实例,一些API的使用。 注:本演示样例项目在Mac系统下创建 首先我们来创建一个Cocos2d-x Lua项目,在...

diandingyin9417的博客 311

Cocos2d-x 的“HelloLua” 深入分析

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路 优快云博客地址:http://blog.youkuaiyun.com/honghaier]   红孩儿Cocos2d-X学习园地QQ群:249941957 加群写:Cocos2d-x 本章为我的Cocos2d-x教程一书初稿。望各位看官多提建议! 转载请注明来源:红孩儿的游戏编程之路 优快云博客 Cocos2d-x 的“HelloLu

红孩儿的游戏编程之路 2万+

Cocos2d-x-Lua示例项目HelloLua(1)

希望大家能有一个好心态,想进什么样的公司要想清楚,并不一定是大公司,我选的也不是特大厂。当然如果你不知道选或是没有规划,那就选大公司!希望我们能先选好想去的公司再投或内推,而不是有一个公司要我我就去!还有就是不要害怕,也不要有压力,平常心对待就行,但准备要充足。最后希望大家都能拿到一份满意的 offer!如果目前有一份工作也请好好珍惜好好努力,找工作其实挺累挺辛苦的。这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。

2401_84132589的博客 574

深入浅出cocos2d-x(1):Cocos2d-x 中“HelloLua” 深入分析

我们来看一下Cocos2d-x的HelloLua示例工程。首先编译运行一下这个工程,当然,因为我在HelloWorld工程中改动了CCApplication的run函数和initInstance函数,所以这里要修改一下,与HelloWorld保持一致才能编译成功。哇!一个很COOL的农场游戏。                              这几乎是我

peter_teng的专栏 1657

Cocos2d-x之LUA脚本引擎深入分析

FROM:http://www.2cto.com/kf/201303/197171.html原文内容如下:首先,我们要知道LUA是个什么东西,至于官方怎么说可以百度去查,但我想告诉你的是LUA就是一种可以在不必修改C++代码的情况下实现逻辑处理的手 段。稍微讲的再明白一点,就是你用指定语法写一些逻辑处理函数然后保存成文本格式,这个文件称为脚本文件,可以被游戏执行。经过若干年的发展,现在在 LUA中...

weixin_33971977的博客 102
上一篇: 【学习笔记】【Cocos2d-x Lua脚本开发】Lua中创建自定义类
下一篇: 【学习笔记】Cocos2d-x 重力加速计的使用
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值