-- FPS
快速开始:调用
G.open(w,h) 创建画布,G.run(fn) 启动游戏循环。fn 接收 dt(帧间隔秒)。在循环内写 JS 逻辑 + 调用绘制 API。触摸/键盘输入通过 G.touch / G.pressed(k) 读取。
JS 速查 写游戏必会
变量与常量
let score = 0 // 可重新赋值
const SPEED = 120 // 不可变,约定大写
游戏里位置、分数用 let;固定数值用 const。
函数
const move = (x, speed, dt) => x + speed * dt
function reset() { score = 0; x = 160 }
箭头函数 => 适合简短逻辑;function 适合多行操作。
条件判断
if (G.touched) { x = G.touch.x }
if (score > best) best = score
let color = alive ? '#4ade80' : '#ef4444'
if/else 控制流程;三元 ? : 适合给变量赋两种值。
循环
for (let i = 0; i < 10; i++) { ... }
enemies.forEach(e => { e.y += 1 })
for 适合已知次数;forEach 适合遍历数组每个元素。
数组
let arr = [1, 2, 3]
arr.push(4) // 末尾添加
arr.filter(x => x > 0) // 过滤,返回新数组
arr.length // 元素个数
push 添加,filter 过滤掉不需要的元素——游戏里管理子弹、敌人最常用这两个。
对象
let player = { x: 160, y: 200, hp: 3 }
player.x += 10 // 改属性
player.hp -= 1 // 扣血
游戏实体用对象组织属性:{ x, y, w, h, speed, alive }。
游戏循环模式
G.open(320, 400)
let x = 160, vx = 100
G.run(dt => {
// 1. 更新逻辑
x += vx * dt
if (x > 300) vx = -100
// 2. 绘制画面
G.cls('#111')
G.color('#4ade80')
G.circ(x, 200, 10)
})
每帧:先算(移动/碰撞/生成),再画(清屏+绘制)。dt 是上一帧到这帧的秒数,乘速度保证不同帧率下运动一致。
画布
G.open(w, h)初始化画布G.cls(color)清屏并填充颜色绘制
G.color(c)设置填充/描边颜色G.rect(x,y,w,h)填充矩形G.box(x,y,w,h)描边矩形G.circ(x,y,r)填充圆G.line(x1,y1,x2,y2)线段G.print(s,x,y,sz)绘制文字G.text(s,x,y,sz,c)带颜色文字,一步到位NEWG.textAlign(a)文字对齐 left/center/rightG.font(f)设置字体G.alpha(v)全局透明度 0~1G.push() / G.pop()保存/恢复画布状态G.translate(x,y)平移坐标系G.rotate(rad)旋转坐标系G.scale(sx,sy)缩放坐标系特效 v1.1+
G.randColor()随机柔和颜色1.1G.osc(x,y,r,spd)呼吸圆,半径正弦变化1.1G.grid(c,r,fn)遍历格子,fn(gx,gy,i)1.1G.screenShake(n)屏幕震动,n=强度1.1G.particles(x,y,n)生成粒子,自动消散1.1G.wave(freq,amp)正弦波 -amp~+amp,基于G.time1.2G.wrap(v,lo,hi)循环包裹,越界从另一端出1.2碰撞 v1.2+
G.hit(a,b)AABB碰撞 {x,y,w,h}G.overlap(x1,y1,r1,x2,y2,r2)圆与圆碰撞1.2UI v1.2+
G.btn(x,y,w,h,label)按钮组件,点击返回true1.2运动 v1.2+
G.follow(obj,tx,ty,spd)obj平滑追踪目标1.2循环
G.run(fn)启动循环,fn(dt)每帧调用G.stop()停止循环G.dt上一帧耗时(秒)G.time游戏运行总时间G.frame当前帧序号输入
G.keysSet 当前按下的键G.pressed(k)键k是否按下G.key最后按下的键名G.touch{x,y} 触摸/鼠标位置G.touchesArray 所有触摸点G.touched是否正在触摸G.tap本帧是否刚点击工具
G.rnd(a,b)随机浮点 [a,b)G.rndi(a,b)随机整数 [a,b]G.dist(x1,y1,x2,y2)两点距离G.clamp(v,lo,hi)限制范围G.lerp(a,b,t)线性插值G.pick(x,y,rx,ry,rw,rh)点是否在矩形内音效
G.sfx(freq,dur,type)合成音效 square/sawtooth/triangle/sine场景
G.scene(id,{init,loop})定义场景G.go(id)切换到指定场景存储
G.save(k,v)存到 localStorageG.load(k)读取数据