cocos2dx_3.3 lua实现一个单选按钮

实现单选按钮主要是为了切换的时候更加明显的提醒用户,这里主要的做法是用了cocos2d-x lua里面的cc.Menu的api,老实说,这个引擎封装的api更加的丰富,用起来也很巧妙,主要是看怎么用,我这里只是用简单的方法实现出来,我是用Cocos Code IDE去编辑的,只有一个main.lua的文件,请看下面的代码:

tab = {} -- 这里是个table,存储一个cc.MenuItemImage
local item1_1 = 1  --这些是标记
local item1_2 = 2
local item1_3 = 3
local item1_4 = 4
local item1_5 = 5


local TTF = "fonts/Marker Felt.ttf"
require "Cocos2d"
require "Cocos2dConstants"
require "AudioEngine"

-- cclog
cclog = function(...)
    print(string.format(...))
end

-- for ccluaEngine traceback
function __G__TRACKBACK__(msg)
    cclog("----------------------------------------")
    cclog("LUA ERROR: " .. tostring(msg) .. "\n")
    cclog(debug.traceback())
    cclog("----------------------------------------")
    return msg
end

local function main()
    collectgarbage("collect")
    -- avoid memory leak
    collectgarbage("setpause",100)
    collectgarbage("setstepmul",5000)

    -- initialize director
    local director = cc.Director:getInstance()
    local glview = director:getopenGLView()
    if nil == glview then
        glview = cc.GLView:createWithRect("HelloLua",cc.rect(0,960,640))
        director:setopenGLView(glview)
    end

    --turn on display FPS
    director:setdisplayStats(true)

    --set FPS. the default value is 1.0/60 if you don't call this
    director:setAnimationInterval(1.0 / 60)

    cc.FileUtils:getInstance():addSearchPath("src")
    cc.FileUtils:getInstance():addSearchPath("res")

    local visibleSize = cc.Director:getInstance():getVisibleSize()
    local origin = cc.Director:getInstance():getVisibleOrigin()

    local function createLayerFarm()
        local layerFarm = cc.Layer:create()

        -- add in farm background
        local bg = cc.Sprite:create("farm.jpg")
        bg:setPosition(origin.x + visibleSize.width / 2 + 80,origin.y + visibleSize.height / 2)
        layerFarm:addChild(bg)
        
        --设置显示数字的文本  
        local txt = cc.Label:create()  
        txt:setString( "wuxinchagn" )  
        txt:setSystemFontSize( 50 )  
        txt:setSystemFontName( "Arial" ) 
        txt:setPosition(origin.x + visibleSize.width / 2,origin.y + visibleSize.height - txt:getContentSize().height)
        txt:setAnchorPoint(  cc.p( 0.5,0.5 ) )  
        local fade = cc.FadeOut:create(1.0)
        local fade_in = fade:reverse()
        

        local seq = cc.Sequence:create(fade,fade_in)
        local repeatAction = cc.RepeatForever:create(seq)
        txt:runAction(repeatAction)
        layerFarm:addChild(txt,2,1)
        
        
        
        local function menuCallback(tag,sender)
            --第一个参数是number型,第二个才是菜单调用传进来的node
            for k,v in pairs(tab) do
                if v:getTag() == sender:getTag() then
                    v:setEnabled(false)  --先设置不可以点击
                    v:selected()         --然后才设置选中的状态
                    print("menuCallback == " .. sender:getTag())
                    local str = "menuCallback == " .. sender:getTag()
                    txt:setString( str )
                    txt:setColor(cc.c3b(255,0))
                    
                else
                    v:setEnabled(true) 
                    v:unselected()
                    
                end
            end
        end
        
        local item1 = cc.MenuItemImage:create("btn/1.png","btn/1-1.png")  --创建一个图片菜单
        item1:registerScriptTapHandler(menuCallback)  --监听这个函数
        item1:setTag(item1_1) --设置这个item1的tag
        table.insert(tab,item1) --插入到一个表中
        
        local item2 = cc.MenuItemImage:create("btn/2.png","btn/2-2.png")
        item2:registerScriptTapHandler(menuCallback)
        item2:setTag(item1_2)
        table.insert(tab,item2)
        
        local item3 = cc.MenuItemImage:create("btn/3.png","btn/3-3.png")
        item3:registerScriptTapHandler(menuCallback)
        item3:setTag(item1_3)
        table.insert(tab,item3)
        
        local item4 = cc.MenuItemImage:create("btn/4.png","btn/4-4.png")
        item4:registerScriptTapHandler(menuCallback)
        item4:setTag(item1_4)
        table.insert(tab,item4)
        
        local item5 = cc.MenuItemImage:create("btn/5.png","btn/5-5.png")
        item5:registerScriptTapHandler(menuCallback)
        item5:setTag(item1_5)
        table.insert(tab,item5)
        
        
        local menu = cc.Menu:create()
        menu:addChild(item1)
        menu:addChild(item2)
        menu:addChild(item3)
        menu:addChild(item4)
        menu:addChild(item5)
        menu:setAnchorPoint(0,0)
        menu:setPosition(visibleSize.width / 3,visibleSize.height / 2)
        menu:alignItemsvertically()  --设置垂直排列
        menu:setScale(1.5) --设置menu的大小
        layerFarm:addChild(menu)  --添加到层中
        return layerFarm --返回到一个层
    end
    
    cclog("run here")
    local sceneGame = cc.Scene:create() --创建场景
    sceneGame:addChild(createLayerFarm())  --将层添加到场景中
    
    cclog("run here2")

    if cc.Director:getInstance():getRunningScene() then 
        cc.Director:getInstance():replaceScene(sceneGame)
    else
        cc.Director:getInstance():runWithScene(sceneGame)
    end
end 

local status,msg = xpcall(main,__G__TRACKBACK__)
if not status then
    error(msg)
end
运行了上面的代码之后就是下面这个



在用lua写的时候,记住一定要把顺序理清了,不然的话,是不会达到你想要的效果的,或者说有bug,lua它是有顺序需求的,多写一下代码就能发现里面的规律了,谢谢

cocos2dx-3.3 lua实现一个单选按钮的更多相关文章

  1. [翻译]Swift编程语言——造型

    Swift的造型通过is和as操作符实现。类似的,itemisSong检查当前内容是否是一个Song实例。)在每次循环中检查向下造型的做法是合适的:例子一开始是这将当前的item向下造型为Movie。对Any和AnyObject造型Swift提供了两个特殊的类型别称表示没有指定的类型:AnyObject可以表示任意类的实例。这是因为OC语言没有明确类型的数组。可以在switch的case语句中使用is和as操作符,从仅仅已知为Any或者AnyObject类型的常量或者变量中发现特定的类型。

  2. 《swift2.0 官方教程中文版》 第2章-19类型转换

    library的类型是在它被初始化时根据它数组中所包含的内容推断来的。letaa=Songletlibrary:[AnyObject]=[Movie,Song,Movie,Song,Song]//thetypeof"library"isinferredtobe[MediaItem]/*检查类型******************************************************/varmovieCount=0varsongCount=0foriteminlibrary{ifitemi

  3. swift基础学习(06)[必要构造器,可空链式调用,错误处理,类型转换]

    swift提供了在运行对可恢复错误抛出,捕获传送和操作的高级支持表示并抛出错误:在Swift中,错误用遵循ErrorType协议类型的值来表示enumvendingMachineError:ErrorType{caseInvalidSelection//选择无效caseInsufficientFunds//金额不足caseOutOfStock//缺货}错误处理:用throwing函数传递错误用do-catch处理错误4.类型转换classMediaItem{varname:Stringinit{self.

  4. Swift学习:2.18 类型转换

    类型转换在Swift中使用is和as操作符实现。Swift的类型检测器能够演绎出Movie和Song有共同的父类MediaItem,所以它推断出MediaItem[]类作为library的类型。若当前MediaItem是一个Movie类型的实例,itemisMovie返回true,相反返回false。同样的,itemisSong检查item是否为Song类型的实例。事前你不知道每个item的真实类型,所以这里使用可选形式的类型转换(as?Any和AnyObject的类型转换Swift为不确定类型提供了两种

  5. Swift3.0 类型检查

    Swift的类型检测器能够演绎出Movie和Song有共同的父类MediaItem,所以它推断出MediaItem[]类作为library的类型。同样的,itemisSong检查item是否为Song类型的实例。事前你不知道每个item的真实类型,所以这里使用可选形式的类型检查(as?Any和AnyObject的类型检查Swift为不确定类型提供了两种特殊类型别名:AnyObject可以代表任何class类型的实例。在switchcase语句的内容中这种检查总是安全的。

  6. 手把手教你swift项目添加cocos2dx-lua

    去倒杯水吧,这个过程会很久。。。至此,工程已经全部配置完毕,你已经解决一个大Boss了;今天就到这里吧,之后我们再续如何用swift调用lua手把手教你swift项目添加cocos2dx-lua

  7. SpringBoot+Redis+Lua分布式限流的实现

    本文主要介绍了SpringBoot+Redis+Lua分布式限流的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  8. Lua表达式和控制结构学习笔记

    这篇文章主要介绍了Lua表达式和控制结构学习笔记,本文讲解了算术操作符、关系操作符、逻辑操作符、局部变量与作用域、控制结构等内容,需要的朋友可以参考下

  9. Java代码中与Lua相互调用实现详解

    这篇文章主要为大家介绍了Java代码中与Lua相互调用实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. springboot使用redisTemplate操作lua脚本

    本文主要介绍了springboot使用redisTemplate操作lua脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部