--[[
贪吃蛇
]]
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;