跳到正文

Pong ​

环境 ​

  • LÖVE
  • love 的运行方式:目录或 .love 包
  • main.lua 是入口
  • VS Code:LuaLS 与 StyLua
  • LuaJIT 与 Lua 5.1
  • ARM 上默认关闭的 JIT

Lua ​

  • 全局变量与 local
  • 字符串拼接 ..
  • tostring 把值转成字符串
  • 单行注释与多行注释
  • 真假值:只有 nil 和 false 为假
  • table:数组、字典、混合
  • 数组下标从 1 开始,长度用 #
  • ipairs 与 pairs
  • 函数、匿名函数、多返回值
  • if / elseif / then / end
  • for、while、repeat
  • and/or 模拟三元
  • require 与模块
  • 全局模块写法与返回表写法

LÖVE 基础 ​

  • 游戏循环:输入 → 更新 → 渲染
  • love.load、love.update、love.draw
  • love.keypressed 与 love.keyboard.isDown
  • 2D 坐标系:原点左上、Y 向下
  • love.window.setMode 与 vsync
  • love.window.setTitle 设窗口标题
  • love.graphics.rectangle 的 fill / line
  • love.graphics.clear 与 RGBA
  • setColor 是绘制色,不是清屏色
  • love.graphics.print 不给宽度
  • 字体:newFont 与 setFont
  • love.timer.getFPS 打印帧率
  • love.event.quit 退出游戏

虚拟分辨率与滤镜 ​

  • push 库
  • 虚拟分辨率
  • push.setupScreen / push.start / push.finish
  • upscale:normal、pixel-perfect、stretched
  • love.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 的行为

音效 ​

  • love.audio.newSource
  • static 与 stream
  • sounds 表
  • :play() 方法
  • 音效语义:paddle、wall、score
  • BFXR 与 ChipTone

容易混淆的问题 ​

  • keypressed 与 isDown
  • dt 不乘会怎样
  • 左上角锚点的宽度补偿
  • push.start 的范围
  • 滤镜设置顺序
  • require 要不要接返回值