--[[ Packaging_KernelEngine.h 文件說明:所有對象在建立時位置是優先的,傳入位置參數必須cc.p(X,Y) CurObj:表示要傳入當前的對象 將3.10 lua api 放到 C:\Users\Administrator\Documents\BabeLua\Completion ***************]] -- Valid Line Number 2901 -- local Obj = require("cocos.Packaging_Kernel") local PackagingClass = class("PackagingClass"); -- 精靈 PackagingClass.m_Sprites = { }; PackagingClass.m_SpritesPosition = { }; PackagingClass.m_SpritesWidthAndHeight = { }; -- 紋理 PackagingClass.m_Texture2D = { }; -- 粒子 PackagingClass.m_ParticleEffects = { }; -- 遮罩 PackagingClass.m_MaskTier = { }; -- 骨骼動畫 PackagingClass.m_SkeletonAnimation = { }; -- 顏色層 PackagingClass.m_LayerColor = { }; -- UIButton PackagingClass.m_Button = { }; PackagingClass.m_ButtonPosition = { }; PackagingClass.m_ButtonWidthAndHeight = { }; -- Music PackagingClass.m_Music = { }; -- Font PackagingClass.m_Font = { }; -- 回調函數無參動作 PackagingClass.m_CallBackFunctionAction = { }; -- 延時動作 PackagingClass.m_DelayAction = { }; -- 連接動作 PackagingClass.m_ConnectAction = { }; -- 創建多個同時執行動作 PackagingClass.m_Spawn = { }; -- 創建一個讓多個同時執行的連接動作重復動作 次數 PackagingClass.m_Repeat = { }; -- 無限動作 PackagingClass.m_InfiniteAction = { }; -- 創建一個動作移動到另一個地方再返回 PackagingClass.m_MoveToLineage = { }; -- 創建一個動作移動到另一個地方是否返回 PackagingClass.m_MoveToInfernal = { }; -- 創建一個閃爍動作 PackagingClass.m_BlinkAction = { }; -- 創建一個幾秒鍾內消失的動作 PackagingClass.m_SecondVanish = { }; -- 創建一個幾秒鍾內出現的動作 PackagingClass.m_SecondAppear = { }; -- 創建一個跳的動作(To) PackagingClass.m_JumpTo = { }; -- 創建一個跳的動作(By) PackagingClass.m_JumpBy = { }; -- 創建一個旋轉動作(To) PackagingClass.m_RotateTo = { }; -- 創建一個旋轉動作(By) PackagingClass.m_RotateBy = { }; -- 創建一個貝塞爾曲線動作(To)(By用的是相對坐標) PackagingClass.m_BezierAction = { }; -- =====================================3D動作 -- 創建一個3D旋轉動作 PackagingClass.m_OrbitCamera = { }; -- 創建一個3D翻頁動作 PackagingClass.m_PageTurn3D = { }; -- 創建一個3D扭曲動作 PackagingClass.m_Twirl = { }; -- =========================================功能性 -- 創建一個ScrollView 容器 PackagingClass.m_Scrollview = { }; PackagingClass.m_Position = { }; -- 構造函數 function PackagingClass:ctor() print("=======================packaing Call") end -- ======================================================精靈 -- 創建精靈 function PackagingClass:CreateSprite(FilePathName) self.m_Sprites = cc.Sprite:create(FilePathName); self.m_Sprites:setPosition(cc.p(0, 0)); return self.m_Sprites; end -- 設置精靈坐標 function PackagingClass:SetSpritePosition(Position) self.m_Sprites:setPosition(Position); end -- 返回精靈當前的坐標 function PackagingClass:GetSpritePosition() self.m_SpritesPosition.X, self.m_SpritesPosition.Y = self.m_Sprites:getPosition(); return self.m_SpritesPosition; end -- 返回精靈當前的寬高 function PackagingClass:GetSpriteWidthAndHeight() self.m_SpritesWidthAndHeight.Width = self.m_Sprites:getContentSize().width; self.m_SpritesWidthAndHeight.Height = self.m_Sprites:getContentSize().height; return self.m_SpritesWidthAndHeight; end -- 創建一張紋理 function PackagingClass:CreateTexture2D(FilePathName) local Texture = cc.TextureCache:getInstance():addImage(FilePathName); self.m_Texture2D = Texture; return Texture; end -- 用紋理創建一個精靈 function PackagingClass:CreateTextureSprite(Texture) local Sprite = cc.Sprite:createWithTexture(Texture); self.m_Sprites = Sprite; return Sprite; end -- 設置精靈的比例 -- 比例按百分比,在設置中源比例是1.0,及100%100源圖片,填入=》精靈,cc.p(X的比例,Y的比例) -- 值得注意的是設置節點的比例,相對於XY軸也會改變,最好就設置精靈的比例就可以了 function PackagingClass:SetSpriteScale(Sprites, Scale) Sprites:setScaleX(Scale.x); Sprites:setScaleY(Scale.y); end -- 創建一個顏色層 function PackagingClass:CreateLayerColor() local LayerColor = cc.LayerColor:create(cc.c3b(0, 0, 0)) LayerColor:setOpacity(200) LayerColor:setName("UnityBackgroundColorLayer") self.m_LayerColor = LayerColor; return LayerColor; end -- ======================================================粒子 --[[//CCParticleExplosion //爆炸粒子特效 -- // CCParticleFire //火焰粒子特效 -- // CCParticleFlower //花束粒子特效 -- // CCParticleFireworks //煙花粒子特效 -- // CCParticleGalaxy //星系粒子特效 -- // CCParticleMeteor //流星粒子特效 -- // CCParticleRain //下雨粒子特效 -- // CCParticleSmoke //煙霧粒子特效 -- // CCParticleSnow //下雪粒子特效 -- // CCParticleSpiral //漩渦粒子特效 --// CCParticleSun //太陽粒子特效]] -- 煙花粒子=》文件路徑,粒子數量,角度 function PackagingClass:Create_Base_ParticleEffects_Fireworks(FilePathName, Position, ParticleNumber, StartSize, EndSize, StartColor, EndColor, Speed, LifeCycle) self.m_ParticleEffects = cc.ParticleFireworks:createWithTotalParticles(ParticleNumber); self.m_ParticleEffects:retain(); self.m_ParticleEffects:setAngleVar(180); self.m_ParticleEffects:setGravity(cc.p(0, 0)); -- self.m_ParticleEffects:setSpeedVar(20); self.m_ParticleEffects:setSpeed(Speed); -- 生存周期-1為永久 self.m_ParticleEffects:setDuration(LifeCycle); self.m_ParticleEffects:setStartSize(StartSize); self.m_ParticleEffects:setEndSize(EndSize); self.m_ParticleEffects:setStartColor(StartColor); self.m_ParticleEffects:setEndColor(EndColor); self.m_ParticleEffects:setTexture(cc.TextureCache:sharedTextureCache():addImage(FilePathName)); self.m_ParticleEffects:setPosition(Position); return self.m_ParticleEffects; end -- 煙花粒子=》文件路徑,粒子數量,開始顏色,結束顏色,速度,生存周期,重力, function PackagingClass:Create_Base_ParticleEffects_Fireworks2(FilePathName, Position, ParticleNumber, StartSize, EndSize, StartColor, EndColor, Speed, LifeCycle, Gravity_CCP) self.m_ParticleEffects = cc.ParticleFireworks:createWithTotalParticles(ParticleNumber); self.m_ParticleEffects:retain(); self.m_ParticleEffects:setAngleVar(180); self.m_ParticleEffects:setGravity(Gravity_CCP); -- self.m_ParticleEffects:setSpeedVar(20); self.m_ParticleEffects:setSpeed(Speed); -- 生存周期-1為永久 self.m_ParticleEffects:setDuration(LifeCycle); self.m_ParticleEffects:setStartSize(StartSize); self.m_ParticleEffects:setEndSize(EndSize); self.m_ParticleEffects:setStartColor(StartColor); self.m_ParticleEffects:setEndColor(EndColor); self.m_ParticleEffects:setTexture(cc.TextureCache:sharedTextureCache():addImage(FilePathName)); self.m_ParticleEffects:setPosition(Position); return self.m_ParticleEffects; end -- 點擊效果煙花粒子=》文件路徑,位置,粒子數量 function PackagingClass:Create_Ok_ParticleEffects_Fireworks(ImageName, Position, ParticleNumber) self.m_ParticleEffects = self:Create_Base_ParticleEffects_Fireworks(ImageName, Position, ParticleNumber, 20.0, 1.0, cc.c4b(0, 0, 255, 255), cc.c4b(255, 0, 255, 255), 50, 0.5); return self.m_ParticleEffects; end -- 爆炸粒子特效===>文件路徑名,位置,粒子數量,角度,重力,速度,開始的大小,結束的大小,粒子生存時間,開始的顏色,結束的顏色 -- 參數參考===》Obj:Create_ParticleExplosion_Effects("ParticleSystem\\guangdian.png",cc.p(appdf.WIDTH / 2 + 9.86, appdf.HEIGHT / 2 + 20.35),100,180,cc.p(0,-100),90,20.0,10.0, 1.0,cc.c4b(255, 255, 0, 255),cc.c4b(255, 255, 255, 255)) function PackagingClass:Create_ParticleExplosion_Effects(FilePathName, Position, Number, Angle, Gravity_CCP, Speed, StartSize, EndSize, Time, StartColor, EndColor) self.m_ParticleEffects = cc.ParticleExplosion:createWithTotalParticles(Number); self.m_ParticleEffects:retain(); self.m_ParticleEffects:setAngleVar(Angle); self.m_ParticleEffects:setGravity(Gravity_CCP); self.m_ParticleEffects:setSpeed(Speed); -- 生存周期-1為永久 self.m_ParticleEffects:setDuration(Time); self.m_ParticleEffects:setStartSize(StartSize); self.m_ParticleEffects:setEndSize(EndSize); self.m_ParticleEffects:setStartColor(StartColor); self.m_ParticleEffects:setEndColor(EndColor); self.m_ParticleEffects:setTexture(cc.TextureCache:sharedTextureCache():addImage(FilePathName)); self.m_ParticleEffects:setPosition(Position); return self.m_ParticleEffects; end -- 加載plist粒子文件 function PackagingClass:LoadPlistPariticle(FilePathName) return cc.ParticleSystemQuad:create(FilePathName); end -- ======================================================遮罩 -- 在模板中設置坐標有問題時,可把模板精靈的坐標先設置,遮罩層的坐標就不用設置了 -- 創建遮罩層=》模板路徑,特效路徑,模板坐標,特效坐標 function PackagingClass:CreateMaskTier(Template_FilePathName, EffectsFilepathName, Template_Position, Effects_Position) local Template = cc.Sprite:create(Template_FilePathName); local Effects = cc.Sprite:create(EffectsFilepathName); Template:setPosition(Template_Position); Effects:setPosition(Effects_Position); local MaskTier = cc.ClippingNode:create(); MaskTier:setAlphaThreshold(0.5); MaskTier:setInverted(false); MaskTier:addChild(Effects); MaskTier:setStencil(Template); self.m_MaskTier = MaskTier; return MaskTier; end -- 創建遮罩層=》模板路徑,特效精靈,模板坐標,特效坐標 function PackagingClass:CreateMaskTier2(Template_FilePathName, EffectsSprite, Template_Position, Effects_Position) local Template = cc.Sprite:create(Template_FilePathName); Template:setPosition(Template_Position); EffectsSprite:setPosition(Effects_Position); local MaskTier = cc.ClippingNode:create(); MaskTier:setAlphaThreshold(0.5); MaskTier:setInverted(false); MaskTier:addChild(EffectsSprite); MaskTier:setStencil(Template); self.m_MaskTier = MaskTier; return MaskTier; end -- 創建遮罩層=》模板精靈,特效精靈,模板坐標,特效坐標=====》支持 function PackagingClass:CreateMaskTier3(Template_Sprite, EffectsSprite, Template_Position, Effects_Position) Template_Sprite:setPosition(Template_Position); EffectsSprite:setPosition(Effects_Position); local MaskTier = cc.ClippingNode:create(); MaskTier:setAlphaThreshold(0.5); MaskTier:setInverted(false); MaskTier:addChild(EffectsSprite); MaskTier:setStencil(Template_Sprite); self.m_MaskTier = MaskTier; return MaskTier; end -- 創建遮罩層=》模板精靈,特效路徑,模板坐標,特效坐標=====>返回模板節點,和模板精靈(進度條專用) -- 特效精靈路徑=>可以用進度條中的內容,用於顯示真的內容 function PackagingClass:CreateMaskTier4(Template_Sprite, EffectsFilepathSprite, Template_Position, Effects_Position) local EffectsSprite = Obj:CreateSprite(EffectsFilepathSprite); Template_Sprite:setPosition(Template_Position); EffectsSprite:setPosition(Effects_Position); local MaskTier = cc.ClippingNode:create(); MaskTier:setAlphaThreshold(0.5); MaskTier:setInverted(false); MaskTier:addChild(EffectsSprite); MaskTier:setStencil(Template_Sprite); self.m_MaskTier = MaskTier; return MaskTier; end -- ======================================================骨骼動畫加載 -- 創建骨骼動畫=>.json+.stlas一個文件夾下,位置,速度json動畫索引 -- Ctrl + H 把json中的skinnedmesh替換為mesh function PackagingClass:CreateSkeletonAnimation(FilePathName_Json, FilePathName_Atlas, Position, TimeSpeed, BOOL, JsonIndex) -- 在json中,如果失敗改一個類型 local SkeletonAnimation = sp.SkeletonAnimation:create(FilePathName_Json, FilePathName_Atlas); SkeletonAnimation:setPosition(Position); SkeletonAnimation:setTimeScale(TimeSpeed); -- json中的默認動畫 SkeletonAnimation:setAnimation(0, JsonIndex, BOOL); self.m_SkeletonAnimation = SkeletonAnimation; return SkeletonAnimation; end -- 創建骨骼"OR"動畫=>.csb+.png一個文件夾下,當前對象,大小比例,速度 function PackagingClass:CreateSkeletonAnimation2(FilePathName, Position, CurObj, SizeScale, TimeSpeed, BOOL) if (CurObj == nil) then return false; end local this = CurObj; local CsbNode = cc.CSLoader:createNode(FilePathName); CsbNode:setPosition(Position) CsbNode:setScale(SizeScale) local Start_Action = cc.CSLoader:createTimeline(FilePathName); Start_Action:setTimeSpeed(TimeSpeed); CsbNode:runAction(Start_Action); Start_Action:gotoFrameAndPlay(0, BOOL); this:addChild(CsbNode); return CsbNode; end -- 創建骨骼"OR"動畫=>.csb+.png一個文件夾下,當前對象,大小比例,速度 function PackagingClass:CreateSkeletonAnimation3(FilePathName, Position, SizeScale, TimeSpeed, BOOL) local CsbNode = cc.CSLoader:createNode(FilePathName); CsbNode:setPosition(Position) CsbNode:setScale(SizeScale) local Start_Action = cc.CSLoader:createTimeline(FilePathName); Start_Action:setTimeSpeed(TimeSpeed); CsbNode:runAction(Start_Action); Start_Action:gotoFrameAndPlay(0, BOOL); -- 直接返回節點 return CsbNode; end -- 獲取節點的子對象,也可能是子節點 -- 不能獲取節點中的寬高,坐標也不可能是絕對坐標,而絕對坐標是加載csb所設置的坐標,所有子節點的坐標都是基於加載csb所設置的坐標 function PackagingClass:GetChildObj(NodeRootObj, ObjName) -- 如果返回的是節點二不是對象,則繼續getChildByName("") local NodeObj = NodeRootObj:getChildByName(ObjName); if (NodeObj == nil) then -- 當前節點下沒有此對象 return false; else return NodeObj, true; end -- 相反則是removeChildByName(""); end -- ======================================================幀動畫動畫加載 --[[文件加載路徑:卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍 加載csb時,是把res文件下作為主搜索路徑,在加載csb文件時,csb項目文件是和res主搜索路徑相對的 --如果csb在項目中在一個文件夾下,那res中就必須有這個文件夾,否則斷言 --如果csb在項目中沒在一個文件夾下,那必須放這res中,如果放在其他文件夾下了,則加載時寫下全路徑, --如果隔了兩個父文件及以上,需要添加搜索路徑,否則失敗 --最好把發布的資源直接扔在res下,以發布出來的文件為主 --在加載csb中的子對象時,不用再self:addChild()==>因為在加載csb整個文件是已經做了 --卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍]] -- 幀動畫 .plist+.png一個文件夾下,位置,當前對象,總共圖片,plist中圖片key -- local Animation = Obj:CreateFrameAnimation("AnimationTest/EffectPlist.plist", cc.p(display.center), self, 總共多少張, "Effect/0/%d.png") function PackagingClass:CreateFrameAnimation(FilePathName, Position, CurObj, EndFrame, XmlImageName) if (CurObj == nil) then return false; end local cache = cc.SpriteFrameCache:getInstance(); cache:addSpriteFrames(FilePathName); local Test = cc.Sprite:create(); -- WithSpriteFrameName("image/boss_spider-angry_0.png") Test:setPosition(Position); local animation = cc.Animation:create(); for i = 0, EndFrame do local bing = cache:getSpriteFrame(string.format(XmlImageName, i)); animation:addSpriteFrame(bing); end -- 設置單位延遲 animation:setDelayPerUnit(0.1); animation:setRestoreOriginalFrame(true); local action = cc.Animate:create(animation); Test:runAction(cc.RepeatForever:create(action)); CurObj:addChild(Test); end -- 幀動畫 .plist+.png一個文件夾下,.png,位置,當前對象,開始圖片_0,結束圖片_N,總共圖片.plist中圖片key function PackagingClass:CreateFrameAnimation2(FilePathName, Position, CurObj, StartFrame, EndFrame, XmlImageName) if (CurObj == nil) then return false; end local pshowFrame = cc.Sprite:createWithSpriteFrameName(FilePathName); pshowFrame:setPosition(Position); local animation = cc.Animation:create(); for i = StartFrame, EndFrame do local szName = string.format(XmlImageName, i); local pSpriteFrame = cc.SpriteFrameCache:getInstance():getSpriteFrame(szName); animation:addSpriteFrame(pSpriteFrame); end animation:setDelayPerUnit(0.1); animation:setRestoreOriginalFrame(true); local action = cc.Animate:create(animation); pshowFrame:runAction(cc.RepeatForever:create(action)); -- CurObj:addChild(pshowFrame); return pshowFrame; end -- ======================================================UI按鈕 --按鈕解決方案 -- addTouchEventListener( function(sender, tType)end)--觸摸回調 --[[ ccui.TouchEventType = { began = 0, moved = 1, ended = 2, canceled = 3, } ]] -- sender:getTouchMovePosition() --獲取觸摸移動位置 -- touch:getTouchBeganPosition() --獲取觸摸開始位置 -- ... -- 創建一個普通按鈕=>抬起,按下,禁用,位置,當前對象,回調函數 function PackagingClass:CreateUIButton(UpFileImageName, DownFileImageName, ProhibitFileImageName, Position, CurObj, CallBack) if (CurObj == nil) then return false; end local Button = ccui.Button:create(); Button:loadTextureNormal(UpFileImageName); Button:loadTexturePressed(DownFileImageName); Button:loadTextureDisabled(ProhibitFileImageName); Button:setPressedActionEnabled(false); -- Button:setOpacity(100);--透明度,0為完全透明 Button:setPosition(Position); if (CallBack == nil) then -- 沒有傳回調函數默認加一個 Button:addClickEventListener( function() end); else Button:addClickEventListener(CallBack); end self.m_Button = Button; CurObj:addChild(Button); return Button; end -- 創建一個可調比例按鈕=>抬起,按下,禁用,位置,設置UI大小,當前對象,回調函數 function PackagingClass:CreateUIButton2(UpFileImageName, DownFileImageName, ProhibitFileImageName, Position, ContenSize, CurObj, CallBack) if (CurObj == nil) then return false; end local Button = ccui.Button:create(); Button:loadTextureNormal(UpFileImageName); Button:loadTexturePressed(DownFileImageName); Button:loadTextureDisabled(ProhibitFileImageName); Button:setPressedActionEnabled(false); Button:setScale9Enabled(true); ------- -- Button:setOpacity(100);--透明度,0為完全透明 if (ContenSize.x) and(ContenSize.y) then Button:setContentSize(ContenSize.x, ContenSize.y); else Button:setContentSize(ContenSize.width, ContenSize.height); end ------ Button:setPosition(Position); if (CallBack == nil) then -- 沒有傳回調函數默認加一個 Button:addClickEventListener( function() end); else Button:addClickEventListener(CallBack); end self.m_Button = Button; CurObj:addChild(Button); return Button; end -- 返回當前UI的位置 function PackagingClass:GetCurUIPosition() self.m_ButtonPosition.X = self.m_Button:getPositionX(); self.m_ButtonPosition.Y = self.m_Button:getPositionY(); return self.m_ButtonPosition; end -- 返回當前UI的寬高 function PackagingClass:GetUIWidthAndHeight() self.m_ButtonWidthAndHeight.Width = self.m_Button:getContentSize().width; self.m_ButtonWidthAndHeight.Height = self.m_Button:getContentSize().height; return self.m_ButtonWidthAndHeight; end -- ======================================================動作 -- 一個動作只能給一個對象用,當第二個對象用是這個動作可以當層已經是個NULL了 -- To By 區別,By多一個成員函數reverse, 這個支持方向動作reverse(顛倒) ,及(cc.p(200,200)) ==>(cc.p(-200,-200)) -- To 不支持一直無限執行 -- 創建回調函數(無參)=》動作 function PackagingClass:CreateCallBackFunction(Function) local CallBackFunction = cc.CallFunc:create(Function); self.m_CallBackFunctionAction = CallBackFunction; return CallBackFunction; end -- 創建延時動作 function PackagingClass:CreateDelayAction(Time) local DelayActionTime = cc.DelayTime:create(Time); self.m_DelayAction = DelayActionTime; return DelayActionTime; end -- 創建連接動作(一個一個執行) function PackagingClass:CreateConnectAction(...) local Sequence = cc.Sequence:create(...); self.m_ConnectAction = Sequence; return Sequence; end -- 創建多個動作同時執行的連接動作 -- 同時執行的動作只能由固定次數的動作執行 function PackagingClass:CreateMultiMeanwhileAction(...) local Spawn = cc.Spawn:create(...); self.m_Spawn = Spawn; return Spawn; end -- 創建一個讓多個同時執行的連接動作重復動作 次數 function PackagingClass:CreateMultiMeanwhileAction(Action, ActionNumber) local Repeat = cc.Repeat:create(Action, ActionNumber); self.m_Repeat = Repeat; return Repeat; end -- 創建無限動作 function PackagingClass:CreateInfiniteAction(Action) local InfiniteAction = cc.RepeatForever:create(Action); self.m_InfiniteAction = InfiniteAction; return InfiniteAction; end -- 創建動作移動到另一個地方並返回 function PackagingClass:CreateMoveToLineageAction(Position_Start, Position_End, StarTime, EndTime) local MoveAction_Start = cc.MoveTo:create(StarTime, Position_Start); local MoveAction_End = cc.MoveTo:create(EndTime, Position_End); local MoveToLineage = self:CreateConnectAction(MoveAction_Start, MoveAction_End); self.m_MoveToLineage = MoveToLineage; return MoveToLineage; end -- 創建動作移動到另一個地方是否返回 function PackagingClass:CreateMoveToInfernalAction(Position_Start, BOOL, Position_End, StarTime, EndTime) if (BOOL == true) then local MoveAction_Start = cc.MoveTo:create(StarTime, Position_Start); local MoveAction_End = cc.MoveTo:create(EndTime, Position_End); local MoveToLineage = self:CreateConnectAction(MoveAction_Start, MoveAction_End); self.m_MoveToLineage = MoveToLineage; return MoveToLineage; else local MoveAction_Infernal = cc.MoveTo:create(StarTime, Position_Start); self.m_MoveToInfernal = MoveAction_Infernal; return MoveAction_Infernal; end end -- 創建動作移動到另一個地方 function PackagingClass:CreateMoveToWorld(Position_End, EndTime) local MoveAction_Infernal = cc.MoveTo:create(EndTime, Position_End); self.m_MoveToInfernal = MoveAction_Infernal; return MoveAction_Infernal; end -- 創建一個閃爍動作=》多少秒,多少次 執行完了恢復正常 function PackagingClass:CreateBlinkAction(Time, TimeNumber) local BlinkAction = cc.Blink:create(Time, TimeNumber); self.m_BlinkAction = BlinkAction; return BlinkAction; end -- 創建一個幾秒鍾內消失的動作 function PackagingClass:CreateSecondVanishAction(Time) local SecondVanish = cc.FadeOut:create(Time); self.m_SecondVanish = SecondVanish; return SecondVanish; end -- 創建一個幾秒鍾內出現的動作 function PackagingClass:CreateSecondAppearAction(Time) local SecondAppear = cc.FadeIn:create(Time); self.m_SecondAppear = SecondAppear; return SecondAppear; end -- 創建一個跳的動作(To) function PackagingClass:CreateJumpToAction(Time, Position, Height, Number) local JumpTo = cc.JumpTo:create(Time, Position, Height, Number); self.m_JumpTo = JumpTo; return JumpTo; end -- 創建一個跳的動作(By) function PackagingClass:CreateJumpByAction(Time, Position, Height, Number) local JumpBy = cc.JumpBy:create(Time, Position, Height, Number); self.m_JumpBy = JumpBy; return JumpBy; end -- 創建一個旋轉的動作(To) function PackagingClass:CreateRotateToAction(Time, Angle) local RotateTo = cc.RotateTo:create(Time, Angle); self.m_RotateTo = RotateTo; return RotateTo; end -- 創建一個旋轉的動作(By) function PackagingClass:CreateRotateByAction(Time, Angle) local RotateBy = cc.RotateBy:create(Time, Angle); self.m_RotateBy = RotateBy; return RotateBy; end -- 創建一個貝塞爾曲線動作(To)(By用的是相對坐標) function PackagingClass:CreateBezierToAction(Time, BezierConfig) local BezierAction = cc.BezierTo:create(Time, BezierConfig); self.m_BezierAction = BezierAction; return BezierAction; end -- 創建一個貝塞爾曲線動作(To)(By用的是相對坐標)==>時間,開始的點,彎曲的頂點(控制的點),結束的點 function PackagingClass:CreateBezierToAction2(Time, StartPoint, CurveVertex, EndPoint) local BezierConfig = { StartPoint, CurveVertex, EndPoint }; local BezierAction = cc.BezierTo:create(Time, BezierConfig); self.m_BezierAction = BezierAction; return BezierAction; end -- ======================================================3D動作 -- 3D動作說明:由於沒有設置波動要持續多久,則返回的有些是無限的3D動作 -- 深度緩沖區只能開啟一次,當前函數可以直接掉,不用開啟OpenGL的深度緩沖區 -- 除了 Create3DRotateAction()函數可以混合使用外,其他用NodeGrid運行的不能混合使用,如果把NodeGrid運行動作 -- 代碼放到非NodeGrid運行的回調里會卡頓和其他的未知問題 -- 創建3D動作環境=>精靈條件(精靈必須沒有在任何一個節點上,比如csb的精靈就不行) function PackagingClass:Create3DAction(CurObj, Sprites) local NodeGrid = cc.NodeGrid:create(); NodeGrid:addChild(Sprites); CurObj:addChild(NodeGrid); return NodeGrid; end -- 創建3D動作環境=>精靈條件(精靈必須沒有在任何一個節點上,比如csb的精靈就不行) function PackagingClass:Create3DAction2(Sprites) local NodeGrid = cc.NodeGrid:create(); NodeGrid:addChild(Sprites); return NodeGrid; end -- 創建一個3D旋轉動作==》旋轉時間,起始半徑(1),半徑差(0),起始Z角(0),旋轉Z角差(360),起始X角(0),旋轉X角差(0) -- 此函數的返回值 精靈可以直接運行的動作(runAction()) function PackagingClass:Create3DRotateAction(Time, Start_R, R_SUB, Start_Z, Rotate_Z_SUB, Start_X, Rotate_X) local OrbitCamera = cc.OrbitCamera:create(Time, Start_R, R_SUB, Start_Z, Rotate_Z_SUB, Start_X, Rotate_X); self.m_OrbitCamera = OrbitCamera; return OrbitCamera; end -- 創建一個無限波浪動作==》時間,晃動網格大小,波動速度,振幅率,是否水平波動,是否垂直波動 -- 參數參考實例====Obj:Create3DWavesAction(5,cc.size(10,10),10,20,true,true) function PackagingClass:Create3DWavesAction(Time, ReseauSize, FluctuateSpeed, Amplitude, IsLevelFluctuate, IsVerticalFluctuate) local Waves = cc.Waves:create(Time, ReseauSize, FluctuateSpeed, Amplitude, IsLevelFluctuate, IsVerticalFluctuate); Waves = self:CreateInfiniteAction(Waves); return Waves; end -- 創建一個波浪動作==》時間,晃動網格大小,波動速度,振幅率,是否水平波動,是否垂直波動 -- 參數參考實例====Obj:Create3DWavesAction(5,cc.size(10,10),10,20,true,true) function PackagingClass:Create3DWavesAction2(Time, ReseauSize, FluctuateSpeed, Amplitude, IsLevelFluctuate, IsVerticalFluctuate) local Waves = cc.Waves:create(Time, ReseauSize, FluctuateSpeed, Amplitude, IsLevelFluctuate, IsVerticalFluctuate); return Waves; end -- 創建一個3D水波紋動作==》時間,網格大小,坐標,半徑,速度,振幅率 -- 參數參考實例=====Obj:Create3DRipple3DAction(5,cc.size(100,100),cc.p(600,300),240,10,6) function PackagingClass:Create3DRipple3DAction(Time, ReseauSize, Position, R, Speed, Amplitude) local Ripple3D = cc.Ripple3D:create(Time, ReseauSize, Position, R, Speed, Amplitude); Ripple3D = self:CreateInfiniteAction(Ripple3D); return Ripple3D; end -- 創建一個液體動作==》時間,網格大小,速度,振幅率 function PackagingClass:Create3DLiquidAction(Time, ReseauSize, Speed, Amplitude) local Liquid = cc.Liquid:create(Time, ReseauSize, Speed, Amplitude); Liquid = self:CreateInfiniteAction(Liquid); return Liquid; end -- 創建一個瓷磚洗牌特效的動作==》時間,網格大小,隨機數(隨便填) function PackagingClass:Create3DShuffleTilesAction(Time, ReseauSize, Srand) local ShuffleTiles = cc.ShuffleTiles:create(Time, ReseauSize, Srand); return ShuffleTiles; end -- 創建一個分多少列消失的動作==》時間,多少列 function PackagingClass:Create3DSplitColsAction(Time, Line) local SplitCols = cc.SplitCols:create(Time, Line); return SplitCols; end -- 創建一個3D翻頁動作 function PackagingClass:Create3DPageTurnAction(Time, Size) local PageTurn = cc.PageTurn3D:create(Time, Size); self.m_PageTurn3D = PageTurn; return PageTurn; end -- 創建一個扭曲動作 function PackagingClass:Create3DTwirlAction(Time, Size, Position, Twirls, Amplitude) local Twirl = cc.Twirl:create(Time, Size, Position, Twirls, Amplitude); self.m_Twirl = Twirl; return Twirl; end -- ======================================================單點觸控 -- CurObj 任何的對象 (也可自定義監聽對象) -- 重寫函數約定 OnTouchBegin(touch, event) ** OnTouchMove(touch, event) ** OnTouchEnd(touch, event) function PackagingClass:CreateTouchEvent(CurObj) if (CurObj == nil) then return false; end local listener = cc.EventListenerTouchOneByOne:create(); if (listener == nil) then return false; end -- 給觸摸監聽函數設置吞沒事件,使觸摸上面的層的時候事件不會向下傳遞 listener:setSwallowTouches(true) -- OnTouchBegin(touch, event) ** OnTouchMove(touch, event) ** OnTouchEnd(touch, event) local function OnTouchBegin(touch, event) if (CurObj.OnTouchBegin == nil) then return false; end CurObj:OnTouchBegin(touch, event); return true; end local function OnTouchMove(touch, event) if (CurObj.OnTouchMove == nil) then return false; end CurObj:OnTouchMove(touch, event); end local function OnTouchEnd(touch, event) if (CurObj.OnTouchEnd == nil) then return false; end CurObj:OnTouchEnd(touch, event); end listener:registerScriptHandler(OnTouchBegin, cc.Handler.EVENT_TOUCH_BEGAN); listener:registerScriptHandler(OnTouchMove, cc.Handler.EVENT_TOUCH_MOVED); listener:registerScriptHandler(OnTouchEnd, cc.Handler.EVENT_TOUCH_ENDED); local eventDispatcher = cc.Director:getInstance():getEventDispatcher(); eventDispatcher:addEventListenerWithSceneGraphPriority(listener, CurObj); -- 移除 -- if event == "exit" and nil ~= node.onExit then -- if nil ~= node._listener then -- local eventDispatcher = node:getEventDispatcher() -- eventDispatcher:removeEventListener(node._listener) -- end --[[touch成員函數 getLocation();返回坐標結構體,與實際世界坐標的Y非相反的 getCursorX();//返回屏幕坐標X getCursorY();//返回屏幕坐標Y ]] return true; end -- ======================================================Music -- ccexp.AudioEngine -- cc.SimpleAudioEngine function PackagingClass:CreateMusic() local Music = cc.FileUtils:getInstance(); self.m_Music = Music; end function PackagingClass:PlayMusic(MusicFileName) AudioEngine.playMusic(self.m_Music:fullPathForFilename(MusicFileName), true); end function PackagingClass:PauseMusic(MusicFileName) AudioEngine.pauseMusic(self.m_Music:fullPathForFilename(MusicFileName), true); end -- 程序退出時 function PackagingClass:DestroyMusic() AudioEngine.destroyInstance(); end -- ======================================================鼠標 -- 鼠標移動調用約定 OnMouseDown(event) ** OnMouseUp(event) ** OnMouseMove(event) ** OnMouseScroll(event) function PackagingClass:CreateMouseEvent(CurObj) if (CurObj == nil) then return false; end local Dispatcher = cc.Director:getInstance():getEventDispatcher(); local MouseListener = cc.EventListenerMouse:create(); if (MouseListener == nil) then return false; end -- OnMouseDown(event) ** OnMouseUp(event) ** OnMouseMove(event) ** OnMouseScroll(event) local function OnMouseDown(event) if (CurObj.OnMouseDown == nil) then return false; end CurObj:OnMouseDown(event) return true; end local function OnMouseUp(event) if (CurObj.OnMouseUp == nil) then return false; end CurObj:OnMouseUp(event) return true; end local function OnMouseMove(event) if (CurObj.OnMouseMove == nil) then return false; end CurObj:OnMouseMove(event) return true; end local function OnMouseScroll(event) if (CurObj.OnMouseScroll == nil) then return false; end CurObj:OnMouseScroll(event) return true; end MouseListener:registerScriptHandler(OnMouseDown, cc.Handler.EVENT_MOUSE_DOWN); MouseListener:registerScriptHandler(OnMouseUp, cc.Handler.EVENT_MOUSE_UP); MouseListener:registerScriptHandler(OnMouseMove, cc.Handler.EVENT_MOUSE_MOVE); MouseListener:registerScriptHandler(OnMouseScroll, cc.Handler.EVENT_MOUSE_SCROLL); Dispatcher:addEventListenerWithSceneGraphPriority(MouseListener, CurObj); return true; --[[event成員函數 getLocation();返回坐標結構體,與實際世界坐標的Y是相反的 getMouseButton();返回哪一個鍵 getCursorX();//返回屏幕坐標X getCursorY();//返回屏幕坐標Y ]] end -- ======================================================鼠標箭頭隱藏 -- 隱藏當前視口的鼠標箭頭 function PackagingClass:SetMouseConceal(BOOL) if (BOOL == nil) then return false; end local DirectorView = cc.Director:getInstance():getOpenGLView(); DirectorView:setCursorVisible(BOOL); return true; end -- ======================================================鍵盤按鍵 function PackagingClass:CreateKeyEvent(CurObj) if (CurObj == nil) then return false; end local function OnKeyPressed(KeyCode, Event) -- 16進制 -- print("OOOOOOOOOOOOOOOOOO"..KeyCode.." O "); end local function OnKeyReleased(KeyCode, Event) -- print("OOOOOOOOOOOOOOOOOO"..KeyCode.." O "); end local Listener = cc.EventListenerKeyboard:create(); Listener:registerScriptHandler(OnKeyPressed, cc.Handler.EVENT_KEYBOARD_PRESSED); Listener:registerScriptHandler(OnKeyReleased, cc.Handler.EVENT_KEYBOARD_RELEASED); cc.Director:getInstance():getEventDispatcher():addEventListenerWithSceneGraphPriority(Listener, CurObj); end -- ======================================================計時器 -- 每一幀調用 -- 函數調用約定1 .Update() Or .GameLogicUpdate() -- 函數調用約定2 .Update(interval) Or .GameLogicUpdate(interval) function PackagingClass:CreateTimer_OneFrame(CurObj) if (CurObj == nil) then return false; end -- 如何類中有Update成員函數 if (CurObj.Updata) then -- CurObj:scheduleUpdateWithPriorityLua(CurObj.Updata, 0); -- 每一幀調用 local function handler(interval) CurObj:Updata(interval); end CurObj:scheduleUpdateWithPriorityLua(handler, 0); return true; else if (CurObj.GameLogicUpdata) then -- 如果類中有GameLogicUpdate成員函數 -- CurObj:scheduleUpdateWithPriorityLua(CurObj.GameLogicUpdata, 0); -- 每一幀調用 local function handler(interval) CurObj:GameLogicUpdata(interval); end CurObj:scheduleUpdateWithPriorityLua(handler, 0); return true; else return false; end end end -- 自定義設置秒數調用 function PackagingClass:CreateTimer_DefineSecond(Second) scheduler = cc.Director:getInstance():getScheduler() -- 根據設置每幾秒調用這個函數 local function onTimerCallback(dt) print("調用") end self.schedulerID = scheduler:scheduleScriptFunc( function(dt) onTimerCallback(dt) end , Second, false) -- 刪除定時器1 -- if (scheduler ~= nil) then -- scheduler:unscheduleScriptEntry(schedulerID) -- scheduler = nil -- end -- 刪除定時器2 建議指數1 -- cc.Director:getInstance():getScheduler():unscheduleScriptEntry(schedulerID) end --[[ 問題就出在“第一個參數”上,LUA的函數一般定義方式是ClassName:funcName(f1,f2,f3...),相當於ClassName.funcName(self,f1,f2,f3...) 因為LUA沒有類的概念,所以面向對象時每個函數需要一個額外的self參數來指向調用者,LUA提供了“: ”語法來方便我們定義和調用,但是cocos沒有。 於是我們的handler第一個參數就直接被cocos傳進來的interval給擠掉了,handler函數,或者叫update函數就找不到調用者了。 ]] -- ======================================================常用功能性 -- 從當前對象中刪除一個子對象 function PackagingClass:FunctionRestMoveChild(CurObj, MoveObj) CurObj:removeChild(MoveObj) -- 根據名字刪除 removeChildByName(""); end -- 創建字體 function PackagingClass:CreateFonts(Buf, TTFFilePath, Size) Font = cc.Label:createWithTTF(Buf, TTFFilePath, Size); self.m_Font = Font; return Font; end -- 獲取當前顯示視口的寬高 function PackagingClass:GetVisibleSize() return cc.Director:getInstance():getVisibleSize(); end -- 開啟深度測試 function PackagingClass:OpenDepthTest() cc.Director:getInstance():setDepthTest(true); end -- 關閉深度測試 function PackagingClass:CloseDepthTest() cc.Director:getInstance():setDepthTest(false); end -- 深度測試 function PackagingClass:DepthTest(Bool) cc.Director:getInstance():setDepthTest(Bool); end -- 獲取當前時間的秒數 function PackagingClass:GetTickCount() return os.time(); end -- 退出當前整個程序 function PackagingClass:Exit(ANY) os.exit(0); end -- 設置精靈的透明度--255為全不透明 function PackagingClass:SetSpritOpacity(Sprites, Value) Sprites:setOpacity(Value); return Sprites; end -- 設置精靈的錨點 function PackagingClass:SetSpriteAnchorPoint(Sprites, Point) Sprites:setAnchorPoint(Point); return Sprites; end -- lua強制類型轉換 -- 事例 =>tolua.cast(Sprite1,"Sprite");--雖然獲取了並強制轉換了類型,但,原有的動畫將沒有了,完完全全成為你想要的類型 -- 一般從Node:getChildByName("");獲取,可以在上個場景沒有用的素材中找 function PackagingClass:ForseTransition(GameObject, Type) local TemplateType = tolua.cast(GameObject, Type); return TemplateType; end -- 創建一個ScrollView 容器 視口的寬高, 滾動容器的寬高 (0,0)在坐下角 --[[ listView 容器沒有設置滾動容器的成員函數,滾動容器的高,pushback(對象不能是精靈)而決定 ]] -- 有關size的 必須用cc.size() function PackagingClass:CreateScrollView(ViewSize, ContainerSize) local Scrollview = ccui.ScrollView:create(); -- 開啟觸摸 Scrollview:setTouchEnabled(true); -- 開啟反彈 Scrollview:setBounceEnabled(true); Scrollview:setDirection(ccui.ScrollViewDir.vertical); -- scrollView:setDirection(cc.SCROLLVIEW_DIRECTION_VERTICAL)--垂直滾動 -- scrollView:setDirection(cc.SCROLLVIEW_DIRECTION_HORIZONTAL)--水平滾動 -- 設置顯示視口區域寬高 Scrollview:setContentSize(ViewSize); -- 設置滾動區域寬高 Scrollview:setInnerContainerSize(ContainerSize); -- 設置顯示視口的位置 Scrollview:setPosition(cc.p(0, 0)); -- 錨點,故它會忽略錨點的設置,其錨點始終為(0,0) -- Scrollview:setAnchorPoint(cc.p(0, 0)); -- 滾動寬度 Scrollview:setScrollBarWidth(30); -- 滾動條為紅色 Scrollview:setScrollBarColor(cc.RED); -- 設置滾動條的位置從角落 -- Scrollview:setScrollBarPositionFromCorner(cc.p(2, 2)); -- 關閉滾動條顯示 Scrollview:setScrollBarEnabled(false); -- 設置背景圖片 Scrollview:setBackGroundImage("Privatemode/listView_background.png") -- 設置滾動到視口的頂部 時間, bool 表示有衰減效果 Scrollview:scrollToTop(Time, true); -- 設置滾動到視口的底部 時間, bool 表示有衰減效果 Scrollview:scrollToBottom(Time, true); -- 獲取滾動容器的坐標 local Position = Scrollview:getInnerContainerPosition(); local function Callback(sender, eventType) if (eventType == ccui.ScrollviewEventType.scrollToBottom) then print("滾動到頂部"); end if (eventType == ccui.ScrollviewEventType.scrollToTop) then print("滾動到底部部"); end end -- 添加觸摸事件 Scrollview:addTouchEventListener(Callback); -- 該回調函數將會在視圖發生滾動時觸發 -- Scrollview:addEventListenerScrollView(target, selector) -- 該回調函數將在滾動事件觸發時被調用 Scrollview:addEventListener( function() end); self.m_Scrollview = Scrollview; return Scrollview; end -- 貝塞爾循環出發和返回 function PackagingClass:BezierFor() -- 出發時間 local Var__i = 0; -- 出發后時間 local Var__Time = 0; for i = 0, 5 do local Buf = string.format("LogonScene/ChildPNG/%d.png", i); Arr__[i] = cc.Sprite:create(Buf); Arr__[i]:setPosition(cc.p(appdf.WIDTH / 2 - 151, appdf.HEIGHT / 4 * 3 + 25.17)); -- 先后順序出發的時間 local DeTiemS = cc.DelayTime:create(Var__i); local BezAcS = cc.BezierTo:create(1, MConRight); local BezAcE = cc.BezierTo:create(1, MConLeft); -- 出發后卡住的時間,再回來 local DeTimeE = cc.DelayTime:create((0.75 - Var__Time) * 2); -- 是先后順序的回來,卡的時間是出發的時間的++ local DeTimeSPluas = cc.DelayTime:create(i * 0.15); local SeAc = cc.Sequence:create(DeTiemS, BezAcS, DeTimeE, BezAcE, DeTimeSPluas); Arr__[i]:runAction(cc.RepeatForever:create(SeAc)); Var__i = Var__i + 0.15; Var__Time = Var__Time + 0.15; end end function PackagingClass:OverallArrangemet(Number) -- for i = 1, Number do -- self.m_Position[i].X = 0; -- self.m_Position[i].Y = 0; -- end local Arr = { }; for i = 1, Number do Arr[i] = { }; Arr[i].X = 0; Arr[i].Y = 0; end for i = 1, Number do Arr[i].X = i; Arr[i].Y = i + 1; print(Arr[i].X .. " " .. Arr[i].Y) end -- //死的 local Up_Y = 1240; local Down_Y = 280; -- //活的 local DisPlayWidth = 750; local DIsplayHeight = 1335; -- //可調 local Up_YOffset = 100; local Down_YOffset = 100; -- //求得 local Up_Down_AddOffset = 0; Up_Down_AddOffset = Up_Y -(Down_Y +(Up_YOffset + Down_YOffset)); -- //活的 local DisPlayLeftX = 60; local DisPlayRightX = 690; -- //最上面的和最下面的的可放總位置的長度 local RightUp = Up_Y - Up_YOffset; local RightDown = Down_Y + Down_YOffset; local RightUpAddDown = RightUp - RightDown; -- //偶數剛剛好 if (Number % 2 == 0) then -- //中間那一個 local Center =(Number / 2) + 1; -- //右邊放的總個數 -- //減去最上面的一個就是右邊可以放的總數 local RightCount = Center - 2; -- //右邊可以放 if (RightCount ~= 0) then -- //直接放的頂端 Arr[1].X = DisPlayWidth / 2; Arr[1].Y = Up_Y; -- //人數為四個的時候 if (RightCount == 1) then Arr[2].X = DisPlayRightX; Arr[2].Y = RightUp - RightUpAddDown / 2; Arr[Center].X = DisPlayWidth / 2; Arr[Center].Y = Down_Y; Arr[4].X = DisPlayLeftX; Arr[4].Y = RightUp - RightUpAddDown / 2; else -- //人數大於四個的時候 -- //Right local RightOneByOneOffset = RightUpAddDown /(RightCount - 1); for i = 0, RightCount do Arr[i + 2].X = DisPlayRightX; Arr[i + 2].Y = RightUp; RightUp = RightUp - RightOneByOneOffset; end Arr[Center].X = DisPlayWidth / 2; Arr[Center].Y = Down_Y; -- //Left local temp = 2; for i = Center + 1, Number do Arr[i].X = DisPlayLeftX; Arr[i].Y = Arr[i - temp].Y; temp = temp + 2; end end else Arr[1].X = DisPlayWidth / 2; Arr[1].Y = Up_Y; Arr[Center].X = DisPlayWidth / 2; Arr[Center].Y = Down_Y; end for i = 1, Number do print(Arr[i].X .. " " .. Arr[i].Y); end else -- //中間那一個 local Center =(Number + 1) / 2; -- //總數只有三個時,從右邊開始只放一個 if (Center - 1 == 1) then Arr[1].X = DisPlayRightX; Arr[1].Y = RightUp - RightUpAddDown / 2; Arr[2].X = DisPlayWidth / 2; Arr[2].Y = Down_Y; Arr[3].X = DisPlayLeftX; Arr[3].Y = Arr[1].Y; else Arr[Center].X = DisPlayWidth / 2; Arr[Center].Y = Down_Y; local SideCount =(Number - 1) / 2; local RightOneByOneOffset = RightUpAddDown /(SideCount - 1); for i = 1, Center - 1 do Arr[i].X = DisPlayRightX; Arr[i].Y = RightUp; RightUp = RightUp - RightOneByOneOffset; end -- //Left local temp = 2; for i = Center + 1, Number do Arr[i].X = DisPlayLeftX; Arr[i].Y = Arr[i - temp].Y; temp = temp + 2; end end end for i = 1, Number do print("PPPPPPP: X = " .. Arr[i].X .. " Y = " .. Arr[i].Y) end return Arr; end -- scrollViewDidScroll(view) -- cellSizeForTableRoom(view, idx) -- tableCellAtIndexRoom(view, idx) -- numberOfCellsInTableViewRoom(view) -- onTouchPanelRankItem(sender,eventType) function PackagingClass:CreateTableView(CurObj, Position) local TableView = cc.TableView:create(cc.size(600, 800)); TableView:setDirection(cc.SCROLLVIEW_DIRECTION_VERTICAL); TableView:setPosition(Position); TableView:setVerticalFillOrder(cc.TABLEVIEW_FILL_TOPDOWN); -- TableView:setBounceable(true); -- 設置代理 -- TableView:setDelegate(); --和TableView:registerScriptHandler(handler(CurObj,CurObj.scrollViewDidScroll), cc.SCROLLVIEW_SCRIPT_SCROLL); 一起用 -- 返回寬高函數 TableView:registerScriptHandler(CurObj.cellSizeForTableRoom, cc.TABLECELL_SIZE_FOR_INDEX); -- 返回cell TableView:registerScriptHandler(handler(CurObj, CurObj.tableCellAtIndexRoom), cc.TABLECELL_SIZE_AT_INDEX); -- 返回cell數量 TableView:registerScriptHandler(handler(CurObj, CurObj.numberOfCellsInTableViewRoom), cc.NUMBER_OF_CELLS_IN_TABLEVIEW); CurObj:addChild(TableView); TableView:reloadData(); -- -- 觸摸吞噬解決方案 -- local listener = cc.EventListenerTouchOneByOne:create(); -- -- 給觸摸監聽函數設置吞沒事件,使觸摸上面的層的時候事件不會向下傳遞 -- listener:setSwallowTouches(true) -- local function OnTouchBegin(touch, event) -- local X = touch:getLocation().x -- local Y = touch:getLocation().y -- print("X = " .. X .. " Y = " .. Y) -- print(event) -- print("觸摸開始") -- return true; -- end -- local function OnTouchMove(touch, event) -- local X = touch:getLocation().x -- local Y = touch:getLocation().y -- print("X = " .. X .. " Y = " .. Y) -- print(event) -- print("觸摸移動") -- end -- local function OnTouchEnd(touch, event) -- local X = touch:getLocation().x -- local Y = touch:getLocation().y -- print("X = " .. X .. " Y = " .. Y) -- print(event) -- print("觸摸結束") -- end -- listener:registerScriptHandler(OnTouchBegin, cc.Handler.EVENT_TOUCH_BEGAN); -- listener:registerScriptHandler(OnTouchMove, cc.Handler.EVENT_TOUCH_MOVED); -- listener:registerScriptHandler(OnTouchEnd, cc.Handler.EVENT_TOUCH_ENDED); -- local eventDispatcher = cc.Director:getInstance():getEventDispatcher(); -- eventDispatcher:addEventListenerWithSceneGraphPriority(listener, TableView); return TableView; end function PackagingClass:utfstrlen(str) local len = #str; local left = len; local cnt = 0; local arr = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc }; while left ~= 0 do local tmp = string.byte(str, - left); local i = #arr; while arr[i] do if tmp >= arr[i] then left = left - i; break; end i = i - 1; end cnt = cnt + 1; end return cnt; end function PackagingClass:stringLen(string) local lenInByte = #string local byteCount = 1 local i = 1 while (i <= lenInByte) do local curByte = string.byte(string, i) -- 單字節編碼 if (curByte > 0 and curByte <= 127) then byteCount = 1 -- 其他的多字節或者是雙字節編碼 else byteCount = 2 end local char = "" if (byteCount > 1) then char = string.sub(string, i, i + 3 - 1) print("中文字符 " .. char) i = i + 3 else char = string.sub(string, i, i) print("英文字符 " .. char) i = i + 1 end byteCount = 0 end return lenInByte; end -- 注意 : . 的調用 function PackagingClass:stringMaxLenPlusPlus(string, maxLen) if (type(string) ~= "string") then return "非字符串或者字符串為空" elseif (maxLen == 0 or maxLen == nil) then return "字符串長度有誤" elseif (string == "" or string == nil) then return "字符串有誤" elseif (maxLen == #string or maxLen > #string) then return string end local lenInByte = #string local byteCount = 1 local i = 1 local ConstChar = "" -- while (i <= lenInByte) do -- local curByte = string.byte(string, i) -- -- 單字節編碼 -- if (curByte > 0 and curByte <= 127) then -- byteCount = 1 -- -- 其他的多字節或者是雙字節編碼 -- else -- byteCount = 2 -- end -- local char = "" -- if (byteCount > 1) then -- char = string.sub(string, i, i + 3 - 1) -- print("中文 " .. char) -- i = i + 3 -- else -- char = string.sub(string, i, i) -- print("英文 " .. char) -- i = i + 1 -- end -- byteCount = 0 -- end while (i <= maxLen) do local curByte = string.byte(string, i) -- 單字節編碼 if (curByte > 0 and curByte <= 127) then byteCount = 1 -- 其他的多字節或者是雙字節編碼 else byteCount = 2 end local char = "" if (byteCount > 1) then char = string.sub(string, i, i + 3 - 1) print("中文字符 " .. char) i = i + 3 else char = string.sub(string, i, i) print("英文字符 " .. char) i = i + 1 end -- 不管是什么,都保證截取出來的是最完整的字符串 ConstChar = ConstChar .. char byteCount = 0 end return ConstChar .. "....." end -- 隨機數 function PackagingClass:Srandom() math.randomseed(os.time()) -- 范圍1到3 local rand = math.random(1, 3) end -- 返回大於這個數的整數 function PackagingClass:GetCeil(Number) print(math.ceil(Number)) end --該功能相當於C功能系統。 --它傳遞要由操作系統shell執行的命令。 --它返回一個與系統相關的狀態代碼。 --如果命令不存在,則如果外殼程序可用,則返回非零,否則返回零 function PackagingClass:cmd(command) os.execute(command) end --根據函數名字調用函數 function PackagingClass:strCallFunction(String) -- local str = string.dump(String) -- loadstring(str)() end return PackagingClass; -- cocos-x Engine 中Main --[[ Node:addChild();--參數基本上就能填,只要是個節點(csb)等,對象,精靈,粒子等等等 self:getParent(); --返回當前類的父類的節點 --從父類移除 self:removeFromParent() --把自己從父類移除掉 cc.Show:create();--直接顯示動作,無參數 cc.Hide:create();--直接消失動作,無參數 --Scale9Sprite --9宮格精靈 1 2 3 4 5 6 7 8 9 setCapInsets(CCRectMake(0,0,800,600));--從0,0點拉伸多寬, setContentSize(Size::Size(800,600));--最終顯示的寬高 --]] --[[ dropdown 列表創建 先需要一個主按鈕,其他的用層來存,層的事件再分發給主按鈕 ]] --[[ ScrollView 不能添加checkbox 解決方案 用listView self._listView = ccui.ListView:create() self._listView:setDirection(cc.SCROLLVIEW_DIRECTION_VERTICAL) self._listView:setBounceEnabled(true) -- 滑動慣性 self._listView:setBackGroundImage("Privatemode/listView_background.png") self._listView:setBackGroundImageScale9Enabled(true) self._listView:setContentSize(viewWidth, viewHeight) self._listView:setPosition(cc.p(viewposX, viewposY)) self._listView:jumpToTop() self:addChild(self._listView) 由於listView 有點局限性 所有這樣 self._layerOut = ccui.Layout:create() self._layerOut:setContentSize(viewWidth, 1200) self._listView:pushBackCustomItem(self._layerOut) ]] -- 自定義監聽對象 --[[ local listener = cc.EventListenerTouchOneByOne:create(); listener:setSwallowTouches(true) local function OnTouchBegin(touch, event) print("SSSSSSSSSSSSSSSSSSSS " .. touch:getStartLocation().x) print("SSSSSSSSSSSSSSSSSSSS " .. touch:getLocation().x) return false; end listener:registerScriptHandler(OnTouchBegin, cc.Handler.EVENT_TOUCH_BEGAN) local eventDispatcher = cc.Director:getInstance():getEventDispatcher(); eventDispatcher:addEventListenerWithSceneGraphPriority(listener, item); -- local listener = cc.EventListenerTouchOneByOne:create(); -- listener:setSwallowTouches(false) -- local function OnTouchBegin(touch, event) -- print("OnTouchBegin " .. touch:getStartLocation().x) -- print("OnTouchBegin " .. touch:getLocation().x) -- return true; -- end -- local function OnTouchMove(touch, event) -- print("OnTouchMove " .. touch:getStartLocation().x) -- print("OnTouchMove " .. touch:getLocation().x) -- print("itemX "..item:getPositionX()) -- print("itemY "..item:getPositionY()) -- end -- local function OnTouchEnd(touch, event) -- print("OnTouchEnd " .. touch:getStartLocation().x) -- print("OnTouchEnd " .. touch:getLocation().x) -- end -- listener:registerScriptHandler(OnTouchBegin, cc.Handler.EVENT_TOUCH_BEGAN) -- listener:registerScriptHandler(OnTouchMove, cc.Handler.EVENT_TOUCH_MOVED); -- listener:registerScriptHandler(OnTouchEnd, cc.Handler.EVENT_TOUCH_ENDED); -- local eventDispatcher = cc.Director:getInstance():getEventDispatcher(); -- eventDispatcher:addEventListenerWithSceneGraphPriority(listener, item); ]] -- lua字符串擴展 --[[ local tb = {}; for utfChar in string.gmatch(String,"[%z\1-\127\194-\244][\128-\191]*") do table.insert(tb,utfChar) end ]] -- 層穿透解決方案 --[[ self:setTouchEnabled(true) self:registerScriptTouchHandler( function() return true end ) --建議用這個 --穿透解決方案 function ClubRecordInquireLayer:penetrateSolution(class,bool) class:setTouchEnabled(bool) class:registerScriptTouchHandler( function() return bool end ) end ]] -- 層穿透解決方案 --[[ self:registerScriptTouchHandler(function(eventType) return true end) ]] --[[ function RoomLayer:unicode_to_utf8(convertStr) if type(convertStr)~="string" then return convertStr end local resultStr="" local i=1 while true do local num1=string.byte(convertStr,i) local unicode if num1~=nil and string.sub(convertStr,i,i+1)=="\\u" then unicode=tonumber("0x"..string.sub(convertStr,i+2,i+5)) i=i+6 elseif num1~=nil then unicode=num1 i=i+1 else break end -- print(unicode) if unicode <= 0x007f then resultStr=resultStr..string.char(bit.band(unicode,0x7f)) elseif unicode >= 0x0080 and unicode <= 0x07ff then resultStr=resultStr..string.char(bit.bor(0xc0,bit.band(bit.rshift(unicode,6),0x1f))) resultStr=resultStr..string.char(bit.bor(0x80,bit.band(unicode,0x3f))) elseif unicode >= 0x0800 and unicode <= 0xffff then resultStr=resultStr..string.char(bit.bor(0xe0,bit.band(bit.rshift(unicode,12),0x0f))) resultStr=resultStr..string.char(bit.bor(0x80,bit.band(bit.rshift(unicode,6),0x3f))) resultStr=resultStr..string.char(bit.bor(0x80,bit.band(unicode,0x3f))) end end resultStr=resultStr..'\0' return resultStr end ]] --[[ -- local String = EditBox_1_Layer:getText() -- local S = " "; -- local Len = string.len(String); -- local _R_N_ = "\r\n "; -- -- 打到換行的長度 -- if (Len >= 84) then -- local i = 1; -- local j = 84; -- -- 總長 -- local len = Len; -- local loop =(Len / 84) -((Len / 84) % 1); -- while true do -- String = String; -- local s = string.sub(String, i, j) -- S = S .. s .. n -- len = len - j; -- if (len <= 0) then -- break; -- else -- i = j + 1; -- j = j + j; -- if (j > Len) then -- j = Len; -- end -- end -- end -- -- 沒有到換行的長度 -- else -- end ]] --[[ 復用性問題解決方案 事件 用sender:getParent():getParent():getIdx() + 1 從而得到這個cell -- self.TableView = cc.TableView:create(cc.size(yl.WIDTH, 420)) -- self.TableView:setDirection(cc.SCROLLVIEW_DIRECTION_HORIZONTAL) -- self.TableView:setPosition(cc.p(0,yl.HEIGHT/2-220)) -- self.TableView:setDelegate() -- self.TableView:addTo(self) -- self.TableView:registerScriptHandler(self.tableCellTouched, cc.TABLECELL_TOUCHED) -- self.TableView:registerScriptHandler(handler(self, self.cellSizeForTable), cc.TABLECELL_SIZE_FOR_INDEX) -- self.TableView:registerScriptHandler(handler(self, self.tableCellAtIndex), cc.TABLECELL_SIZE_AT_INDEX) -- self.TableView:registerScriptHandler(self.numberOfCellsInTableView, cc.NUMBER_OF_CELLS_IN_TABLEVIEW) -- self.TableView:reloadData() ]] -- 編輯框解決方案 --[[ editBox:setPlaceholderFont("Arial", 26) editBox:setFont("Arial", 26) ]] -- "Privatemode/btdownUpdate.png", UI_TEX_TYPE_LOCAL 配對 --[[ --創建編輯框 --寬高,坐標,錨點,名字 function ClubSettingLayer:CreateEditBox(Width, Height, X, Y, AnchorPointX, AnchorPointY, StringName) local EditBox = ccui.EditBox:create(cc.size(Width, Height),"blank.png", UI_TEX_TYPE_PLIST) --local EditBox = ccui.EditBox:create(cc.size(Width, Height),"Privatemode/btdownUpdate.png", UI_TEX_TYPE_LOCAL) EditBox:setAnchorPoint(AnchorPointX, AnchorPointY) EditBox:setPosition(X, Y) EditBox:setFontName("fonts/round_fonts.ttf") EditBox:setPlaceholderFontName("fonts/round_fonts.ttf") EditBox:setPlaceholderFontColor(cc.c3b(212, 221, 255)) EditBox:setFontColor(cc.c3b(212, 221, 255)) EditBox:setFontSize(24) --EditBox:setText(StringName) EditBox:setName(StringName) local function editboxEventHandler(eventType,sender) if (eventType == "began") then print("開始編輯") elseif (eventType == "ended") then print("結束編輯") elseif (eventType == "changed") then print("改變編輯") elseif (eventType == "return") then print("返回編輯") end end EditBox:registerScriptEditBoxHandler(editboxEventHandler) return EditBox end ]] --[[ for i = 1, #self.m_ExpendLableArray do print("選擇固定積分" .. self.m_ExpendLableArray[i]:getString()) --返回值為查找到的索引值 local Find = string.find(self.m_ExpendLableArray[i]:getString(), -- 查找的字符串 "%", -- 開始查找的位置 string.len(self.m_ExpendLableArray[i]:getString()), -- true表示關閉"%d"這種格式轉義字符,按字符串查找 true) if (Find ~= nil) then print("查找到了字符 %") self.m_ExpendLableArray[i]:setString(""..tonumber(string.sub(self.m_ExpendLableArray[i]:getString(),1, Find - 1)) * 100) print("去掉% 的字符串 "..self.m_ExpendLableArray[i]:getString()) end end ]] --編輯框解決方案 --[[ "text" cc.size( , ) " / .png" 123456789 function ClubSettingLayer:createEditBox(text, size, path, tag) local edlistener = function(eventType, sender) if eventType == "began" then sender:setText("") elseif eventType == "return" then if sender:getText() == "" or sender:getText() == nil then sender:setText("0") end self:onEditEvent(sender:getTag()) end end local editBox = ccui.EditBox:create(size, path) editBox:setAnchorPoint(0, 0.5) editBox:setPlaceholderFont("Arial", 30) editBox:setFont("Arial", 30) editBox:setInputMode(cc.EDITBOX_INPUT_MODE_NUMERIC) editBox:setText(text) editBox:setTag(tag) editBox:registerScriptEditBoxHandler(edlistener) return editBox end ]] --公告解決方案 --[[ --修改名稱 EditBox local title = display.newSprite("Club/NoticeSetting.png") :setPosition(cc.p(display.cx - 230,display.cy + 50)) :addTo(layer) local bg = ccui.Scale9Sprite:create("Common/sp_input_bg.png") bg:setScale9Enabled(true) bg:setAnchorPoint(0,1) bg:setContentSize(cc.size(440,120)) bg:setPosition(cc.p(title:getPositionX() + title:getContentSize().width / 2 + 15,title:getPositionY() + 10)) layer:addChild(bg) local editBox = ccui.EditBox:create(cc.size(440,120), "blank.png", UI_TEX_TYPE_PLIST) layer:addChild(editBox) editBox:setPosition(cc.p(title:getPositionX() + title:getContentSize().width / 2 + 15,title:getPositionY() - title:getContentSize().height + 10)) editBox:setAnchorPoint(0, 0.5) editBox:setFont("Arial", 26) editBox:setPlaceholderFontColor(cc.c3b(100,100,100)) editBox:setPlaceHolder("請輸入新的公告") editBox:setInputMode(cc.EDITBOX_INPUT_MODE_ANY) editBox:registerScriptEditBoxHandler(function(type,sender) if eventType == "began" then sender:setText("") elseif eventType == "return" then if sender:getText() == "" or sender:getText() == nil then sender:setText("剛剛創建新公告") end end end) ]] -- 解決安卓上的顯示雙層 -- 編輯框 --[[ -- 創建編輯框 -- 寬高,坐標,錨點,名字 function ClubSettingLayer:CreateEditBox(Width, Height, X, Y, AnchorPointX, AnchorPointY, StringName) local EditBox = ccui.EditBox:create(cc.size(Width, Height), "blank.png", UI_TEX_TYPE_PLIST) -- local EditBox = ccui.EditBox:create(cc.size(Width, Height),"Privatemode/btdownUpdate.png", UI_TEX_TYPE_LOCAL) EditBox:setAnchorPoint(AnchorPointX, AnchorPointY) EditBox:setPosition(X, Y) EditBox:setFontName("fonts/round_fonts.ttf") EditBox:setPlaceholderFontName("fonts/round_fonts.ttf") EditBox:setPlaceholderFontColor(cc.c3b(212, 221, 255)) EditBox:setFontColor(cc.c3b(212, 221, 255)) EditBox:setFontSize(24) EditBox:setInputMode(cc.EDITBOX_INPUT_MODE_NUMERIC) EditBox:setMaxLength(6) -- EditBox:setText(StringName) EditBox:setName(StringName) self.g_m_AudioAffectsState = 0 local function editboxEventHandler(eventType) -- 保證只播放一次 if (self.g_m_AudioAffectsState == 0) then ExternalFun.playClickEffect() self.g_m_AudioAffectsState = 1; end if (eventType == "began") then print("開始編輯") if (EditBox:getName() == "搶庄限制") then self.m_bankerLab:setString("") elseif (EditBox:getName() == "下注限制") then self.m_betLab:setString("") elseif (EditBox:getName() == "准備限制") then self.m_readyLab:setString("") elseif (EditBox:getName() == "第一名消耗") then self.m_firstExpendLab:setString("") elseif (EditBox:getName() == "第二名消耗") then self.m_secondExpendLab:setString("") elseif (EditBox:getName() == "第三名消耗") then self.m_thirdExpendLab:setString("") elseif (EditBox:getName() == "消耗最低起扣") then self.m_lowestExpendLab:setString("") end elseif (eventType == "ended") then print("結束編輯") elseif (eventType == "changed") then -- 邏輯放這在手機平台可能會死循環 print("改變編輯") elseif (eventType == "return") then print("返回編輯") self.g_m_AudioAffectsState = 0 if (EditBox:getName() == "搶庄限制") then print("編輯搶庄限制") if (EditBox:getText() == "") then EditBox:setText("0") end self.m_bankerLab:setString(EditBox:getText()) local TempNumber = tonumber(self.m_bankerLab:getString()) if (TempNumber > 100000) then self.m_bankerLab:setString("100000") showToast(self, "最大只能是100000", 2) end self.m_bankerStr = tonumber(self.m_bankerLab:getString()) elseif (EditBox:getName() == "下注限制") then print("編輯下注限制") if (EditBox:getText() == "") then EditBox:setText("0") end self.m_betLab:setString(EditBox:getText()) local TempNumber = tonumber(self.m_betLab:getString()) if (TempNumber > 100000) then self.m_betLab:setString("100000") showToast(self, "最大只能是100000", 2) end self.m_betStr = tonumber(self.m_betLab:getString()) elseif (EditBox:getName() == "准備限制") then print("編輯准備限制") if (EditBox:getText() == "") then EditBox:setText("0") end self.m_readyLab:setString(EditBox:getText()) local TempNumber = tonumber(self.m_readyLab:getString()) if (TempNumber > 100000) then self.m_readyLab:setString("100000") showToast(self, "最大只能是100000", 2) end self.m_readyStr = tonumber(self.m_readyLab:getString()) elseif (EditBox:getName() == "第一名消耗") then print("第一名消耗") if (EditBox:getText() == "") then EditBox:setText("0") end self.m_firstExpendLab:setString(EditBox:getText()) local TempNumber = tonumber(self.m_firstExpendLab:getString()) if (self.m_ExpendNormIdx == 1) then if (TempNumber > 100000) then self.m_firstExpendLab:setString("100000") showToast(self, "最大只能是100000", 2) end else if (TempNumber > 1000) then self.m_firstExpendLab:setString("1000") showToast(self, "百分比最大只能是1000", 2) end end self.m_firstExpendStr = tonumber(self.m_firstExpendLab:getString()) elseif (EditBox:getName() == "第二名消耗") then print("第二名消耗") if (EditBox:getText() == "") then EditBox:setText("0") end self.m_secondExpendLab:setString(EditBox:getText()) local TempNumber = tonumber(self.m_secondExpendLab:getString()) if (self.m_ExpendNormIdx == 1) then if (TempNumber > 100000) then self.m_secondExpendLab:setString("100000") showToast(self, "最大只能是100000", 2) end else if (TempNumber > 1000) then self.m_secondExpendLab:setString("1000") showToast(self, "百分比最大只能是1000", 2) end end self.m_secondExpendStr = tonumber(self.m_secondExpendLab:getString()) elseif (EditBox:getName() == "第三名消耗") then print("第三名消耗") if (EditBox:getText() == "") then EditBox:setText("0") end self.m_thirdExpendLab:setString(EditBox:getText()) local TempNumber = tonumber(self.m_thirdExpendLab:getString()) if (self.m_ExpendNormIdx == 1) then if (TempNumber > 100000) then self.m_thirdExpendLab:setString("100000") showToast(self, "最大只能是100000", 2) end else if (TempNumber > 1000) then self.m_thirdExpendLab:setString("1000") showToast(self, "百分比最大只能是1000", 2) end end self.m_thirdExpendStr = tonumber(self.m_thirdExpendLab:getString()) elseif (EditBox:getName() == "消耗最低起扣") then print("消耗最低起扣") if (EditBox:getText() == "") then EditBox:setText("0") end self.m_lowestExpendLab:setString(EditBox:getText()) local TempNumber = tonumber(self.m_lowestExpendLab:getString()) if (self.m_ExpendNormIdx == 1) then if (TempNumber > 100000) then self.m_lowestExpendLab:setString("100000") showToast(self, "最大只能是100000", 2) end else if (TempNumber > 1000) then self.m_lowestExpendLab:setString("1000") showToast(self, "百分比最大只能是1000", 2) end end self.m_lowestExpendStr = tonumber(self.m_lowestExpendLab:getString()) end EditBox:setText("") end end EditBox:registerScriptEditBoxHandler(editboxEventHandler) return EditBox end ]] -- 檢查框解決方案 --[[ if (self._layerOut:getChildByTag(tag):isSelected() == true) then print("之前沒有選擇,現在選擇了") else print("之前有選擇,現在沒有選擇") end ]] --完整編輯框窗口解決方案 --[[ function ClubRoomLayer:setChangeClubNameWindow(clubName) local layer = display.newLayer(cc.c4b(0,0,0,70)) layer:setTouchEnabled(true) layer:registerScriptTouchHandler(function() return true end) self:addChild(layer) local btnOffsetX = 30 local btnOffsetY = -15 -- 背景圖 local bg = ccui.Scale9Sprite:create("bg_common_2.png") bg:setScale9Enabled(true) bg:setPosition(display.center) layer:addChild(bg) --標題 display.newSprite("Title/title_ChangeClubName.png") :setPosition(bg:getPositionX(),display.height * 0.5 + bg:getContentSize().height * 0.5 - 42) :addTo(layer) --關閉按鈕 local btn = ccui.Button:create("Button/btn_close.png","Button/btn_close.png") btn:setPosition(bg:getPositionX() + bg:getContentSize().width * 0.5 - 40,display.height * 0.5 + bg:getContentSize().height * 0.5 - 40) btn:addClickEventListener(function(sender) sender:getParent():removeFromParent() end) layer:addChild(btn) --修改名稱 EditBox local title = display.newSprite("Club/ChangeClubName.png") :setPosition(cc.p(display.cx - 230,display.cy)) :addTo(layer) local editBox = ccui.EditBox:create(cc.size(440,47), "Common/sp_input_bg.png") layer:addChild(editBox) editBox:setPosition(cc.p(title:getPositionX() + title:getContentSize().width / 2 + 15,title:getPositionY())) editBox:setAnchorPoint(0, 0.5) editBox:setPlaceholderFont("Arial", 26) editBox:setFont("Arial", 26) editBox:setPlaceholderFontColor(cc.c3b(100,100,100)) --占位符 editBox:setPlaceHolder("請輸入新的名稱") editBox:setInputMode(cc.EDITBOX_INPUT_MODE_ANY) editBox:registerScriptEditBoxHandler(function(type,sender) if type == "began" then sender:setText("") elseif type == "return" then if sender:getText() == "" or sender:getText() == nil then sender:setText("0") end end end) -- 取消 local btn_cancel = ccui.Button:create("Button/btn_cancel_bg.png", "Button/btn_cancel_bg.png") btn_cancel:setPosition(cc.p(appdf.WIDTH * 0.5 - 145 - btnOffsetX, appdf.HEIGHT * 0.5 - 170 + btnOffsetY)) btn_cancel:setPressedActionEnabled(true) btn_cancel:setZoomScale(0.1) layer:addChild(btn_cancel) local img_cancel = cc.Sprite:create("Button/text_cancel.png") img_cancel:setPosition(cc.p(btn_cancel:getPositionX(), btn_cancel:getPositionY())) layer:addChild(img_cancel) btn_cancel:addClickEventListener( function(sender, tType) layer:removeFromParent() end ) -- 確定 local btn_confirm = ccui.Button:create("Button/btn_sure_bg.png", "Button/btn_sure_bg.png") btn_confirm:setPressedActionEnabled(true) btn_confirm:setZoomScale(0.1) btn_confirm:setPosition(cc.p(appdf.WIDTH * 0.5 + 145 + btnOffsetX, appdf.HEIGHT * 0.5 - 170 + btnOffsetY)) layer:addChild(btn_confirm) local img_cancel = cc.Sprite:create("Button/text_sure.png") img_cancel:setPosition(cc.p(btn_confirm:getPositionX(), btn_confirm:getPositionY())) layer:addChild(img_cancel) btn_confirm:addClickEventListener( function(sender, tType) end) end ]] -- 輸入編輯框解決方案 --[[ -- 輸入框 local titleText = ccui.EditBox:create(cc.size(550, 50), "RoomCard/sp_input.png") titleText:setPosition(cc.p(appdf.WIDTH * 0.5, appdf.HEIGHT * 0.5 + 35)) titleText:setFontName("Arial") titleText:setPlaceholderFontName("Arial") titleText:setInputMode(cc.EDITBOX_INPUT_MODE_NUMERIC) -- 限制輸入類型 為數字 titleText:setPlaceholderFontColor(cc.c3b(238, 243, 105)) titleText:setFontColor(cc.c3b(255, 255, 255)) titleText:setFontSize(30) self.layer:addChild(titleText) ]] -- 觸摸宏 --[[ type == ccui.TouchEventType.move ]] -- 觸摸吞噬解決方案 --[[ local btn_close = ccui.Button:create("", "") btn_close:setAnchorPoint(1, 0.5) btn_close:setPosition() --觸摸吞噬解決方案1 btn_close:setSwallowTouches(true) --觸摸吞噬解決方案2 btn_close:addTouchEventListener(function(sender, tType) print("BBBBBBBBBBBBB"..tType) if(tType == ccui.TouchEventType.ended)then layer:removeFromParent() end end) self:addChild(btn_close) --觸摸吞噬解決方案3 -- local listener = cc.EventListenerTouchOneByOne:create(); -- -- 給觸摸監聽函數設置吞沒事件,使觸摸上面的層的時候事件不會向下傳遞 -- listener:setSwallowTouches(true) -- local function OnTouchBegin(touch, event)return true;end -- local function OnTouchMove(touch, event)end -- local function OnTouchEnd(touch, event)layer:removeFromParent()end -- listener:registerScriptHandler(OnTouchBegin, cc.Handler.EVENT_TOUCH_BEGAN); -- listener:registerScriptHandler(OnTouchMove, cc.Handler.EVENT_TOUCH_MOVED); -- listener:registerScriptHandler(OnTouchEnd, cc.Handler.EVENT_TOUCH_ENDED); -- local eventDispatcher = cc.Director:getInstance():getEventDispatcher(); -- eventDispatcher:addEventListenerWithSceneGraphPriority(listener, btn_close); ]] -- 吞噬解決方案 --[[ -- 注冊觸摸事件(吞噬層) local listener = cc.EventListenerTouchOneByOne:create() -- 事件監聽器逐個觸摸 listener:setSwallowTouches(true) -- 吞噬觸摸 listener:registerScriptHandler( function(touch, event) -- 做觸摸處理... return true -- 返回true時,該層下面的層的觸摸事件都會屏蔽掉 end , cc.Handler.EVENT_TOUCH_BEGAN) -- 觸摸事件開始 local eventDispatcher = self.layer:getEventDispatcher() -- 得到事件調度器 eventDispatcher:addEventListenerWithSceneGraphPriority(listener, self.layer) -- 添加具有場景圖優先級的事件監聽器 self:addChild(self.layer) ]] --容器內按鈕吞噬解決方案 --非常重要 也是常用的 --[[ local btn = ccui.Button:create("Common/sp_cut_line.png") btn:setPosition(cellWidth * 0.5, cellHeight * 0.5) btn:setScale9Enabled(true) btn:setOpacity(255) btn:setContentSize(cc.size(cellWidth, cellHeight + 2)) btn:addTo(item) btn:setSwallowTouches(false) btn:addClickEventListener(function(sender,type) local curidx = sender:getParent():getParent():getIdx() + 1 print("table "..curidx) print("param "..idx) end) ]] -- 字體 --[[ --cocos 自帶的字體 cc.Label:createWithSystemFont("", "Arial", 30) cc.Lable:createWithTTF("","Arial.ttf",24) ]] --label 解決方案 --[[ self._strLabel = cc.Label:createWithSystemFont(str, "Arial", 25) :setAnchorPoint(cc.p(0, 1)) --設置沒有空格的換行符 :setLineBreakWithoutSpace(true) :setMaxLineWidth(640) :setPosition(cc.p(40,0)) --對其方式 :setAlignment(cc.TEXT_ALIGNMENT_LEFT) :setTextColor(cc.c4b(255, 255, 255, 255)) :addTo(self._scrollView) self._strLabel:setDimensions(600, len + 500) self._strLabel:setHorizontalAlignment(cc.TEXT_ALIGNMENT_LEFT) self._strLabel:setVerticalAlignment(cc.VERTICAL_TEXT_ALIGNMENT_TOP) ]] -- 遍歷 --[[ for Key, Value in ipairs(iterationDistanceY_Space) do if (Value.Key == playCount) then distanceY = Value.Value break end end ]] --從文件讀取字符串解決方案 --[[ local str = cc.FileUtils:getInstance():getStringFromFile("public/text_help_" .. tostring(GlobalUserItem.nCurGameKind) .. ".txt") ]] -- csb PageView --[[ 添加頁的時候請用layout -- local CsbNode = cc.CSLoader:createNode("Test/Test.csb"); -- CsbNode:setPosition(cc.p(0,0)) -- CsbNode:setScale(1.0) -- local Start_Action = cc.CSLoader:createTimeline("Test/Test.csb"); -- Start_Action:setTimeSpeed(1.0); -- CsbNode:runAction(Start_Action); -- Start_Action:gotoFrameAndPlay(0, true); -- self:addChild(CsbNode) -- local P = CsbNode:getChildByName("PageView_1") -- P:setDirection(cc.SCROLLVIEW_DIRECTION_BOTH) -- P:setScrollBarEnabled(true) -- P:setBounceEnabled(true) ]] -- lable對其方式 --[[ --設置維度 gameRule:setDimensions(300, 100) --設置水平對其方式 gameRule:setHorizontalAlignment(cc.TEXT_ALIGNMENT_LEFT) --設置垂直對其方式 gameRule:setVerticalAlignment(cc.VERTICAL_TEXT_ALIGNMENT_TOP) ]] -- 創建把自己移除 動作解決方案 --[[ cc.RemoveSelf:create() ]] -- 場景切換解決方案 --[[ --StartScene 為腳本 --腳本內容為 --local StartScene = class("StartScene",cc.load("mvc").ViewBase) --function StartScene:onCreate() --必須的 --end -- 方案1 --local startScene = StartScene:create(self, "StartScene"):showWithScene("FADE", 1) --下面三種都可以 --cc.Director:getInstance():runWithScene(startScene) -- 需要調用場景的構造函數才能進入StartScene:create(self, "StartScene") --self:getApp():enterScene("StartScene") --cc.Director:getInstance():replaceScene(startScene) -- 方案2 self:runAction(cc.Sequence:create( cc.DelayTime:create(2), cc.CallFunc:create( function() --"FADE" 待擴展 --StartScene:create(self, "StartScene"):showWithScene("FADE", 1) end ) )); -- 方案3 self:runAction(cc.Sequence:create( cc.DelayTime:create(2), cc.CallFunc:create( function() --self:getApp():enterSceneEx("StartScene","FADE", 1) end ) )); -- 方案3 self:runAction(cc.Sequence:create( cc.DelayTime:create(2), cc.CallFunc:create( function() local myScene = cc.Scene:create() --cc.Director:getInstance():replaceScene(cc.TransitionSplitRows:create(2, myScene)) end ) )); --local EndScene = class("EndScene",function() --return cc.Scene:create(); --end) --local Obj = require("cocos.Packaging_Kernel") --必須是ctor --function EndScene:ctor() --self:InitData(); --end -- 方案4 建議用這個 或者3的方式 --好看好用 self:runAction(cc.Sequence:create( cc.DelayTime:create(2), cc.CallFunc:create( function() --local myScene = EndScene:create() --cc.Director:getInstance():replaceScene(cc.TransitionSplitCols:create(2, myScene)) end ) )); 至於popScene() 和pushScene() 就不建議用了 因為在popScene()回來的時候是不會調用構造函數的 (當前的場景在push時就已經執行了) ]] -- scene -- 場景切換解決方案 --[[ self:registerScriptHandler(function(eventType) print("registerScriptHandler "..eventType) if eventType == "enterTransitionFinish" then -- 進入場景而且過渡動畫結束時候觸發。 self:onEnterTransitionFinish() elseif eventType == "exitTransitionStart" then -- 退出場景而且開始過渡動畫時候觸發。 self:onExitTransitionStart() end end) eventType = "enter" 1、init() 初始化層調用(在類初始化時,只會調用一次)。 2、onEnter() 進入層時候調用(init初始完后進入,可能調用多次,如addChild一次就會調用一次)。 eventType = "enterTransitionFinish" 3、onEnterTransitionDidFinish() 進入層而且過渡動畫結束時候調用(onEnter結束后進入)。 如果寫了self:registerScriptHandler(function(eventType)end) 則不會調用 因為已經存在了"exitTransitionStart" 4、onExit() 退出層時候調用。 eventType = "exitTransitionStart" 5、onExitTransitionDidStart() 退出層而且開始過渡動畫時候調用(onExit結束后進入)。 eventType = "cleanup" 6、cleanup() 層對象被清除時候調用(整個layer銷毀時進入)。 ]] --[[ function GameViewLayer:LoadPlistFrame(filePathName,Position,beginFrame,endFrame,XMLImageName) -- local cache = cc.SpriteFrameCache:getInstance(); -- cache:addSpriteFrames(FilePathName); -- local Test = cc.Sprite:create(); -- Test:setPosition(Position); -- local animation = cc.Animation:create(); -- for i = beginFrame, endFrame do -- local bing = cache:getSpriteFrame(string.format(XMLImageName, i)); -- animation:addSpriteFrame(bing); -- end -- -- 設置單位延遲 -- animation:setDelayPerUnit(0.1); -- animation:setRestoreOriginalFrame(true); -- local action = cc.Animate:create(animation); -- Test:runAction(cc.RepeatForever:create(action)); end ]] --[[ for i = 0,100 do gameListContent:setPosition(cc.p(i * gameListContent:getContentSize().width + gameListContent:getContentSize().width / 2, 50)) end ]] --[[ --用戶表情 function GameViewLayer:userExpression(wChairId,wChairId2,itemIdx) local ani_list = {"boom","dog","feidao","hongbao","qiang","tomato","touji","zuichun"} print("userExpression ------->"..string.format("%s %s %s", wChairId, wChairId2, itemIdx)) local vId1 = self._scene:SwitchViewChairID(wChairId) local vId2 = self._scene:SwitchViewChairID(wChairId2) local posX1 = self.nodePlayer[vId1]:getPositionX() local posY1 = self.nodePlayer[vId1]:getPositionY() local posX2 = self.nodePlayer[vId2]:getPositionX() local posY2 = self.nodePlayer[vId2]:getPositionY() local name = ani_list[itemIdx] local ani = sp.SkeletonAnimation:create("ani/"..name.."/skeleton.json", "ani/"..name.."/skeleton.atlas",1) ani:setPosition(posX1, posY1) self:addChild(ani,101) ani:setAnimation(1,"daji", true) ani:setTimeScale(0) ani:runAction(cc.Sequence:create( cc.MoveTo:create(0.8, cc.p(posX2,posY2)), cc.CallFunc:create(function() ani:setTimeScale(1) end) )) ani:registerSpineEventHandler( function(event) if event.type == "complete" then ani:unregisterSpineEventHandler(sp.EventType.ANIMATION_COMPLETE) ani:stopAllActions() ani:unscheduleUpdate() performWithDelay(ani,function() ani:removeFromParent() end ,0.1) end end,sp.EventType.ANIMATION_COMPLETE) local aniArr = {nil,"Eagle",nil,"RedPackage","Explode",nil,nil,nil} local aniArrTime = {0,3,0,1.1,1.0,0,0,0} name = aniArr[itemIdx] if (name) then ani:setVisible(false) local filePathName = "ani/" .. name .. "/" .. name .. ".csb" local csbNode = cc.CSLoader:createNode(filePathName) csbNode:setPosition(posX1, posY1) local start_Action = cc.CSLoader:createTimeline(filePathName) start_Action:setTimeSpeed(1.0) csbNode:runAction( cc.Sequence:create( cc.MoveTo:create(0.8, cc.p(posX2, posY2)), cc.CallFunc:create( function() self:OnCallFunc(filePathName, csbNode, cc.p(posX2, posY2),aniArrTime[itemIdx]) end ) )) self:addChild(csbNode, 101) end end function GameViewLayer:OnCallFunc(filePathName,csbNode,position,time) local aniNode = cc.CSLoader:createNode(filePathName) aniNode:setPosition(position) local start_Action = cc.CSLoader:createTimeline(filePathName) start_Action:setTimeSpeed(1.0) aniNode:runAction(start_Action) aniNode:runAction(cc.Sequence:create(cc.DelayTime:create(time), cc.CallFunc:create(function() aniNode:removeFromParent() end) )) start_Action:gotoFrameAndPlay(0, false) self:addChild(aniNode, 102) csbNode:removeFromParent() end ]] -- 迭代遍歷參考 -- ipairs 是從0 + 1 開始的 沒有數字下標是不會遍歷的 只要不是字符串作為鍵值 -- 如 --[[ local Snake = { ["UP"] = { }, ["DOWN"] = { }, ["LEFT"] = { }, ["RIGHT"] = { }, } 是不會進循環的 ]] --[[ local Snake = { [1] = { }, [2] = { }, [3] = { }, [4] = { }, } 會進循環的 ]] -- 但這種可以(嵌套) --[[ local iterationDistanceY_Space = { { Key = 6, Value = 480 }, { Key = 9, Value = 240 }, { Key = 12, Value = 170 } } for k, v in ipairs(iterationDistanceY_Space) do print("k " .. k) print(" " .. iterationDistanceY_Space[k].Key .. " " .. iterationDistanceY_Space[k].Value) print("== " .. iterationDistanceY_Space[k].Value) print(" " .. v.Key .. " " .. v.Value) end local iterationDistanceY_Space = { { Key = "6", Value = 480 }, { Key = "9", Value = 240 }, { Key = "12", Value = 170 } } for k, v in pairs(iterationDistanceY_Space) do print("k " .. k) print(" " .. iterationDistanceY_Space[k].Key .. " " .. iterationDistanceY_Space[k].Value) print("== " .. iterationDistanceY_Space[k].Value) print(" " .. v.Key .. " " .. v.Value) end ]] --[[ local tabFiles = { [3] = "test2", [6] = "test3", [4] = "test1" } for k, v in pairs(tabFiles) do print(k, v) print(tabFiles[k]) end local tabFiles2 = { [1] = "test2", [6] = "test3", [2] = "test1" } for k, v in ipairs(tabFiles2) do print(tabFiles2[k]) end print("========================================") local iterationDistanceY_Space = { { Key = 6, Value = 480 }, { Key = 9, Value = 240 }, { Key = 12, Value = 170 } } for k, v in ipairs(iterationDistanceY_Space) do print("k " .. k) print(" " .. iterationDistanceY_Space[k].Key .. " " .. iterationDistanceY_Space[k].Value) print("== " .. iterationDistanceY_Space[k].Value) print(" " .. v.Key .. " " .. v.Value) end ]] -- 無限選擇解決方案 --[[ Node:runAction(cc.RepeatForever:create(cc.RotateBy:create(1,30))) ]] -- 粒子 --[[ -- 每個粒子的生命 self.m_ParticleEffects:setLife(0.01) -- self.m_ParticleEffects:setLifeVar(1) ]] -- lua 數學函數解決方案 --[[ 函數名 描述 示例 結果 pi 圓周率 math.pi 3.1415926535898 abs 取絕對值 math.abs(-2012) 2012 ceil 向上取整 math.ceil(9.1) 10 floor 向下取整 math.floor(9.9) 9 max 取參數最大值 math.max(2,4,6,8) 8 min 取參數最小值 math.min(2,4,6,8) 2 pow 計算x的y次冪 math.pow(2,16) 65536 sqrt 開平方 math.sqrt(65536) 256 mod 取模 math.mod(65535,2) 1 modf 取整數和小數部分 math.modf(20.12) 20 0.12 randomseed 設隨機數種子 math.randomseed(os.time()) random 取隨機數 math.random(5,90) 5~90 rad 角度轉弧度 math.rad(180) 3.1415926535898 deg 弧度轉角度 math.deg(math.pi) 180 exp e的x次方 math.exp(4) 54.598150033144 log 計算x的自然對數 math.log(54.598150033144) 4 log10 計算10為底,x的對數 math.log10(1000) 3 frexp 將參數拆成x * (2 ^ y)的形式 math.frexp(160) 0.625 8 ldexp 計算x * (2 ^ y) math.ldexp(0.625,8) 160 sin 正弦 math.sin(math.rad(30)) 0.5 cos 余弦 math.cos(math.rad(60)) 0.5 tan 正切 math.tan(math.rad(45)) 1 asin 反正弦 math.deg(math.asin(0.5)) 30 acos 反余弦 math.deg(math.acos(0.5)) 60 atan 反正切 math.deg(math.atan(1)) 45 函數名 描述 示例 結果 pi 圓周率 math.pi 3.1415926535898 abs 取絕對值 math.abs(-2012) 2012 ceil 向上取整 math.ceil(9.1) 10 floor 向下取整 math.floor(9.9) 9 max 取參數最大值 math.max(2,4,6,8) 8 min 取參數最小值 math.min(2,4,6,8) 2 pow 計算x的y次冪 math.pow(2,16) 65536 sqrt 開平方 math.sqrt(65536) 256 mod 取模 math.mod(65535,2) 1 modf 取整數和小數部分 math.modf(20.12) 20 0.12 randomseed 設隨機數種子 math.randomseed(os.time()) random 取隨機數 math.random(5,90) 5~90 rad 角度轉弧度 math.rad(180) 3.1415926535898 deg 弧度轉角度 math.deg(math.pi) 180 exp e的x次方 math.exp(4) 54.598150033144 log 計算x的自然對數 math.log(54.598150033144) 4 log10 計算10為底,x的對數 math.log10(1000) 3 frexp 將參數拆成x * (2 ^ y)的形式 math.frexp(160) 0.625 8 ldexp 計算x * (2 ^ y) math.ldexp(0.625,8) 160 sin 正弦 math.sin(math.rad(30)) 0.5 cos 余弦 math.cos(math.rad(60)) 0.5 tan 正切 math.tan(math.rad(45)) 1 asin 反正弦 math.deg(math.asin(0.5)) 30 acos 反余弦 math.deg(math.acos(0.5)) 60 atan 反正切 math.deg(math.atan(1)) 45 ]] --lua 引用解決方案 --[[ self._recordList = clone(pData) ]] -- 不意味着跨平台 -- 返回程序所用CPU時間(以秒為單位)的近似值。 --[[ os.clock():獲取lua代碼運行時間 解釋:返回一個程序使用CPU時間的一個近似值。 -- 記錄開始時間 local starttime = os.clock(); --> os.clock()用法 print(string.format("start time : %.4f", starttime)); -- 進行耗時操作 local sum = 0; for i = 1, 100000000 do sum = sum + i; end -- 記錄結束時間 local endtime = os.clock(); --> os.clock()用法 print(string.format("end time : %.4f", endtime)); print(string.format("cost time : %.4f", endtime - starttime)); 結果: 總結: 從使用上來看這個函數很簡單,程序開始的時候調用一次,結束的時候調用一次,然后做差值就可以了。 我們結果上來看一下,為什么start time不是0呢,原因就是我第一次調用clock()的地方並不是程序的開始,之前還做了一些其他的操作,導致了這里有0.027s的誤差。 需要注意的是這個lua函數的實現是調用了c語言的函數函數庫,實現代碼如下: static int os_clock (lua_State *L) { lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC); return 1; } 其中有個CLOCKS_PER_SEC值,在不同平台有着不同的定義,所以一定要注意函數的溢出問題,程序運行時間太長的話,使用clock有可能就會返回負數。 還有很多討論是關於clock在不同平台的表現不同,在多線程會有影響等問題的,其實我也做了一些測試,有些結果和討論中的一致, 有些是相反的,這也許與平台相關吧,比如我舉一個例子, 在兩個clock調用之間加入Sleep(1000),那么Sleep的時間是算入clock的(Windows平台+VS2008), 但是很多帖子是說測試結果表明,Sleep這段時間不算入clock。 ]] -- clock 一些解決方案 --[[ os.clock() 返回程序使用的按秒計CPU時間的近似值。 那么就可以很愉快的搞定這個需求了: local test = {} function test:clickBtn() local curTime = os.clock() if test.recordTime and curTime - test.recordTime < 2 then print("2s cd中") return end -- do something test.recordTime = curTime end 本來以為這樣就OK了,萬萬沒想到,os.clock()居然偶爾會返回一個負數!所以就直接GG了!!! 網上搜了一下發現有不少人也都遇到過這個問題,返回負數的原因是Lua的os.clock()會調用C的clock函數,該函數返回值依賴於操作系統,在32為系統中會有溢出風險! 那么怎么解決這個問題呢?很簡單,用socket.gettime()或者os.time()來替換os.clock()獲取時間即可! local test = {} local socket = require("socket") function test:clickBtn() local curTime = socket.gettime() print(curTime) if test.recordTime and curTime - test.recordTime < 2 then print("2s cd中") return end -- do something test.recordTime = curTime end 對時間精度要求高就用socket.gettime(),對時間精度要求不高就用os.time()! --------------------- 作者:fightsyj 來源:CSDN 原文:https://blog.csdn.net/fightsyj/article/details/86258240 版權聲明:本文為博主原創文章,轉載請附上博文鏈接! ]] -- 動作解決方案 --[[ //// Action動作 // // CCMoveBy 創建一個移動的動作 參數1:移動到目標坐標所需的時間 參數2:目標坐標 支持reverse 可以獲取其反向動作 // CCMoveTo 一樣的 // CCActionInterval * moveBy = CCMoveBy::create(5,ccp(300, 100)); // CCActionInterval * actionmoveback= moveBy->reverse(); // sp->runAction(actionmoveback); // // CCScaleTo 作用:創建一個縮放的動作 // 參數1:達到縮放大小所需的時間 // 參數2 :縮放的比例 // CCActionInterval * scaleto = CCScaleTo ::create(2, 2); // sp->runAction(scaleto); // // CCScaleBy 作用:創建一個縮放的動作 // 參數1:達到縮放大小的所需時間 參數2:縮放比例 // CCActionInterval * scaleby = CCScaleBy::create(2, 2); // CCActionInterval * actionbyback = scaleby->reverse(); // sp->runAction(actionbyback); // // CCRotateTo // 作用創建一個旋轉的動作 // 參數1:旋轉的時間 參數2:旋轉餓角度 0 - 360 // CCActionInterval * rotateto = CCRotateTo::create(2, 90); // sp->runAction(rotateto); // // CCSkewTo // 作用創建一個傾斜的動作 // 參數1:傾斜到特定角度所需的時間 // 參數2:x軸的傾斜角度 // 參數3:y軸的傾斜角度 // CCActionInterval * skewto = CCSkewTo::create(2, 10, 10); // sp->runAction(skewto); // // CCJumpTo // 作用:創建一個跳的動作 // 參數1:跳到目標動作位子的所需時間 // 參數2:目標位置 // 參數3:跳的高度 // 參數4跳到目標位置的次數 // CCActionInterval* jumpto = CCJumpTo ::create(2, ccp(300, 200), 50, 4 ); // sp->runAction(jumpto); // // CCJumpBy // 作用:創建一個跳的動作 // 參數1:跳到目標動作位子的所需時間 // 參數2:目標位置 // 參數3:跳的高度 // 參數4跳到目標位置的次數 // 這個支持方向動作reverse // CCActionInterval * jumpby = CCJumpBy ::create(3, ccp(300, 200), 50, 4); // CCActionInterval * ac= jumpby->reverse(); // sp->runAction(ac); // CCBezier // ccBezierConfig結構體 // ccBezierConfig bezierCon; // bezierCon.controlPoint_1=CCPointMake(200, 150);//控制點1 // bezierCon.controlPoint_2=CCPointMake(200, 160);//控制點2 // bezierCon.endPosition =CCPointMake(340, 100);// 結束位置 // CCBezierTo // 創建一個貝塞爾曲線運動的動作 // 參數1:貝塞爾曲線運動的時間 // 參數2 :ccBezierConfig結構體 // CCActionInterval * action = CCBezierTo::create(2, bezierCon); // CCActionInterval * action = CCBezierBy::create(3, bezierCon);//支持反向 // CCActionInterval * action1 = action->reverse(); // sp->runAction(action1); // CCFadeIn // 作用:創建一個漸變出現的動作 // 參數是時間 // CCActionInterval * fadein = CCFadeIn::create(2); // sp->runAction(fadein); // CCFadeOut // 作用:創建一個漸變消失的動作 // 參數是時間 // CCActionInterval * fadeout = CCFadeOut::create(2); // sp->runAction(fadeout); // CCTintTo // 作用:創建一個色彩變化的消失動作 // 參數1:色彩變化的動作 // 參數2 :紅色分量 // 參數3:藍色分量 // CCActionInterval * tinto = CCTintTo ::create(3, 255, 255, 0); // sp->runAction(tinto); // CCTintBy // 作用:創建一個色彩變化的出現動作 // 參數1:色彩變化的動作 // 參數2 :紅色分量 // 參數3:藍色分量 但是家了reverse就是 反向的 // CCActionInterval * tintby = CCTintBy::create(3, 0, 255, 255); // CCActionInterval * tintby1 = tintby->reverse(); // sp->runAction(tintby1); // CCBlink // 作用 :創建一額閃爍的動作 // 參數1:閃爍完成的時間 // 參數2:閃爍的次數 // CCActionInterval * blink = CCBlink ::create(3, 10); // sp->runAction(blink); // CCDelayTime // 創建一個延遲的動作 // 參數 延遲的時間 // CCActionInterval * delaytime = CCDelayTime::create(3); // sp->runAction(delaytime); // CCOrbitCamera // 作用:創建一個球面坐標軌跡進行旋轉的動作 // 參數1 : 旋轉軌跡的時間 // 參數2 :起始半徑 // 參數3:半徑差 // 參數4:起始z角 // 參數5:旋轉z角的差 // 參數6:起始x角 // 參數7:旋轉x角的差 // CCActionInterval * orbitcamera = CCOrbitCamera::create(3, 10, 0, 45, 180, 90, 0); // sp->runAction(orbitcamera); // CCCardinalSpline // 作用:創建數組 點的數組 CCPointArray * array = CCPointArray::create(20); array->addControlPoint(ccp(0,0)); array->addControlPoint(ccp(210,0)); array->addControlPoint(ccp(210,240)); array->addControlPoint(ccp(0,160)); array->addControlPoint(ccp(0,0)); // CCCardinalSplineTo // 作用:創建一個樣條曲線軌跡的動作 // 參數1:完成軌跡所需的時間 // 參數2:控制點的坐標數組 // 擬合度 其值= 0 路徑最柔和 // CCActionInterval * CardinalSplineTo=CCCardinalSplineTo::create(3, array, 0); // sp->runAction(CardinalSplineTo); // CCCardinalSplineBy // 作用:創建一個樣條曲線軌跡的動作 // 參數1:完成軌跡所需的時間 // 參數2:控制點的坐標數組 // 擬合度 其值= 0 路徑最柔和 // CCActionInterval * CardinalSplineBy = CCCardinalSplineBy::create(3, array, 0); // sp->runAction(CardinalSplineBy); // CCCatmullRomTo CCCatmullRomBY // 作用:創建一個樣條插值軌跡 // 參數1:完成軌跡的時間 // 參數2:控制點的數組坐標 // CCActionInterval * catmullRomTo = CCCatmullRomTo::create(3, array); // sp->runAction(catmullRomTo); // CCFollow // 作用:創建一個跟隨動作 // 參數1:跟隨的目標對象 // 跟隨范圍,離開范圍就不再跟隨 //創建一個參照物spT // CCSprite * spt = CCSprite::create("Icon.png"); // spt->setPosition(ccp(420,40)); // addChild(spt); // sp->runAction(CCMoveTo::create(3, ccp(940,sp->getPositionY()))); // // CCFollow * follow = CCFollow::create(sp,CCRectMake(0, 0, 960, 320)); // this-> runAction(follow); // CCEaseBounceIn // 目標動作 // CCActionInterval* move = CCMoveTo::create(3, ccp(300, sp->getPositionY())); // 讓目標動作緩慢開始 // 參數:目標動作 // CCActionInterval * EaseBounceIn = CCEaseBounceIn::create(move); // sp->runAction(EaseBounceIn); // CCEaseBounceOut // 作用:讓目標動作賦予反彈力,且以目標動作結束位子開始反彈 // 參數目標動作 // CCActionInterval * easeBounceOut = CCEaseBounceOut ::create(move); // sp->runAction(easeBounceOut); // CCEaseBounceInOut // 作用:讓目標動作賦予反彈力,且以目標動作起始與結束位子開始反彈 // CCActionInterval * easeBounceInOut= CCEaseBounceInOut::create(move); // sp->runAction(easeBounceInOut); // CCEaseBackIn // 作用:讓目標動作賦予回力 , 且以目標動作起點位置作為回力點 // 參數:目標動作 // CCActionInterval * easeBackIn = CCEaseBackIn::create(move); // sp->runAction(easeBackIn); // CCEaseBackOut // 作用:讓目標動作賦予回力 , 且以目標動作終點位置作為回力點 // 參數:目標動作 // CCActionInterval *easeBackOut = CCEaseBackOut::create(move); // sp->runAction(easeBackOut); // CCEaseBackInOut // 作用:讓目標動作賦予回力 , 且以目標動作起點和終點位置作為回力點 // 參數:目標動作 // CCActionInterval * easeBackInOut = CCEaseBackInOut::create(move); // sp->runAction(easeBackInOut); // CCEaseElasticIn // 作用:讓目標動作賦予彈性 ,且以目標動作起點位子賦予彈性 // 參數:目標動作 // CCActionInterval * easeElasticIn= CCEaseElasticIn::create(move); // sp->runAction(easeElasticIn); // CCEaseElasticOut // 作用:讓目標動作賦予彈性 ,且以目標動作終點位子賦予彈性 // 參數:目標動作 // CCActionInterval *easeElasticOut = CCEaseElasticOut::create(move); // sp->runAction(easeElasticOut); // CCEaseElasticInOut // 作用:讓目標動作賦予彈性 ,且以目標動作起點和終點位子賦予彈性 // 參數:目標動作 // CCActionInterval *easeElasticInOut = CCEaseElasticOut::create(move); // sp->runAction(easeElasticInOut); // CCEaseExponentialIn // 讓目標動作緩慢開始 // 參數:目標動作 // CCActionInterval * easeExponentialIn= CCEaseExponentialIn::create(move); // sp->runAction(easeExponentialIn); // CCEaseExponentialOut // 讓目標動作緩慢中止 // 參數:目標動作 // CCActionInterval * easeExponentialIn= CCEaseExponentialOut::create(move); // sp->runAction(easeExponentialIn); // CCEaseExponentialInOut // 讓目標動作緩慢開始和中止 // 參數:目標動作 // CCActionInterval * easeExponentialInOut= CCEaseExponentialInOut::create(move); // sp->runAction(easeExponentialInOut); // CCEaseRateAction // 作用 : 讓目標動作設置速率 // 參數1:目標動作 // 參數2:速率 // CCActionInterval * move = CCMoveTo::create(5, ccp(300,sp->getPositionY())); // CCActionInterval * easeRateAction = CCEaseRateAction::create(move, 3); // sp->runAction(easeRateAction); // CCEaseSineIn // 作用:動作由慢到快 // 參數:目標動作 // CCActionInterval * easeSineIn = CCEaseSineIn::create(move); // sp->runAction(easeSineIn); // CCEaseSineOut // 作用:動作由快到慢 // 參數:目標動作 // CCActionInterval * easeSineOut = CCEaseSineOut::create(move); // sp->runAction(easeSineOut); // CCEaseSineInOut // 作用:動作由慢到快再快到慢 // 參數:目標動作 // CCActionInterval * easeSineInOut = CCEaseSineInOut::create(move); // sp->runAction(easeSineInOut); // CCSpeed // 作用:讓目標動作運行速度加倍 // 參數1:目標動作 // 參數2:倍速 // CCActionInterval * move = CCMoveTo::create(10, ccp(300,sp->getPositionY())); // CCSpeed * speed =CCSpeed::create(move, 100); // sp->runAction(speed); // CCSpawn // 作用:讓多個動作同時執行 // 參數:目標動作的可變參數 // CCActionInterval * move = CCMoveTo::create(10, ccp(300,sp->getPositionY())); // CCActionInterval * scale = CCScaleTo::create(2, 3); // CCActionInterval * rotate = CCRotateTo::create(4, 190); // CCFiniteTimeAction * spawn =CCSpawn::create(move,scale,rotate,NULL); // sp->runAction(spawn); // CCSequence // 作用:讓多個動作按照前后順序逐一執行 // 參數:目標動作的可變參數 // CCActionInterval * move = CCMoveTo::create(2, ccp(300, sp->getPositionY())); // CCActionInterval * scale = CCScaleTo::create(2, 3); // CCFiniteTimeAction * seq= CCSequence::create(move,scale,NULL); // sp->runAction(seq); // 擴展如果要對目標動作全部進行方向運動,可以使用如下形式操作 // CCFiniteTimeAction *seq=CCSequence::create(moveby,scaleby,...NULL); // CCFiniteTimeAction * reverseseq = CCSequence::create(seq,seq->reverse(),NULL) // 注意CCSequence中的所有動作都必須支持reverse函數,否則會出現異常 // CCActionInterval * move = CCMoveBy::create(2, ccp(300, sp->getPositionY())); // CCActionInterval * scale = CCScaleBy::create(2, 3); // CCFiniteTimeAction * seq= CCSequence::create(move,scale,NULL); // CCFiniteTimeAction * reveseseq = CCSequence::create(seq,seq->reverse(),NULL); // sp->runAction(reveseseq); // CCRepeat // 作用:對目標動作進行重復運動(目標動作可以是CCSequence ,CCSpawn) // 參數1:目標動作 // 參數2:重復次數 // CCActionInterval * move = CCMoveTo::create(2, ccp(300, sp->getPositionY())); // CCActionInterval * move2 = CCMoveTo::create(2, ccp(100,100)); // CCFiniteTimeAction*seq =CCSequence::create(move,move2,NULL); // CCFiniteTimeAction *repeat = CCRepeat::create(seq, 3); // sp->runAction(repeat); // CCRepeatForever // 作用:對目標動作進行永久性的重復運動(目標動作可以是CCSequence ,CCSpawn) // 參數:目標動作 // CCActionInterval * move = CCMoveTo::create(1, ccp(300, sp->getPositionY())); // CCActionInterval * move1 = CCMoveTo::create(1, ccp(100,100)); // CCFiniteTimeAction* seq = CCSequence::create(move,move1,NULL); // CCActionInterval * repeatForever =CCRepeatForever::create((CCActionInterval* )seq); // sp->runAction(repeatForever); // CCCallFunc // 作用:創建一個回調動作(調用不帶參數的回調方法); // 參數1:目標動作 // 參數2:目標回調函數 // CCActionInterval * move = CCMoveTo::create(1, ccp(300, sp->getPositionY())); // CCCallFunc * funcall= CCCallFunc::create(this, callfunc_selector(HelloWorld::callbackC)); // CCFiniteTimeAction * seq = CCSequence::create(move,funcall,NULL); // sp->runAction(seq); // CCCallFuncN // 作用:創建一個回調動作(調用 帶一個參數的回調方法); // 參數1:目標動作 // 參數2:目標回調函數 // CCActionInterval * move = CCMoveTo::create(1, ccp(300, sp->getPositionY())); // CCCallFuncN * funcall= CCCallFuncN::create(this, callfuncN_selector(HelloWorld::callbackN)); // CCFiniteTimeAction * seq = CCSequence::create(move,funcall,NULL); // sp->runAction(seq); // CCCallFuncND // 作用:創建一個回調動作(調用 帶兩個參數的回調方法); // 參數1:目標動作 // 參數2:目標回調函數 CCActionInterval * move = CCMoveTo::create(1, ccp(300, sp->getPositionY())); CCCallFuncND * funcall= CCCallFuncND::create(this, callfuncND_selector(HelloWorld::callbackND) ,(void*)0xbebabeba); CCFiniteTimeAction * seq = CCSequence::create(move,funcall,NULL); sp->runAction(seq); return true; } void HelloWorld::callbackC() { CCLOG("callbackC"); } void HelloWorld::callbackN(CCNode* sender) { CCLOG("callbackN"); } void HelloWorld::callbackND(CCNode* sender, void* data) { CCLOG("callbackND"); } ]] -- 平台判定解決方案 --[[ device.platform == "windows" or device.platform == "android" ]] -- 獲取當前運行場景解決方案 --[[ --local scene = cc.Director:getInstance():getRunningScene() self:runAction(cc.Sequence:create(cc.DelayTime:create(5),cc.CallFunc:create(function() local scene = cc.Director:getInstance():getRunningScene() if(scene)then local S = cc.Sprite:create("ParticleSystem/guangdian.png") S:setScale(5.0) S:setPosition(display.center) scene:addChild(S) end end))) ]] -- 獲取當前程序運行路徑解決方案 --[[ print("cc.FileUtils:getInstance():getWritablePath() "..cc.FileUtils:getInstance():getWritablePath()) ]] -- 觀察者解決方案 -- EventListenerCustom 解決方案1 -- eventDispatcher:removeEventListener(listener) --[[ local eventDispatcher = cc.Director:getInstance():getEventDispatcher() local scene = cc.Director:getInstance():getRunningScene() if (scene) then local S = cc.Sprite:create("ParticleSystem/guangdian.png") S:setScale(5.0) S:setPosition(display.center) scene:addChild(S) end self.BetTimeEndSystemListener = cc.EventListenerCustom:create("BetTimeEndSystem", function() local tmpAction = cc.Spawn:create(cc.MoveTo:create(0.15, cc.p(1145, 644)), cc.ScaleTo:create(0.15, 0.3, 0.3, 0.3)) S:runAction(cc.Sequence:create(tmpAction, cc.CallFunc:create( function() self:removeFromParent(true) end ))) if self.BetTimeEndSystemListener then eventDispatcher:removeEventListener(self.BetTimeEndSystemListener) end end ) eventDispatcher:addEventListenerWithFixedPriority(self.BetTimeEndSystemListener, 1) ]] -- 觀察者解決方案 -- EventListenerCustom 解決方案2 -- eventDispatcher:removeEventListener(listener) --[[ local function serverTimeChangedCallback(event) print("data:"..event.data) end local listener = cc.EventListenerCustom:create("serverTimeChanged",serverTimeChangedCallback) local eventDispatcher = self:getEventDispatcher() eventDispatcher:addEventListenerWithFixedPriority(listener, 1) local event = cc.EventCustom:new("serverTimeChanged") event.data = "serverTimeChanged!" eventDispatcher:dispatchEvent(event) event = cc.EventCustom:new("serverTimeChanged") event.data = "server!" eventDispatcher:dispatchEvent(event) ]] -- 觀察者解決方案 -- EventListenerCustom 解決方案3 -- eventDispatcher:removeEventListener(listener) --[[ local function EventListenerCustomCallBack(event) print("data: "..event.data) end local eventDispatcher = cc.Director:getInstance():getEventDispatcher() local listener = cc.EventListenerCustom:create("EventListenerCustom",EventListenerCustomCallBack) eventDispatcher:addEventListenerWithFixedPriority(listener,1) --要和EventListenerCustom 名字一樣 local event = cc.EventCustom:new("EventListenerCustom") event.data = "Hello World" eventDispatcher:dispatchEvent(event) event = cc.EventCustom:new("EventListenerCustom") event.data = "Hello World!" eventDispatcher:dispatchEvent(event) ]] -- 觀察者解決方案 -- EventListenerCustom 解決方案4 -- eventDispatcher:removeEventListener(listener) --[[ local function serverTimeChangedCallback(event) print("serverTimeChanged serverTimeChanged ") print("event "..event.data) end local listener = cc.EventListenerCustom:create("serverTimeChanged", serverTimeChangedCallback) local eventDispatcher = cc.Director:getInstance():getEventDispatcher() eventDispatcher:addEventListenerWithFixedPriority(listener, 1) local event = cc.EventCustom:new("serverTimeChanged") event.data = "Hello World" eventDispatcher:dispatchEvent(event) ----------------------- --作者:themagickeyjianan --來源:CSDN --原文:https://blog.csdn.net/themagickeyjianan/article/details/51841652 --版權聲明:本文為博主原創文章,轉載請附上博文鏈接! ]] -- ANY 解決方案 --[[ -- -- 游戲列表創建圖標 -- local listView = ccui.ListView:create() -- -- 設置方向為h橫向方向 -- listView:setDirection(2) -- -- 觸摸反彈 -- listView:setBounceEnabled(true) -- listView:setTouchEnabled(true) -- -- 滑動慣性 -- listView:setContentSize(750, 80) -- listView:setPosition(cc.p(0, display.height - 110 - 80)) -- self._btnlayerOut = ccui.Layout:create() -- self._btnlayerOut:setContentSize(1176, 80) -- listView:pushBackCustomItem(self._btnlayerOut) -- -- self._listView:jumpToRight() -- listView:setScrollBarEnabled(false) -- self:addChild(listView) -- local btcallback = function(ref, type) -- if type == ccui.TouchEventType.ended then -- self:onButtonClickedEvent(ref:getTag(), ref) -- end -- end -- local edlistener = function(sender, eventType) -- self:onEditEvent(sender, eventType) -- end -- local btnPos = { } -- local startY = display.height - 110 - 40 -- local distanceY = 80 -- btnPos = { 84, 252, 404, 572, 740, 908, 1072 } -- -- 游戲列表創建圖標 -- -- local btnPos = {} -- -- local startY = display.height - 110 - 40 -- -- local distanceY = 80 -- -- btnPos[1] = {display.width * 0.5} -- -- btnPos[2] = {display.width * 0.5 - 84,display.width * 0.5 + 84} -- -- btnPos[3] = {display.width * 0.5 - 168,display.width * 0.5,display.width * 0.5 + 168} -- -- btnPos[4] = {display.width * 0.5 - 252,display.width * 0.5 - 84,display.width * 0.5 + 84,display.width * 0.5 + 252} -- local rows = math.ceil(#self._gameList / 7) -- local lastCount = #self._gameList -(rows - 1) * 7 -- for i = 1, #self._gameList do -- local curRow = math.ceil(i / 7) -- local btnPath_1 = string.format("Privatemode/btn_game_%d_1.png", tonumber(self._gameList[i]._KindID)) -- local btnPath_2 = string.format("Privatemode/btn_game_%d_2.png", tonumber(self._gameList[i]._KindID)) -- local checkbox = ccui.CheckBox:create(btnPath_1, "", btnPath_2, "", "") -- checkbox:setPosition(btnPos[i], 40) -- checkbox:setTag(BTN_GAME_START + i) -- checkbox:addEventListener(cbtlistener) -- self._btnlayerOut:addChild(checkbox) -- -- 最后一排坐標修正 -- -- if curRow == rows and lastCount ~= 0 then -- -- checkbox:setPosition(btnPos[lastCount][(i - 1) % 4 + 1],startY - (curRow - 1) * distanceY) -- -- end -- if i == self._select then -- checkbox:setSelected(true) -- else -- checkbox:setSelected(false) -- end -- end cc.LabelAtlas:create(i,"Number/num_join_room.png",28,38,string.byte("0")) :setAnchorPoint(0.5,0.5) :setPosition(btn:getContentSize().width * 0.5 ,btn:getContentSize().height * 0.5) :addTo(btn) ]] -- 9宮格解決方案 --[[ local bg = ccui.Scale9Sprite:create("bg_common_1.png") bg:setScale9Enabled(true) bg:setPosition(display.center) bg:setContentSize(bg:getContentSize().width, 1024) self:addChild(bg) ]] -- 窗口解決方案 --[[ -- 背景圖 local bg = ccui.Scale9Sprite:create("bg_common_1.png") bg:setScale9Enabled(true) bg:setPosition(display.center) bg:setContentSize(bg:getContentSize().width, 1024) self:addChild(bg) --標題 display.newSprite("Title/title_join_club.png") :setPosition(bg:getPositionX(),display.height * 0.5 + bg:getContentSize().height * 0.5 - 42) :addTo(self) --關閉按鈕 local btn = ccui.Button:create("Button/btn_close.png","Button/btn_close.png") btn:setPosition(bg:getPositionX() + bg:getContentSize().width * 0.5 - 40,display.height * 0.5 + bg:getContentSize().height * 0.5 - 40) btn:setTag(BTN_CLOSE) btn:addTouchEventListener(btcallback) self:addChild(btn) ]] -- 單選框解決方案 --[[ --1 2 local presenter = ccui.CheckBox:create("Privatemode/check_box_1.png", "Privatemode/check_box_2.png") presenter:setPosition(cc.p(appdf.WIDTH * 0.5 + position_x[i], appdf.HEIGHT * 0.5 + position_y[i])) presenter:setTag(TAG_INTEGRAL_START + i) presenter:addEventListener(cbtlistener) self.layer:addChild(presenter) ]] -- 顏色層創建解決方案 --[[ local layer = cc.LayerColor:create(cc.c4b(100, 100, 100, 100)) layer:setAnchorPoint(0, 0) layer:setContentSize(viewWidth, viewHeight) layer:setPosition(viewposX, viewposY) layer:setVisible(false) self:addChild(layer) ]] -- 按鈕解決方案 --[[ --關閉按鈕 local btn = ccui.Button:create("Button/btn_close.png","Button/btn_close.png") btn:setPosition(bg:getPositionX() + bg:getContentSize().width * 0.5 - 40,display.height * 0.5 + bg:getContentSize().height * 0.5 - 40) btn:addClickEventListener(function(sender) layer:removeChild(sender) end) layer:addChild(btn) ]] --測試解決方案 --[[ display.newLayer(cc.c4b(100,100,100)) :setContentSize(viewWidth, viewHeight) :addTo(bg) :setPosition(0,cellHeight + 20) ]] -- tableView 測試解決方案 -----//////////////////////////////////////////////////////////////////// lua Project --[[ local RetroSnaker = class("RetroSnaker", function() return cc.Layer:create(); end ) local Obj = require("cocos.Packaging_Kernel") local KEY_UP = 28 local KEY_DOWN = 29 local KEY_LEFT = 26 local KEY_RIGHT = 27 local Snake = { ["UP"] = { }, ["DOWN"] = { }, ["LEFT"] = { }, ["RIGHT"] = { } } local SnakePoint = { } local struct = { } struct.SnakePosition = { } function struct.COOR() local Coor = { } Coor = cc.p(0, 0); return Coor end function struct.SnakeDirName() local SnakeDir = { UP = "UP", DOWN = "DOWN", LEFT = "LEFT", RIGHT = "RIGHT" } return SnakeDir; end function struct.SnakeDirCode() local SnakeDirCode = { UP = 28, DOWN = 29, LEFT = 26, RIGHT = 27 } return SnakeDirCode; end function struct.FOOD() local Food = { } Food.COOR = struct.COOR() Food.Flag = 0; return Food; end function struct.SNAKE() struct.Len = 30; struct.MaxLen = 100; struct.Dir = struct.SnakeDirCode().RIGHT for i = 0, struct.MaxLen - 1 do struct.SnakePosition[i + 1] = { } struct.SnakePosition[i + 1] = struct.COOR() end return struct; end function struct.SetSnakePosition(Position) struct.SnakePosition[0] = Position; end local Switch = { } Switch.Value = { } function Switch.switch(Value) Switch.Value = Value; end function Switch.case(Value, Function) if (Switch.Value == Value) then Function() end end local if_s = { } if_s.bool = { } function if_s.ifs(bool) if_s.bool = bool return bool end function if_s.elseifs(bool) if_s.bool = bool return bool end function if_s.Call(Function) if (if_s.bool == true) then Function() end end function if_s.elses(Function) if (if_s.bool == false) then Function() end end function RetroSnaker:ctor() -- AudioEngine.playMusic(cc.FileUtils:getInstance():fullPathForFilename("RetroSnaker/BackgroundMusic.mp3"), true); self:InitData() end function RetroSnaker:InitData() self:CreateKeyEvent() -- self:CreateFrameCall() self:CreateTimeFrameCall(0.2) Snake["UP"] = cc.Sprite:create("RetroSnaker/SnakeUp.png") Snake["UP"]:setPosition(display.center) self:addChild(Snake["UP"]) Snake["DOWN"] = cc.Sprite:create("RetroSnaker/SnakeDown.png") Snake["DOWN"]:setPosition(display.center) self:addChild(Snake["DOWN"]) Snake["LEFT"] = cc.Sprite:create("RetroSnaker/SnakeLeft.png") Snake["LEFT"]:setPosition(display.center) self:addChild(Snake["LEFT"]) Snake["RIGHT"] = cc.Sprite:create("RetroSnaker/SnakeRight.png") Snake["RIGHT"]:setPosition(display.center) self:addChild(Snake["RIGHT"]) for Key, Value in pairs(Snake) do print("call") print(Key) Value:setVisible(false) end Snake["RIGHT"]:setVisible(true) self.CurSnakeHead = Snake["RIGHT"] self.CurSnakeHead:setTag(struct.SnakeDirCode().RIGHT) struct.SNAKE(); for i = 0, struct.Len - 1 do struct.SnakePosition[i + 1] = cc.p(display.cx - i * 50,display.cy) end end function RetroSnaker:SnakeRefresh() local i = struct.Len; while(i > 1)do struct.SnakePosition[i].x = struct.SnakePosition[i - 1].x; struct.SnakePosition[i].y = struct.SnakePosition[i - 1].y; i = i - 1 end end function RetroSnaker:SnakeBody() local i = struct.Len; while(i > 1)do if(self:getChildByName("SnakeBody"..i) == nil)then local SnakeBody = cc.Sprite:create("RetroSnaker/SnakeBody.png") --防止與蛇頭的Tag的沖突 SnakeBody:setName("SnakeBody"..i) SnakeBody:setPosition(struct.SnakePosition[i].x,struct.SnakePosition[i].y) self:addChild(SnakeBody) else self:getChildByName("SnakeBody"..i):setPosition(struct.SnakePosition[i].x,struct.SnakePosition[i].y) end i = i - 1 end end function RetroSnaker:SnakeMove() print("SnakeMove") self:SnakeRefresh() --上面這個函數雖然設置了坐標,但蛇頭的坐標未改變 Switch.switch(struct.Dir) Switch.case(struct.SnakeDirCode().UP, function() struct.SnakePosition[1].y = struct.SnakePosition[1].y + 50; if (self.CurSnakeHead:getTag() ~= struct.SnakeDirCode().UP) then self.CurSnakeHead:setVisible(false) self.CurSnakeHead = Snake["UP"] self.CurSnakeHead:setVisible(true) self.CurSnakeHead:setTag(struct.SnakeDirCode().UP) end self.CurSnakeHead:setPosition(struct.SnakePosition[1]) end ) Switch.case(struct.SnakeDirCode().DOWN, function() struct.SnakePosition[1].y = struct.SnakePosition[1].y - 50; if (self.CurSnakeHead:getTag() ~= struct.SnakeDirCode().DOWN) then self.CurSnakeHead:setVisible(false) self.CurSnakeHead = Snake["DOWN"] self.CurSnakeHead:setVisible(true) self.CurSnakeHead:setTag(struct.SnakeDirCode().DOWN) end self.CurSnakeHead:setPosition(struct.SnakePosition[1]) end ) Switch.case(struct.SnakeDirCode().LEFT, function() struct.SnakePosition[1].x = struct.SnakePosition[1].x - 50; if (self.CurSnakeHead:getTag() ~= struct.SnakeDirCode().LEFT) then self.CurSnakeHead:setVisible(false) self.CurSnakeHead = Snake["LEFT"] self.CurSnakeHead:setVisible(true) self.CurSnakeHead:setTag(struct.SnakeDirCode().LEFT) end self.CurSnakeHead:setPosition(struct.SnakePosition[1]) end ) Switch.case(struct.SnakeDirCode().RIGHT, function() struct.SnakePosition[1].x = struct.SnakePosition[1].x + 50; if (self.CurSnakeHead:getTag() ~= struct.SnakeDirCode().RIGHT) then self.CurSnakeHead:setVisible(false) self.CurSnakeHead = Snake["RIGHT"] self.CurSnakeHead:setVisible(true) self.CurSnakeHead:setTag(struct.SnakeDirCode().RIGHT) end self.CurSnakeHead:setPosition(struct.SnakePosition[1]) end ) --頭先移動再試身體移動 self:SnakeBody() end function RetroSnaker:Updata(interval) print(interval) print("Update Call") end function RetroSnaker:UpdateTimer(Time) print(Time) print("UpdateTimer Call") print("Snake Dir " .. struct.Dir) self:SnakeMove() end -- 按下 function RetroSnaker:OnKeyPressed(KeyCode, Event) print(" OnKeyPressed " .. KeyCode) end -- 抬起 function RetroSnaker:OnKeyReleased(KeyCode, Event) print(" OnKeyReleased " .. KeyCode) Switch.switch(KeyCode) Switch.case(struct.SnakeDirCode().UP, function() print("UP") struct.Dir = struct.SnakeDirCode().UP; end ) Switch.case(struct.SnakeDirCode().DOWN, function() print("DOWN") struct.Dir = struct.SnakeDirCode().DOWN; end ) Switch.case(struct.SnakeDirCode().LEFT, function() print("LEFT") struct.Dir = struct.SnakeDirCode().LEFT; end ) Switch.case(struct.SnakeDirCode().RIGHT, function() print("RIGHT") struct.Dir = struct.SnakeDirCode().RIGHT; end ) end function RetroSnaker:CreateFrameCall() -- 每一幀調用 local function handler(interval) self:Updata(interval); end self:scheduleUpdateWithPriorityLua(handler, 0); end function RetroSnaker:CreateTimeFrameCall(Second) local scheduler = cc.Director:getInstance():getScheduler() -- 根據設置每幾秒調用這個函數 local function onTimerCallback(dt) self:UpdateTimer(dt) end self.schedulerID = scheduler:scheduleScriptFunc( function(dt) onTimerCallback(dt) end , Second, false) end function RetroSnaker:CreateKeyEvent() local function OnKeyPressed(KeyCode, Event) self:OnKeyPressed(KeyCode, Event) end local function OnKeyReleased(KeyCode, Event) self:OnKeyReleased(KeyCode, Event) end local Listener = cc.EventListenerKeyboard:create(); Listener:registerScriptHandler(OnKeyPressed, cc.Handler.EVENT_KEYBOARD_PRESSED); Listener:registerScriptHandler(OnKeyReleased, cc.Handler.EVENT_KEYBOARD_RELEASED); cc.Director:getInstance():getEventDispatcher():addEventListenerWithSceneGraphPriority(Listener, self); end return RetroSnaker; ]] -- Gobang --[[ 橫向:兩邊同時索引,索引到相同的var++,如果var == 4則win,不超過4,var = 0,再右邊或者左邊進行索引, if(var == 4) { win; } { int Map[10][10] = { 0 }; int X = 0; int Y = 0; int WinState = 0; for (int i = 0; i < 2; i++) { if (Map[Y][X + i + 1] == 666) { WinState++; } if(Map[Y][X - i - 1] == 666) { WinState++; } } if (WinState == 4) { // return;贏 } else { WinState = 0; //左邊 for (int i = 0; i < 5; i++) { if (Map[Y][X - i - 1] == 666) { WinState++; } } if (WinState == 4) { //return;贏 } else//左邊不行右邊 { //右邊 for (int i = 0; i < 5; i++) { if (Map[Y][X + i + 1] == 666) { WinState++; } } if (WinState == 4) { //return;贏 } } } } ]]
