cocos2D-X LUA 常用功能封裝和工作經驗的一些解決方案


--[[
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;贏
            }
        }
    }
}

]]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM