Love2D游戏引擎制作贪吃蛇游戏
内附有linux下的makefile,windows下的生成方法请查看:
预览游戏
love2d游戏引擎重要函数
详情:
-
love.load:当游戏开始时被调用且仅调用一次
-
love.draw:回调函数,每帧更新一次游戏画面
-
love.update:回调函数,每帧更新一次游戏状态
-
love.keypressed:回调函数,当有按键被按下时触发
-
love.filesystem.load:加载一个lua脚本文件但不执行
!其他的函数在用到时再做解释
版本区别以及初始化资源
!首先要注意的是,本次使用的游戏引擎时love 0.9版本,与最新的love 11.x版本稍有区别。在0.9版本中颜色使用0~255来表示,而在11.x版本中是0~1来表示。
因为需要制作的游戏非常小,所以我们将所用到的资源在第一时间将其初始化并加载到内存中,以便使用。使用到的资源主要有:
-
字体
-
颜色
-
声音
-
窗口大小与块大小
-
标题
-
边框
所用到的函数:
-
love.window.setMode:设置窗口大小,以及样式
-
love.window.setTitle:设置标题
-
love.graphics.newFont:加载字体文件,大小自定义,返回Font类型
-
love.audio.newSource:加载音效文件
代码如下:
function love.load ()
-- 块大小,窗口宽高,标题
cellSize = 20
width = 20 * 40
height = 20 * 25
title = 'SNAKE !'
-- 设置窗口大小和标题
love.window.setMode (width, height)
love.window.setTitle (title)
-- 加载不同大小字体
fonts = {
pixies100 = love.graphics.newFont ('Fonts/Pixies.TTF', 100),
pixies30 = love.graphics.newFont ('Fonts/Pixies.TTF', 30),
pixies10 = love.graphics.newFont ('Fonts/Pixies.TTF', 10)
}
-- 加载音效资源
sounds = {
showMenu = love.audio.newSource ('Sounds/showMenu.wav', 'stream'),
switchOption = love.audio.newSource ('Sounds/switchOption.wav', 'stream'),
eatFood = love.audio.newSource ('Sounds/eatFood.wav', 'stream'),
collided = love.audio.newSource ('Sounds/collided.wav', 'stream'),
gameOver = love.audio.newSource ('Sounds/gameOver.wav', 'stream')
}
-- 边框数据
border = {
1, 1,
width-1, 1,
width-1, height-1,
1, height-1,
1, 1
}
-- 颜色数据
colors = {
darkGray = { 0.3, 0.3, 0.3, 1 },
beiga = { 0.98, 0.91, 0.76, 1 },
white = { 1, 1, 1, 1 },
paleTurquoise = { 0.7, 1, 1, 1 },
}
SwitchScence ('Menu')
end
场景与其切换
!首先我们需要实现一个简单的场景切换函数,因为一个游戏总是有多个场景
- 先将love2d引擎的主要回调函数赋值nil以免之后出现错误
- 加载新场景的lua脚本
- 执行新场景的lua脚本
代码如下:
function SwitchScence (scence)
-- 将重要的函数赋予空值,以免冲突
love.update = nil
love.draw = nil
love.keypressed = nil
-- 将需要的场景加载进来,并执行load函数
love.filesystem.load ('Scences/'..scence..'.lua') ()
love.load ()
end
-- 切换到初始化场景
SwitchScence ('Init')
绘制开始界面
在这里我们需要认识一些绘图函数:
-
love.graphics.setFont:设置当期字体
-
love.graphics.setColor:设置当前颜色
-
love.graphics.rectangle:绘制矩形
-
love.graphics.line:绘制直线
-
love.graphics.print:在窗口上输出
!绘制比较简单,其他详情都在代码里有详细注释,要注意的是我绘制选项的方法。options的有效长度并不是#options,而是options.count记录的选项数量
代码如下:
-- 游戏标题,以及绘制位置
local gameName = {
text = title,
textX