Pong
环境
Lua
- 全局变量与
local - 字符串拼接
.. tostring把值转成字符串- 单行注释与多行注释
- 真假值:只有
nil和false为假 - table:数组、字典、混合
- 数组下标从 1 开始,长度用
# ipairs与pairs- 函数、匿名函数、多返回值
if/elseif/then/endfor、while、repeatand/or模拟三元require与模块- 全局模块写法与返回表写法
LÖVE 基础
- 游戏循环:输入 → 更新 → 渲染
love.load、love.update、love.drawlove.keypressed与love.keyboard.isDown- 2D 坐标系:原点左上、Y 向下
love.window.setMode与 vsynclove.window.setTitle设窗口标题love.graphics.rectangle的fill/linelove.graphics.clear与 RGBAsetColor是绘制色,不是清屏色love.graphics.print不给宽度- 字体:
newFont与setFont love.timer.getFPS打印帧率love.event.quit退出游戏
虚拟分辨率与滤镜
- push 库
- 虚拟分辨率
push.setupScreen/push.start/push.finishupscale:normal、pixel-perfect、stretchedlove.resize转发- 最近邻与线性过滤
setDefaultFilter(min, mag)- 滤镜必须在建资源之前设
- 非整数倍缩放的不均匀
- 鼠标坐标转换
移动与 Delta Time
dt是距上一帧的秒数- 速度乘
dt才能跨帧率一致 love.keyboard.isDown连续检测- 边界钳制:
math.max/math.min - 球的
dx/dy love.math.random与种子- 随机数的范围
面向对象
- Class 库(hump)
init构造函数与self- 字段与方法
- 冒号语法糖
obj:method()
碰撞检测
- AABB:轴对齐包围盒
- X 轴与 Y 轴的间隙判断
- 碰撞后反向
dx - 每次碰撞乘
1.03加速 - 球推出矩形的位置修正
- 墙壁碰撞反向
dy - 碰撞盒的
line模式绘制 - 碰撞后随机化
dy
得分与状态机
gameState:start、serve、play、done- 球出界判定
- 得分与发球方
ball:reset()- 胜利条件 10 分
- 状态转移与
Enter done后重置比分- 状态决定 update 与 draw 的行为
音效
容易混淆的问题
keypressed与isDowndt不乘会怎样- 左上角锚点的宽度补偿
push.start的范围- 滤镜设置顺序
require要不要接返回值