lua 之 menu
来源:互联网 发布:中国程序员数量不够 编辑:程序博客网 时间:2024/03/29 23:05
local kTagMenu = 1local kTagMenu0 = 0local kTagMenu1 = 1local MID_CALLBACK = 1000local MID_CALLBACK2 = 1001local MID_DISABLED = 1002local MID_ENABLE = 1003local MID_CONFIG = 1004local MID_QUIT = 1005local MID_OPACITY = 1006local MID_ALIGN = 1007local MID_CALLBACK3 = 1008local MID_BACKCALLBACK = 1009------------------------------------------------------------------------ MenuLayerMainMenu----------------------------------------------------------------------local function MenuLayerMainMenu() local m_disabledItem = nil local ret = cc.Layer:create() -- Font Item local spriteNormal = cc.Sprite:create(s_MenuItem, cc.rect(0,23*2,115,23))--创建一个精灵 第一个参数为图片 第二个参数为区域(x,y,width,height) local spriteSelected = cc.Sprite:create(s_MenuItem, cc.rect(0,23*1,115,23)) local spriteDisabled = cc.Sprite:create(s_MenuItem, cc.rect(0,23*0,115,23)) local item1 = cc.MenuItemSprite:create(spriteNormal, spriteSelected, spriteDisabled)--创建精灵菜单项第一个正常时候,第二个点击时,第三个可以不设置 local function menuCallback(sender)--回调函数,得到ret(layer)的父亲LayerMultiplex,每次只允许一个layer运行,切换过去 cclog("menuCallback...") ret:getParent():switchTo(1) end item1:registerScriptTapHandler(menuCallback)--添加触控事件 -- Image Item local function menuCallback2(sender) ret:getParent():switchTo(2) end local item2 = cc.MenuItemImage:create(s_SendScore, s_PressSendScore)--创建图像菜单项 item2:registerScriptTapHandler(menuCallback2) local schedulerEntry = nil local scheduler = cc.Director:getInstance():getScheduler()--得到当前实例的定时器 local function allowTouches(dt) local pDirector = cc.Director:getInstance() --pDirector:getTouchDispatcher():setPriority(cc.MENU_HANDLER_PRIORITY +1, ret) if nil ~= schedulerEntry then scheduler:unscheduleScriptEntry(schedulerEntry) schedulerEntry = nil end cclog("TOUCHES ALLOWED AGAIN") end local function menuCallbackDisabled(sender) -- hijack all touch events for 5 seconds local pDirector = cc.Director:getInstance() --pDirector:getTouchDispatcher():setPriority(cc.MENU_HANDLER_PRIORITY -1, ret) schedulerEntry = scheduler:scheduleScriptFunc(allowTouches, 5, false)--每隔5秒执行 cclog("TOUCHES DISABLED FOR 5 SECONDS") end -- Label Item (LabelAtlas) local labelAtlas = cc.LabelAtlas:_create("0123456789", "fonts/labelatlas.png", 16, 24, string.byte('.'))--从map图中获取标签 4个参数 图中字符,图的地址,宽,高,从哪里开始 local item3 = cc.MenuItemLabel:create(labelAtlas)--创建标签菜单项 从map图中获取的标签 item3:registerScriptTapHandler(menuCallbackDisabled) item3:setDisabledColor( cc.c3b(32,32,64) )--设置不同状态的颜色 item3:setColor( cc.c3b(200,200,255) ) local function menuCallbackEnable(sender) m_disabledItem:setEnabled(not m_disabledItem:isEnabled() )--反转操作 end -- Font Item local item4 = cc.MenuItemFont:create("I toggle enable items")--创建字体菜单 item4:registerScriptTapHandler(menuCallbackEnable)--设置点击事件 item4:setFontSizeObj(20)--设置字体大小 cc.MenuItemFont:setFontName("Marker Felt")--设置字体名字 local function menuCallbackConfig(sender) ret:getParent():switchTo(3) end -- Label Item (cc.LabelBMFont) local label = cc.Label:createWithBMFont("fonts/bitmapFontTest3.fnt", "configuration")--创建图片字体标签 label:setAnchorPoint(cc.p(0.5, 0.5))--设置锚点为中间 local item5 = cc.MenuItemLabel:create(label)--创建标签菜单项 item5:registerScriptTapHandler(menuCallbackConfig) -- Testing issue #500 item5:setScale( 0.8 )--设置大小 -- Events cc.MenuItemFont:setFontName("Marker Felt") local function menuCallbackBugsTest(pSender) ret:getParent():switchTo(4) end -- Bugs Item local item6 = cc.MenuItemFont:create("Bugs")--设置字体菜单 item6:registerScriptTapHandler(menuCallbackBugsTest) local function onQuit(sender) cclog("onQuit item is clicked.") end -- Font Item local item7 = cc.MenuItemFont:create("Quit") item7:registerScriptTapHandler(onQuit) local function menuMovingCallback(pSender) ret:getParent():switchTo(5) end local item8 = cc.MenuItemFont:create("Remove menu item when moving") item8:registerScriptTapHandler(menuMovingCallback) local color_action = cc.TintBy:create(0.5, 0, -255, -255)--设置颜色 上色时间 及颜色 local color_back = color_action:reverse()--类似消除颜色 local seq = cc.Sequence:create(color_action, color_back)--生成动作序列 item7:runAction(cc.RepeatForever:create(seq))--一直重复 local menu = cc.Menu:create()--将各个菜单项添加到菜单menu中 menu:addChild(item1) menu:addChild(item2) menu:addChild(item3) menu:addChild(item4) menu:addChild(item5) menu:addChild(item6) menu:addChild(item7) menu:addChild(item8) menu:alignItemsVertically()--纵向排列 -- elastic effect local s = cc.Director:getInstance():getWinSize()--得到当前窗口的大小 local i = 0 local child = nil local pArray = menu:getChildren()--得到孩子table local len = table.getn(pArray)--table的长度 local pObject = nil for i = 0, len-1 do--遍历设置入场动画 pObject = pArray[i + 1] if pObject == nil then break end child = pObject local dstPointX, dstPointY = child:getPosition() local offset = s.width/2 + 50 if i % 2 == 0 then offset = 0-offset end child:setPosition( cc.p( dstPointX + offset, dstPointY) ) child:runAction( cc.EaseElasticOut:create(cc.MoveBy:create(2, cc.p(dstPointX - offset,0)), 0.35) )--缓冲动画,参数:动作效果,时间 end m_disabledItem = item3 item3:retain() m_disabledItem:setEnabled( false ) ret:addChild(menu) menu:setPosition(cc.p(s.width/2, s.height/2))-- local schedulerEntry = nil local function onNodeEvent(event) if event == "exit" then if (schedulerEntry ~= nil) then scheduler:unscheduleScriptEntry(schedulerEntry) end if m_disabledItem ~= nil then-- m_disabledItem:release() end end end ret:registerScriptHandler(onNodeEvent)--注册当进入场景或者退出场景时要处理的事情 return retend------------------------------------------------------------------------ MenuLayer2----------------------------------------------------------------------local function MenuLayer2() local ret = cc.Layer:create() local m_centeredMenu = nil local m_alignedH = false local function alignMenusH() local i = 0 for i=0, 1 do local menu = ret:getChildByTag(100+i) menu:setPosition( m_centeredMenu ) if i==0 then -- TIP: if no padding, padding = 5 menu:alignItemsHorizontally()--垂直排布 默认是5 local x, y = menu:getPosition() menu:setPosition( cc.pAdd(cc.p(x, y), cc.p(0,30)) ) else -- TIP: but padding is configurable menu:alignItemsHorizontallyWithPadding(40)--设置距离 local x, y = menu:getPosition() menu:setPosition( cc.pSub(cc.p(x, y), cc.p(0,30)) ) end end end local function alignMenusV() local i = 0 for i=0, 1 do local menu = ret:getChildByTag(100+i) menu:setPosition( m_centeredMenu ) if i==0 then -- TIP: if no padding, padding = 5 menu:alignItemsVertically() local x, y = menu:getPosition() menu:setPosition( cc.pAdd(cc.p(x, y), cc.p(100,0)) ) else -- TIP: but padding is configurable menu:alignItemsVerticallyWithPadding(40) local x, y = menu:getPosition() menu:setPosition( cc.pSub(cc.p(x, y), cc.p(100,0)) ) end end end local function menuCallback(sender) ret:getParent():switchTo(0) end local function menuCallbackOpacity(tag, sender) local menu = sender:getParent()--得到当前的父类menu local opacity = menu:getOpacity()--不透明度 if opacity == 128 then menu:setOpacity(255) else menu:setOpacity(128) end end local function menuCallbackAlign(sender) m_alignedH = not m_alignedH if m_alignedH then alignMenusH() else alignMenusV() end end local i = 0 for i=0, 1 do local item1 = cc.MenuItemImage:create(s_PlayNormal, s_PlaySelect) item1:registerScriptTapHandler(menuCallback)--回到最初菜单 local item2 = cc.MenuItemImage:create(s_HighNormal, s_HighSelect) item2:registerScriptTapHandler(menuCallbackOpacity)--设置菜单透明度 local item3 = cc.MenuItemImage:create(s_AboutNormal, s_AboutSelect) item3:registerScriptTapHandler(menuCallbackAlign)--改变布局 item1:setScaleX( 1.5 )--设置x方向的放大缩小 item2:setScaleX( 0.5 ) item3:setScaleX( 0.5 ) local menu = cc.Menu:create() menu:addChild(item1) menu:addChild(item2) menu:addChild(item3) local s = cc.Director:getInstance():getWinSize() menu:setPosition(cc.p(s.width/2, s.height/2)) menu:setTag( kTagMenu ) ret:addChild(menu, 0, 100+i)--子类节点,z方向优先级,tag local x, y = menu:getPosition() m_centeredMenu = cc.p(x, y) end m_alignedH = true alignMenusH() return retend------------------------------------------------------------------------ MenuLayer3----------------------------------------------------------------------local function MenuLayer3() local m_disabledItem = nil local ret = cc.Layer:create() local function menuCallback(sender) ret:getParent():switchTo(0) end local function menuCallback2(sender) cclog("Label clicked. Toogling AtlasSprite") m_disabledItem:setEnabled( not m_disabledItem:isEnabled() ) m_disabledItem:stopAllActions() end local function menuCallback3(sender) cclog("MenuItemSprite clicked") end cc.MenuItemFont:setFontName("Marker Felt") cc.MenuItemFont:setFontSize(28) local label = cc.Label:createWithBMFont("fonts/bitmapFontTest3.fnt", "Enable AtlasItem")--创建BITMAP的label label:setAnchorPoint(cc.p(0.5, 0.5)) local item1 = cc.MenuItemLabel:create(label) item1:registerScriptTapHandler(menuCallback2) local item2 = cc.MenuItemFont:create("--- Go Back ---") item2:registerScriptTapHandler(menuCallback) local spriteNormal = cc.Sprite:create(s_MenuItem, cc.rect(0,23*2,115,23)) local spriteSelected = cc.Sprite:create(s_MenuItem, cc.rect(0,23*1,115,23)) local spriteDisabled = cc.Sprite:create(s_MenuItem, cc.rect(0,23*0,115,23)) local item3 = cc.MenuItemSprite:create(spriteNormal, spriteSelected, spriteDisabled) item3:registerScriptTapHandler(menuCallback3) m_disabledItem = item3 item3:retain() m_disabledItem:setEnabled( false ) local menu = cc.Menu:create() menu:addChild(item1) menu:addChild(item2) menu:addChild(item3) menu:setPosition( cc.p(0,0) ) local s = cc.Director:getInstance():getWinSize() item1:setPosition( cc.p(s.width/2 - 150, s.height/2) ) item2:setPosition( cc.p(s.width/2 - 200, s.height/2) ) item3:setPosition( cc.p(s.width/2, s.height/2 - 100) ) local jump = cc.JumpBy:create(3, cc.p(400,0), 50, 4)--时间,目的坐标,跳的高度,跳的次数 item2:runAction( cc.RepeatForever:create(cc.Sequence:create( jump, jump:reverse())))--重复做 local spin1 = cc.RotateBy:create(3, 360)--旋转,时间,角度 local spin2 = spin1:clone()--复制动作 local spin3 = spin1:clone() item1:runAction( cc.RepeatForever:create(spin1) ) item2:runAction( cc.RepeatForever:create(spin2) ) item3:runAction( cc.RepeatForever:create(spin3) ) ret:addChild( menu ) menu:setPosition(cc.p(0,0)) local function onNodeEvent(event) if event == "exit" then if m_disabledItem ~= nil then --m_disabledItem:release() end end end ret:registerScriptHandler(onNodeEvent) return retend------------------------------------------------------------------------ MenuLayer4----------------------------------------------------------------------local function MenuLayer4() local ret = cc.Layer:create() cc.MenuItemFont:setFontName("American Typewriter") cc.MenuItemFont:setFontSize(18) local title1 = cc.MenuItemFont:create("Sound") title1:setEnabled(false)--设置不能点击 cc.MenuItemFont:setFontName( "Marker Felt" ) cc.MenuItemFont:setFontSize(34) local item1 = cc.MenuItemToggle:create(cc.MenuItemFont:create( "On" ))--toggle设置方法 local function menuCallback(tag, sender) cclog("selected item: tag: %d, index:%d", tag, sender:getSelectedIndex() ) end local function backCallback(tag, sender) ret:getParent():switchTo(0) end item1:registerScriptTapHandler(menuCallback) item1:addSubItem(cc.MenuItemFont:create( "Off"))--增加toggle的内容 cc.MenuItemFont:setFontName( "American Typewriter" ) cc.MenuItemFont:setFontSize(18) local title2 = cc.MenuItemFont:create( "Music" ) title2:setEnabled(false) cc.MenuItemFont:setFontName( "Marker Felt" ) cc.MenuItemFont:setFontSize(34) local item2 = cc.MenuItemToggle:create(cc.MenuItemFont:create( "On" )) item2:registerScriptTapHandler(menuCallback) item2:addSubItem(cc.MenuItemFont:create( "Off")) cc.MenuItemFont:setFontName( "American Typewriter" ) cc.MenuItemFont:setFontSize(18) local title3 = cc.MenuItemFont:create( "Quality" ) title3:setEnabled( false ) cc.MenuItemFont:setFontName( "Marker Felt" ) cc.MenuItemFont:setFontSize(34) local item3 = cc.MenuItemToggle:create(cc.MenuItemFont:create( "High" )) item3:registerScriptTapHandler(menuCallback) item3:addSubItem(cc.MenuItemFont:create( "Low" )) cc.MenuItemFont:setFontName( "American Typewriter" ) cc.MenuItemFont:setFontSize(18) local title4 = cc.MenuItemFont:create( "Orientation" ) title4:setEnabled(false) cc.MenuItemFont:setFontName( "Marker Felt" ) cc.MenuItemFont:setFontSize(34) local item4 = cc.MenuItemToggle:create(cc.MenuItemFont:create( "Off"), cc.MenuItemFont:create( "33%" ), cc.MenuItemFont:create( "66%" ), cc.MenuItemFont:create( "100%")) item4:registerScriptTapHandler(menuCallback) -- you can change the one of the items by doing this item4:setSelectedIndex( 2 ) cc.MenuItemFont:setFontName( "Marker Felt" ) cc.MenuItemFont:setFontSize( 34 ) local label = cc.Label:createWithBMFont("fonts/bitmapFontTest3.fnt", "go back") label:setAnchorPoint(cc.p(0.5, 0.5)) local back = cc.MenuItemLabel:create(label) back:registerScriptTapHandler(backCallback) local menu = cc.Menu:create() menu:addChild(title1) menu:addChild(title2) menu:addChild(item1 ) menu:addChild(item2 ) menu:addChild(title3) menu:addChild(title4) menu:addChild(item3 ) menu:addChild(item4 ) menu:addChild(back ) menu:alignItemsInColumns(2, 2, 2, 2, 1)--按行排列 每行个数 ret:addChild(menu) local s = cc.Director:getInstance():getWinSize() menu:setPosition(cc.p(s.width/2, s.height/2)) return retend-- BugsTestlocal function BugsTest() local ret = cc.Layer:create() local function issue1410MenuCallback(tag, pSender) local menu = pSender:getParent() menu:setEnabled(false) menu:setEnabled(true) cclog("NO CRASHES") end local function issue1410v2MenuCallback(tag, pSender) local menu = pSender:getParent() menu:setEnabled(true) menu:setEnabled(false) cclog("NO CRASHES. AND MENU SHOULD STOP WORKING") end local function backMenuCallback(tag, pSender) ret:getParent():switchTo(0) end local issue1410 = cc.MenuItemFont:create("Issue 1410") issue1410:registerScriptTapHandler(issue1410MenuCallback) local issue1410_2 = cc.MenuItemFont:create("Issue 1410 #2") issue1410_2:registerScriptTapHandler(issue1410v2MenuCallback) local back = cc.MenuItemFont:create("Back") back:registerScriptTapHandler(backMenuCallback) local menu = cc.Menu:create() menu:addChild(issue1410) menu:addChild(issue1410_2) menu:addChild(back) ret:addChild(menu) menu:alignItemsVertically() local s = cc.Director:getInstance():getWinSize() menu:setPosition(cc.p(s.width/2, s.height/2)) return retendlocal function RemoveMenuItemWhenMove() local ret = cc.Layer:create() local s = cc.Director:getInstance():getWinSize() local label = cc.Label:createWithTTF("click item and move, should not crash", s_arialPath, 20) label:setAnchorPoint(cc.p(0.5, 0.5)) label:setPosition(cc.p(s.width/2, s.height - 30)) ret:addChild(label) local item = cc.MenuItemFont:create("item 1") item:retain() local back = cc.MenuItemFont:create("go back") local function goBack(tag, pSender) ret:getParent():switchTo(0) end back:registerScriptTapHandler(goBack) local menu = cc.Menu:create() menu:addChild(item) menu:addChild(back) ret:addChild(menu) menu:alignItemsVertically() menu:setPosition(cc.p(s.width/2, s.height/2)) local function onTouchBegan(touch, event) return true end local function onTouchMoved(touch, event) if item ~= nil then item:removeFromParent(true) --item:release() --item = nil end end local listener = cc.EventListenerTouchOneByOne:create()--添加侦听事件 listener:registerScriptHandler(onTouchBegan,cc.Handler.EVENT_TOUCH_BEGAN )--注册 listener:registerScriptHandler(onTouchMoved,cc.Handler.EVENT_TOUCH_MOVED ) local eventDispatcher = ret:getEventDispatcher() eventDispatcher:addEventListenerWithFixedPriority(listener, -129) local function onNodeEvent(event) if event == "exit" then ret:getEventDispatcher():removeEventListener(listener) end end ret:registerScriptHandler(onNodeEvent) return retendfunction MenuTestMain() cclog("MenuTestMain") local scene = cc.Scene:create() local pLayer1 = MenuLayerMainMenu() local pLayer2 = MenuLayer2() local pLayer3 = MenuLayer3() local pLayer4 = MenuLayer4() local pLayer5 = BugsTest() local pLayer6 = RemoveMenuItemWhenMove() local layer = cc.LayerMultiplex:create(pLayer1, pLayer2, pLayer3, pLayer4, pLayer5, pLayer6 )--创建多个layer的集合 一次只有一个layer活着 scene:addChild(layer, 0) scene:addChild(CreateBackMenuItem()) return sceneend
0 0
- lua 之 menu
- macvim lua-support Load Menu 错误解决
- Swing 之 Menu
- Android之Menu
- Android学习之menu
- Android学习之menu
- android之menu相关
- Android之Menu
- 06.Android之Menu
- android--widget之menu
- andengine编程之menu
- MFC之Menu
- android之Menu
- Android学习之menu
- android之Menu
- Android之menu
- andengine编程之menu
- Android控件之Menu
- java Object使用示例
- 易语言通用函数
- Android 多分辨率机器适配
- SVN服务器配置
- 怎样用canvas画个渐变圆形?
- lua 之 menu
- 易语言mysql
- 利用css中的border生成三角,兼容包括IE6的主流浏览器
- ROS探索总结(十二)——坐标系统
- Java学习笔记_19_String类
- 如何检查URL的合法性?
- Linux串口编程(中断方式和select方式
- Valgrind介绍2
- Windows 7中本地SVN搭建问题详解