【学习笔记】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__)

群晖Video Station海报墙插件更新了!手把手教你用c5h12o5插件搞定豆瓣/TMDB搜刮 本文详细介绍了如何使用c5h12o5插件为群晖Video Station配置高效的海报墙系统。该插件支持豆瓣、TMDB等多数据源并行搜刮,智能优先级设置和本地化优化,解决TMDB API失效问题,提升影视库管理体验。包含安装教程、配置策略和高级使用技巧,适合影视爱好者优化NAS媒体库。 阅读详情

相关推荐

什么是Claude 的 Agent Skills?

摘要: Claude的Agent Skills功能支持通过结构化技能包(含指令、脚本、工具)实现任务自动化,如数据分析、文档生成等。核心能力包括:1)技能包管理(如Python脚本+模板);2)工具调用(API/数据库交互);3)子代理协作(拆分复杂任务)。快速上手步骤:创建技能包(如Excel报表生成)、配置工具权限、触发执行;支持多代理并行处理(如SQL查询+可视化)。关键技巧:工具需明确定义参数、利用子代理共享上下文、注重权限管控。官方文档与社区资源提供进阶指导,使Claude成为可编程的数字助手。

jobleap.cn求职助手首页 1729

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

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

a814949640的博客 719

字节开源 DeerFlow 2.0:从 Deep Research 到 Super Agent Harness 的进化之路

GitHub Trending 冠军项目,字节跳动完全开源的超级智能体框架。支持子代理、沙箱执行、长期记忆、技能扩展,可完成从几分钟到几小时的复杂任务。本文深度解析架构设计、安装实战、技能系统,并附上独家配置指南。

qq_38610923的博客 1712

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

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

孙君的空间站 1234

华为OD机试真题 新系统2026-04-01 C语言 实现【计算数列位置N的值】

1、输入M、N两个数,则按照以下规则形成一个数列; 2、数列的前M个元素的值为1到M; 3、从M+1个元素开始,计算的逻辑为: 如果其前面的M个元素中,存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之如果其前面的M个元素中,不存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之差;

MISAYAONE的博客 591

《手把手教你YOLOv9实战》,改进专栏目录

为了提供友好的操作效果,本专栏将会手把手搭建可视化界面,我将用PyQt5 搭建一个可视化界面,可视化界面能够实现基本的图像加载与检测功能,如支持视频、摄像头,还支持更换不同的 YOLOv9 模型,并适应不同领域(如口罩检测系统、人脸检测系统、工业缺陷检测系统等),界面灵活、功能强大。通过YOLOv9加以改进设计,形成新的算法框架,一起水科研和论文,专栏会一直持续更新中,本专栏适合目标检测、分割、分类。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2157

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

超声波法检测局部放电的原理与实现

摘要:超声波法通过捕捉局部放电产生的声波信号进行检测,系统由超声波传感器、信号调理单元和数据采集系统组成。其核心应用是局放源定位,主要采用时差定位法和声-电联合定位法。该方法具有抗电磁干扰强、定位精确等优点,但也存在信号衰减大、传播路径复杂等缺点,典型应用于变压器、GIS等设备的在线监测与故障诊断。

start_up_go的博客 374

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

蓝桥杯第七届省赛试题--“模拟风扇控制系统”

题目要求 功能简述 “模拟风扇控制系统”能够模拟电风扇工作,通过按键控制风扇的转动速度和定时时间,数码管实时显示风扇的工作模式,动态倒计时显示剩余的定时时间,系统主要由数码管显示、单片机最小系统、按键输入和电机控制保护电路组成,系统框图如图 1 所示: 单总线驱动程序、CT107D 单片机考试平台电路原理图以及本题所涉及到的芯片数据手册,可参考计算机上的电子文档。程序流程图及相关工程文件请以考生...

qq_43280087的博客 2659

cesium实战目录必看

本文作者长期从事GIS相关工作,专注于三维和地图可视化领域,熟悉Cesium、Three.js、WebGL等开发框架。文章目录展示了作者在Cesium应用中的多项技术实践,涵盖水面反射、离屏渲染、后处理效果、地形裁剪、Shader着色器、动态单体化、气象图、缓冲区域、坡度和坡向分析、三维热力图、通视分析、态势标绘等多个方面。这些内容为开发者提供了丰富的技术参考,展示了Cesium在三维可视化中的强大功能和应用场景。

God's asylum的博客 8718

TRACKBACK

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

lianghui0811 9894

基于YOLOv8的视频监控违规停车智能识别系统与应用研究

通过这个毕设,你已经从数据准备、模型训练到界面开发,完整走了一遍深度学习项目的流程。把多个停车场的监控数据整合起来,做一个区域级的停车管理平台;加入车牌识别功能,直接定位到违规车辆的车主;试试把YOLO模型再优化一下,让它在手机端也能运行,实现移动巡检。相信我,按照这个教程一步步做,你的毕设不仅能顺利完成,还能做出亮点,让答辩老师眼前一亮。要是过程中遇到什么问题,随时可以再琢磨琢磨,或者找我聊聊,咱们一起把这个毕设做成精品。

LXY_LOVE36的博客 118

Cocos2d-x HelloLua 介绍

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

Cocos2der Game 6008

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Cocos2d-x-Lua示例项目HelloLua

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

2401_84132393的博客 865

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

weixin_33985679的博客 274

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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、付费专栏及课程。

余额充值