--[[
贪吃蛇
]] local RetroSnaker = class("RetroSnaker", function()
return cc.Layer:create();
end )
local Obj = require("cocos.Packaging_Kernel") local KEY_UP =
local KEY_DOWN =
local KEY_LEFT =
local KEY_RIGHT = local Snake =
{
["UP"] = { },
["DOWN"] = { },
["LEFT"] = { },
["RIGHT"] = { }
}
local SnakePoint = { } local struct = { }
struct.SnakePosition = { } function struct.COOR()
local Coor = { }
Coor = cc.p(, );
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 = ,
DOWN = ,
LEFT = ,
RIGHT =
}
return SnakeDirCode;
end
function struct.FOOD()
local Food = { }
Food.COOR = struct.COOR()
Food.Flag = ;
return Food;
end
function struct.SNAKE()
struct.Len = ;
struct.MaxLen = ;
struct.Dir = struct.SnakeDirCode().RIGHT
for i = , struct.MaxLen - do
struct.SnakePosition[i + ] = { }
struct.SnakePosition[i + ] = struct.COOR()
end
return struct;
end
function struct.SetSnakePosition(Position)
struct.SnakePosition[] = 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 = , struct.Len - do
struct.SnakePosition[i + ] = cc.p(display.cx - i * ,display.cy)
end end function RetroSnaker:SnakeRefresh()
local i = struct.Len;
while(i > )do
struct.SnakePosition[i].x = struct.SnakePosition[i - ].x;
struct.SnakePosition[i].y = struct.SnakePosition[i - ].y;
i = i -
end
end
function RetroSnaker:SnakeBody()
local i = struct.Len;
while(i > )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 -
end
end function RetroSnaker:SnakeMove()
print("SnakeMove")
self:SnakeRefresh()
--上面这个函数虽然设置了坐标,但蛇头的坐标未改变
Switch.switch(struct.Dir)
Switch.case(struct.SnakeDirCode().UP,
function()
struct.SnakePosition[].y = struct.SnakePosition[].y + ;
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[])
end )
Switch.case(struct.SnakeDirCode().DOWN,
function()
struct.SnakePosition[].y = struct.SnakePosition[].y - ;
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[])
end )
Switch.case(struct.SnakeDirCode().LEFT,
function()
struct.SnakePosition[].x = struct.SnakePosition[].x - ;
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[])
end )
Switch.case(struct.SnakeDirCode().RIGHT,
function()
struct.SnakePosition[].x = struct.SnakePosition[].x + ;
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[])
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, );
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;

cocos2D-X LUA 非常简单的一个贪吃蛇案例的更多相关文章

  1. 一个简单的c# 贪吃蛇程序

    一个简单的c#贪吃蛇程序 程序分为界面设计和程序设计:界面设计和程序设计均参考了一些游戏实例,但是所有代码内容是本人编写. 由于看到别人写的程序并没有署名,这里的署名全部都是csdn官网. 游戏界面设 ...

  2. 使用TypeScript实现简单的HTML5贪吃蛇游戏

    TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架构师,已 ...

  3. 用Python写一个贪吃蛇

    最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间找不到别的,就先做个贪吃蛇来练练简单的语法. 由于Python监听键盘很麻烦,没有C语言的kbhit(),所以这 ...

  4. 一步一步用Canvas写一个贪吃蛇

    之前在慕课网看了几集Canvas的视频,一直想着写点东西练练手.感觉贪吃蛇算是比较简单的了,当年大学的时候还写过C语言字符版的,没想到还是遇到了很多问题. 最终效果如下(图太大的话 时间太长 录制gi ...

  5. 如何用Python写一个贪吃蛇AI

    前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...

  6. 【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载)

    C++编写贪吃蛇小游戏快速入门 刚学完C++.一时兴起,就花几天时间手动做了个贪吃蛇,后来觉得不过瘾,于是又加入了AI功能.希望大家Enjoy It. 效果图示 AI模式演示 imageimage 整 ...

  7. html5面向对象做一个贪吃蛇小游戏

    canvas加面向对象方式的贪吃蛇 2016-08-25 这个小游戏可以增加对面向对象的理解,可以加强js逻辑能力,总之认真自己敲一两遍收获还是不少啊!!适合刚学canvas的同学练习!! 废话不多说 ...

  8. 使用Python写一个贪吃蛇

    参考代码http://blog.csdn.net/leepwang/article/details/7640880 我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的 ...

  9. pygame试水,写一个贪吃蛇

    最近学完python基础知识,就想着做一个游戏玩玩,于是就在https://www.pygame.org/docs/学着做了个贪吃蛇游戏. 首先要导入模块. import pygame import ...

随机推荐

  1. Front Page

    General Team FST stay night from ShanDong University 19 - 20 CCPC QinHuangDao Gold (4 th) IUPC YinCh ...

  2. 第九篇 数据表设计和保存item到json文件

    上节说到Pipeline会拦截item,根据设置的优先级,item会依次经过这些Pipeline,所以可以通过Pipeline来保存文件到json.数据库等等. 下面是自定义json #存储item到 ...

  3. 基于nginx结合openssl实现https

    [root@localhost ~]#systemctl stop firewalld[root@localhost ~]#setenforce 0[root@localhost ~]#iptable ...

  4. 笔记55 Mybatis快速入门(六)

    相关概念介绍(一) 1.日志 有时候需要打印日志,知道mybatis执行了什么样的SQL语句,以便进行调试.这时,就需要开启日志,而mybatis自身是没有带日志的,使用的都是第三方日志,这里介绍如何 ...

  5. net core静态文件 访问除默认目录文件配置

    在我们项目的实际应用中,不光是需要访问默认静态文件夹 wwwroot ,还有可能要要去访问除默认目录以外的文件夹,接下来我们进行配置 1.在根目录创建一个文件夹,继续创建它的子文件夹Images,在I ...

  6. 【JZOJ6411】上网

    description analysis 如果把所有大小关系连成边,小的往大的连,就可以直接上拓扑 暴力连边时间复杂度\(O(n^2)\),然而连边的过程,考虑用线段树优化 线段树上的所有儿子节点向父 ...

  7. web前端开发2018年12月找工作总结

    2018年的冬天额外的冷,由内致外... 作为一名刚刚踏入社会的实习生,可谓是狠狠的体验了一把什么叫社会(同时也感叹父母赚钱真的很不容易) 前几天看见这样一句话"如果你不知道社会的辛苦,要么 ...

  8. Core Data could not fulfill a fault

    做项目的时候在iOS4系统遇到过这样一个crash,console显示的错误信息是"Core Data could not fulfill a fault". 字面意思是什么?&q ...

  9. 如何用DOS命令查看占用某端口的程序及PID号

    果学过JSP编程的朋友可以会发现,若用Eclipse运行JSP文件时常常会弹出某某端口正在使用,从而导致代码无法运行.如何查找出特定端口的使用情况以及对应的程序呢,针对该问题,本文介绍利用DOS命令查 ...

  10. Perl 数组应用详解(push, pop, shift, unshift)

    Perl的数组操作有四大常用函数: push:从数组的末尾加入元素.pop :从数组的末尾取出元素 shift: 从数组的开头取出元素unshift:从数组的开头加入元素 1.push #!/usr/ ...