zoukankan      html  css  js  c++  java
  • cocos2D-X LUA 非常简单的一个贪吃蛇案例

    --[[
        贪吃蛇
    ]]
    
    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;
  • 相关阅读:
    在Ubuntu 桌面版 12.04 LTS安装并运行SSH
    将Tp-link无线路由器桥接到Dlink无线路由器上
    如何解决Win7将任务栏程序自动分组的困扰
    安装Ubuntu 桌面版 12.04 LTS 过程之记录
    #lspci | grep Eth
    做技术不能人云亦云
    如何使用FF的Firebug组件中的net工具查看页面元素加载消耗时间
    在Fedora8上安装使用ActiveMQ5.8
    多态继承中的内存图解 && 多态中的对象变化的内存图解
    孔子装爹案例_帮助理解多态的成员访问特点及转型
  • 原文地址:https://www.cnblogs.com/YZFHKMS-X/p/11794239.html
Copyright © 2011-2022 走看看