-- FPS
快速开始:调用
v2.6 点击判断+判断检测+UI库V2大版本:修复输入框手机不弹键盘 (隐藏真实 input) + 修复手指未松开就触发点击 (改用 tapRelease 松开语义)。新增 点击判断系统 (tapDown/tapRelease/clickIn/clickInCircle/justPressed/justReleased/holdTime/tapCount/双击三击)、判断检测系统 (inRect/inCircle/inTriangle/inLine/rectOverlap/circleOverlap/onScreen/isVisible/closest/filterInRange/isNumber/isArray/chance)、UI 组件库 V2 (drawer/snackbar/pagination/breadcrumb/stepper/accordion/searchBox/numberInput/fab/toast2/calendar)。
v2.5:UI 组件库 V1 (panel/button/toggle/checkbox/radio/input/slider/tabs/menu/badge/chip/avatar/modal/colorPicker) + 文件持久化 + 设备适配。修复 toast 动画 bug。
v2.4:CSS 动画库 (22 个) + 高级形状 + 数学扩展 (perlin/damp) + 手势 + 音效扩展 + 调试性能。
v2.3:加载动画 / 浏览器检测 / 滑动列表 / 其他工具 — 修复 G.touch null bug。
v2.2:网络请求 / 网络图片 / 网络相关 / 交互动画 — 修复 FPS 显示 bug。
v2.1:★ 圆角矩形 ★ + 贝塞尔曲线 + 阴影/混合/裁剪/像素 + 信号系统 — 修复 11 bug。
v2.0:渐变 / 颜色混合 / 向量 / 缓动 / 镜头 / 物理 / 瓦片 / 对象池 — 60+ 接口。
G.open(w,h) 创建画布,G.run(fn) 启动游戏循环。fn 接收 dt(帧间隔秒)。在循环内写 JS 逻辑 + 调用绘制 API。触摸/键盘输入通过 G.touch / G.pressed(k) 读取。
v2.6 点击判断+判断检测+UI库V2大版本:修复输入框手机不弹键盘 (隐藏真实 input) + 修复手指未松开就触发点击 (改用 tapRelease 松开语义)。新增 点击判断系统 (tapDown/tapRelease/clickIn/clickInCircle/justPressed/justReleased/holdTime/tapCount/双击三击)、判断检测系统 (inRect/inCircle/inTriangle/inLine/rectOverlap/circleOverlap/onScreen/isVisible/closest/filterInRange/isNumber/isArray/chance)、UI 组件库 V2 (drawer/snackbar/pagination/breadcrumb/stepper/accordion/searchBox/numberInput/fab/toast2/calendar)。
v2.5:UI 组件库 V1 (panel/button/toggle/checkbox/radio/input/slider/tabs/menu/badge/chip/avatar/modal/colorPicker) + 文件持久化 + 设备适配。修复 toast 动画 bug。
v2.4:CSS 动画库 (22 个) + 高级形状 + 数学扩展 (perlin/damp) + 手势 + 音效扩展 + 调试性能。
v2.3:加载动画 / 浏览器检测 / 滑动列表 / 其他工具 — 修复 G.touch null bug。
v2.2:网络请求 / 网络图片 / 网络相关 / 交互动画 — 修复 FPS 显示 bug。
v2.1:★ 圆角矩形 ★ + 贝塞尔曲线 + 阴影/混合/裁剪/像素 + 信号系统 — 修复 11 bug。
v2.0:渐变 / 颜色混合 / 向量 / 缓动 / 镜头 / 物理 / 瓦片 / 对象池 — 60+ 接口。
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.width画布宽G.height画布高2.0绘制 · 基础
G.color(c)同时设置填充/描边颜色G.fill(c)仅设置填充色2.0G.stroke(c)仅设置描边色2.0G.lineWidth(w)线宽2.0G.lineCap(c)线帽样式 round/square/butt2.0G.rect(x,y,w,h)填充矩形G.box(x,y,w,h)描边矩形G.circ(x,y,r)填充圆G.ring(x,y,rIn,rOut)圆环 (内径/外径)2.0G.line(x1,y1,x2,y2)线段G.polyline(pts)连续线段 pts=[[x,y],...]2.0G.polygon(pts)填充多边形2.0G.triangle(x1,y1,x2,y2,x3,y3)填充三角形2.0G.ellipse(x,y,rx,ry)填充椭圆2.0G.arc(x,y,r,a1,a2)圆弧 (角度制)2.0G.star(x,y,r,points)星形 points=尖角数2.0G.dashed(x1,y1,x2,y2,dash)虚线2.0G.print(s,x,y,sz)绘制文字 (当前色)G.text(s,x,y,sz,c)带颜色文字G.textAlign(a)文字对齐 left/center/rightG.textBaseline(a)文字基线 top/middle/bottom2.0G.font(f)设置字体G.textWidth(s)测量文字宽度2.0G.alpha(v)全局透明度 0~1G.push() / G.pop()保存/恢复画布状态G.translate(x,y)平移坐标系G.rotate(rad)旋转坐标系G.scale(sx,sy)缩放坐标系G.resetTransform()重置变换矩阵2.0渐变 v2.0+
G.gradLinear(x1,y1,x2,y2,stops)线性渐变 stops=[[pos,color],...]2.0G.gradRadial(x,y,r0,r1,stops)径向渐变2.0G.useGradient(grad)把渐变设为当前填充2.0圆角矩形 ★ v2.1 · 终极的牛
圆角是 UI 美感的灵魂。三个核心 API + 圆角按钮,配合
shadow / clipRrect 可做出 iOS / Material 级别的卡片界面。
// 基础圆角矩形 (四角同半径)
G.color('#7c9eff')
G.rrect(20, 20, 200, 60, 12)
// 描边圆角矩形
G.stroke('#fff')
G.rbox(20, 100, 200, 60, 12)
// 一步到位: 填充 + 描边 + 圆角
G.rrectEx(20, 180, 200, 60, '#1a1c2a', '#7c9eff', 12, 1.5)
// 每角不同半径 [左上,右上,右下,左下]
G.rrect(20, 260, 200, 60, [20, 4, 20, 4])
// 圆角按钮 (返回是否被点击)
if (G.rbtn(80, 350, 160, 44, 'PLAY', 22)) {
G.sfx(660, .08)
}
G.rrect(x,y,w,h,r)★ 填充圆角矩形 r=数字或[tl,tr,br,bl]2.1G.rbox(x,y,w,h,r)描边圆角矩形2.1G.rrectEx(x,y,w,h,fill,stroke,r,lw)填充+描边一步到位2.1G.rbtn(x,y,w,h,label,r)圆角按钮,点击返回 true2.1G.clipRrect(x,y,w,h,r)圆角矩形裁剪2.1曲线 / 高级绘制 v2.1+
G.bezier(x1,y1,cx1,cy1,cx2,cy2,x2,y2)三次贝塞尔曲线2.1G.quadCurve(x1,y1,cx,cy,x2,y2)二次贝塞尔曲线2.1G.spline(pts,tension)平滑曲线穿过所有点 (Catmull-Rom)2.1G.arrow(x1,y1,x2,y2,head)带箭头的线段2.1G.heart(x,y,size)心形 (表白专用)2.1阴影 / 混合 / 裁剪 v2.1+
G.shadow(color,blur,ox,oy)开启阴影2.1G.noShadow()关闭阴影2.1G.blend(mode)混合模式 lighter/multiply/screen/difference2.1G.clip(x,y,w,h)矩形裁剪2.1G.clipCirc(x,y,r)圆形裁剪2.1G.clipRrect(x,y,w,h,r)圆角矩形裁剪2.1G.pixel(x,y,c)设置单个像素2.1G.getPixel(x,y)读取像素 [r,g,b,a]2.1G.snapshot()返回画布 dataURL2.1颜色工具 v2.0+
G.rgb(r,g,b)RGB 转 #hex2.0G.rgba(r,g,b,a)RGBA 字符串2.0G.hsl(h,s,l)HSL 颜色2.0G.hsla(h,s,l,a)HSLA 颜色2.0G.mix(c1,c2,t)混合两色 t=0~12.0G.fadeOut(c,t)向黑色渐变2.0G.fadeIn(c,t)向白色渐变2.0G.complement(c)补色2.0G.randColor()随机柔和颜色向量 v2.0+
G.vec(x,y)创建 {x,y}2.0G.vecAdd(a,b)向量加2.0G.vecSub(a,b)向量减2.0G.vecMul(v,s)向量数乘2.0G.vecLen(v)向量长度2.0G.vecNorm(v)归一化2.0G.vecDot(a,b)点积2.0G.vecAngle(v)向量角度 (弧度)2.0G.vecFromAngle(rad,len)由角度构造向量2.0G.vecRotate(v,rad)旋转向量2.0数学 v2.0+
G.map(v,a,b,c,d)值域映射 a~b → c~d2.0G.deg2rad(d)角度→弧度2.0G.rad2deg(r)弧度→角度2.0G.angleTo(x1,y1,x2,y2)两点间角度2.0G.sign(v)符号 -1/0/12.0G.snap(v,step)对齐到网格2.0G.round(v,n)保留 n 位小数2.0G.sum(arr)数组求和2.0G.avg(arr)数组平均2.0G.range(n)生成 [0..n-1]2.0G.dist(x1,y1,x2,y2)两点距离G.clamp(v,lo,hi)限制范围G.lerp(a,b,t)线性插值G.angleLerp(a,b,t)角度插值 (正确处理环绕)2.1G.moveToward(obj,tx,ty,max)朝目标匀速移动2.1G.spring(obj,tx,ty,k,damp)弹簧物理2.1G.noise(x,y)2D 伪噪声 [0,1]2.1G.mod(a,b)数学取模 (始终非负)2.1G.min(arr) / G.max(arr)数组最值2.1信号系统 v2.1+
G.signal(name)创建/获取信号2.1G.on(name,fn)订阅,返回取消函数2.1G.emit(name,...args)触发信号2.1G.off(name)清空某信号监听2.1时间 v2.1+
G.now()当前时间戳 (毫秒)2.1G.since(t)距 t 过了多少秒2.1G.clock格式化运行时间 mm:ss.s2.1私有 API v2.1 · 进阶
下划线前缀的 API属于内部 / 进阶用法,普通用户无需关心。但当你想做底层扩展或调试时很有用:
G._ensureCtx() // 确保画布已初始化,否则报错
G._lerpAngle(a, b, t) // angleLerp 别名
G._rgbToHex(255, 0, 0) // → '#ff0000'
G._hexStr('red') // → '#ff0000' (任意颜色归一化)
G._clone(obj) // 浅克隆
G._dt60 // 60fps 标准化 dt 倍数 (≈1 表示 60fps)
G._ensureCtx()确保画布已初始化2.1G._lerpAngle(a,b,t)angleLerp 私有别名2.1G._rgbToHex(r,g,b)RGB → #hex2.1G._hexStr(c)任意颜色 → #rrggbb2.1G._clone(o)浅克隆2.1G._dt6060fps 标准化 dt 倍数2.1随机 v2.0+
G.rnd(a,b)随机浮点 [a,b)G.rndi(a,b)随机整数 [a,b]G.rndPick(arr)数组随机取一项2.0G.rndWeighted(items,weights)按权重随机2.0G.rndSign()随机 -1 或 12.0G.rndBool(p)概率 p 返回 true2.0G.shuffle(arr)洗牌 (原数组)2.0缓动 / 动画 v2.0+
G.tween(obj,props,dur,ease)属性动画 ease=函数名2.0G.cancelTween(tw)取消动画2.1G.delay(sec,fn)延时调用2.0G.every(sec,fn)周期调用2.0G.cancelTimer(t)取消延时/周期2.1G.blink(period)本帧 true/false 交替2.0G.pulse(speed)0~1 平滑振荡2.0G.easeIn(t)缓入2.0G.easeOut(t)缓出2.0G.easeInOut(t)缓入缓出2.0G.easeBounce(t)弹跳2.0G.easeBack(t)回弹2.0G.wave(freq,amp)正弦波G.wrap(v,lo,hi)循环包裹镜头 v2.0+
G.cam{x,y,zoom} 镜头对象2.0G.camMove(x,y,spd)平滑移动2.0G.camFollow(obj,spd)跟随对象2.0G.camZoom(z,spd)缩放2.0G.camShake(n)镜头震动2.0G.screenShake(n)屏幕震动物理 v2.0+
G.applyForce(obj,fx,fy)施加力 (累加加速度)2.0G.applyGravity(obj,g)施加重力 g=加速度2.0G.applyFriction(obj,f)摩擦 f=衰减系数2.0G.bounceOff(obj,restitution)触地反弹2.0G.physics(obj)更新 obj.x/y (需有 vx,vy)2.0瓦片地图 v2.0+
G.tilemap(data,size)创建瓦片地图2.0G.drawTilemap(map,colorMap)绘制 (key→color)2.0G.getTile(map,gx,gy)取瓦片值2.0G.setTile(map,gx,gy,v)设瓦片值2.0对象池 v2.0+
G.pool(factory)创建对象池2.0G.poolTake(pool)取出 (无则 factory 新建)2.0G.poolReturn(pool,obj)归还2.0特效
G.osc(x,y,r,spd)呼吸圆,半径正弦变化G.grid(c,r,fn)遍历格子,fn(gx,gy,i)G.particles(x,y,n)生成粒子,自动消散G.drawGrid(size,color)绘制网格背景2.0G.drawCross(x,y,size,c)绘制十字标记2.0碰撞
G.hit(a,b)AABB碰撞 {x,y,w,h}G.overlap(x1,y1,r1,x2,y2,r2)圆与圆碰撞G.pick(x,y,rx,ry,rw,rh)点是否在矩形内G.pointInPoly(x,y,pts)点是否在多边形内2.0UI
G.btn(x,y,w,h,label)按钮组件,点击返回trueG.slider(x,y,w,val,min,max)滑块,返回新值2.0G.progressBar(x,y,w,h,p)进度条 p=0~12.0运动
G.follow(obj,tx,ty,spd)obj平滑追踪目标G.lookAt(obj,tx,ty)转向目标 (设 obj.angle)2.0循环
G.run(fn)启动循环,fn(dt)每帧调用G.stop()停止循环G.dt上一帧耗时(秒)G.time游戏运行总时间G.frame当前帧序号G.fps实时帧率2.0输入
G.keysSet 当前按下的键G.pressed(k)键k是否按下G.keyJustPressed(k)按下那帧 true2.0G.keyJustReleased(k)抬起那帧 true2.0G.key最后按下的键名G.touch{x,y} 触摸/鼠标位置G.touchesArray 所有触摸点G.touched是否正在触摸G.tap本帧是否刚点击G.swipe{dx,dy,dir} 滑动方向2.0G.anyKey()本帧是否按下任意键2.1G.waitKey(k)等待某键被按下2.1音效
G.sfx(freq,dur,type)合成音效 square/sawtooth/triangle/sineG.melody(notes,tempo)播放旋律 [[freq,dur],...]2.0G.mute()静音切换2.0场景
G.scene(id,{init,loop})定义场景G.go(id)切换到指定场景存储
G.save(k,v)存到 localStorageG.load(k)读取数据G.clearSave()清空所有存档2.0调试 v2.0+
G.log(...args)console.log 别名2.0G.bench(fn,n)性能测试,返回 ms2.0网络请求 v2.2+
HTTP 请求辅助。所有方法返回 Promise,失败时
⚠️ 跨域请求受浏览器 CORS 限制,目标服务器必须允许跨域。
resolve(null) 而非 reject,避免未捕获异常影响游戏循环。⚠️ 跨域请求受浏览器 CORS 限制,目标服务器必须允许跨域。
// 异步获取 JSON (注意 await 必须在 async 函数内)
G.run(async dt => {
if (G.frame === 1) {
const data = await G.getJSON('https://api.example.com/data')
if (data) G.log('Got:', data)
}
G.cls('#000')
G.text('loading...', 10, 30, 14, '#fff')
})
G.fetch(url,opts)原生 fetch 包装,返回 Response 或 null2.2G.get(url)GET 文本2.2G.getJSON(url)GET 并解析 JSON2.2G.post(url,data)POST JSON 返回文本2.2G.postJSON(url,data)POST 并解析 JSON 响应2.2G.httpStatus(url)HEAD 查询状态码,失败 -12.2网络图片 v2.2+
异步加载 + 同步绘制。第一次调用
G.image(url,...) 时图片未加载,会自动后台加载并跳过本帧绘制;后续帧自动从缓存绘制。同一 URL 只加载一次。
// 同步绘制 (推荐用法)
G.run(dt => {
G.cls('#000')
G.image('https://picsum.photos/200', 60, 100)
// 第一次返回 false (图片还没好),几帧后自动开始绘制
})
// 预加载多张图片,加载完成后再开始游戏
G.preloadImages([
'https://picsum.photos/100/1',
'https://picsum.photos/100/2'
], () => {
G.log('all loaded!')
})
G.loadImage(url)异步加载,返回 Promise<Image>2.2G.image(url,x,y,w,h)同步绘制 (自动缓存/加载)2.2G.imageClip(url,sx,sy,sw,sh,dx,dy,dw,dh)九参裁剪绘制2.2G.imageLoaded(url)检查是否已加载2.2G.preloadImages(urls,fn)批量预加载2.2G.clearImages()清空图片缓存2.2G.spriteSheet(url,fw,fh)创建精灵表2.2G.sprite(ss,idx,x,y,scale)从精灵表取一帧2.2网络相关 v2.2+
G.online是否联网2.2G.onOnline(fn) / G.onOffline(fn)联网/断网监听2.2G.urlParam(name)取 URL 查询参数2.2G.urlParams()取所有查询参数对象2.2G.baseURL当前页面基础 URL2.2G.openTab(url)新标签页打开2.2G.redirect(url)当前页跳转2.2G.download(name,content,type)触发文件下载2.2G.share(data)Web Share 原生分享2.2G.copy(text)复制到剪贴板2.2交互动画 v2.2+
让 UI 活起来。状态全部挂在传入的
obj 上,无需手动管理。
// 可拖拽的卡片
let card = { x: 100, y: 100, w: 80, h: 80 }
G.run(dt => {
G.cls('#000')
G.draggable(card) // 自动处理拖拽
let s = G.clickAnim(card) // 点击弹跳缩放
let off = G.shakeOffset(card) // 抖动偏移
G.push()
G.translate(card.x + card.w/2 + off.x, card.y + card.h/2 + off.y)
G.scale(s, s)
G.rrectEx(-card.w/2, -card.h/2, card.w, card.h, '#7c9eff', '#fff', 10, 1)
G.pop()
if (G.hover(card)) G.tooltip(G.touch.x, G.touch.y, 'Drag me!')
})
G.draggable(obj)可拖拽,本帧被拖返回 true2.2G.dropTarget(x,y,w,h,obj)拖放目标检测2.2G.hover(obj)是否悬停在 obj 上2.2G.clickAnim(obj)点击弹跳缩放 1~1.152.2G.tooltip(x,y,text)圆角提示框 (自动避让)2.2G.cursor(type)鼠标样式 pointer/move/...2.2G.pulseScale(speed)呼吸缩放 0.9~1.12.2G.wobble(speed,amp)摆动角度2.2G.float(speed,amp)上下浮动偏移2.2G.breath(speed)0~1 呼吸值2.2G.shakeObj(obj,n) / G.shakeOffset(obj)对象级抖动2.2G.glow(x,y,r,color,i)发光圆 (径向渐变)2.2预制加载动画 v2.3+
开箱即用的 loading 指示器,内部用
G.time 自动动画,无需手动管理。
G.run(dt => {
G.cls('#000')
G.color('#7c9eff')
G.spinner(160, 100, 18) // 旋转弧
G.loadingDots(160, 160, 3) // 跳跃圆点
G.loadingBar(60, 200, 200, 6, -1) // 不确定进度条
G.loadingCircle(160, 280, 20, 0.6) // 圆形进度 60%
G.loadingText(120, 340, '加载中') // 省略号动画
})
G.spinner(x,y,r,color,speed)旋转弧形 spinner2.3G.loadingDots(x,y,count,color,speed)跳跃圆点2.3G.loadingBar(x,y,w,h,progress,color)进度条 (负数=不确定)2.3G.loadingCircle(x,y,r,progress,color)圆形进度环2.3G.skeleton(x,y,w,h,r)骨架屏闪烁块2.3G.loadingText(x,y,text,speed)省略号动画文字2.3浏览器检测 v2.3+
G.isMobile是否手机2.3G.isTouch是否触屏设备2.3G.isDesktop是否桌面端2.3G.isIOS / G.isAndroidiOS / Android2.3G.isChrome / isFirefox / isSafari / isEdge / isWeChat浏览器类型2.3G.os操作系统名 (iOS/Android/macOS/Windows/Linux)2.3G.browserName浏览器名2.3G.screenW / G.screenH屏幕物理尺寸2.3G.pixelRatio设备像素比2.3G.viewport{w,h} 视口尺寸2.3G.landscape / G.portrait横屏 / 竖屏2.3滑动列表 v2.3+
带惯性 + 边界回弹的滚动容器。支持鼠标拖拽和触摸滑动。
// 创建滚动器
let sc = G.scroller(20, 60, 280, 300)
let items = G.range(50).map(i => 'Item ' + i)
G.run(dt => {
G.cls('#000')
// 一行搞定滚动列表!
G.scrollList(sc, items, 50, (item, x, y, w, h, i) => {
G.rrectEx(x+4, y+4, w-8, h-8, '#1a1c2a', '#333', 8, 1)
G.text(item, x+16, y+h/2+6, 16, '#fff')
})
})
G.scroller(x,y,w,h)创建滚动状态对象2.3G.scrollContent(sc,h)设置内容高度2.3G.updateScroll(sc)每帧更新 (惯性+回弹)2.3G.clipScroll(sc)裁剪+平移坐标系2.3G.scrollbar(sc,color)绘制滚动条2.3G.scrollList(sc,items,h,fn)★ 一行搞定滚动列表2.3其他工具 v2.3+
G.format(n,digits)数字格式化 (K/M/B)2.3G.pad(n,len,char)补零/补字符2.3G.uuid()生成 UUID v42.3G.hash(str)字符串哈希 (djb2)2.3G.template(str,data){{key}} 模板替换2.3G.debounce(fn,sec) / G.throttle(fn,sec)防抖 / 节流2.3G.once(fn) / G.memoize(fn)只执行一次 / 记忆化2.3G.queue() / G.stack()FIFO 队列 / LIFO 栈2.3G.wait(sec)Promise 延时 (async 用)2.3G.colorName(hex)取最接近的中文颜色名2.3CSS 动画 v2.4 · UI 增强
给页面元素加 class 即可触发动画。无需 JS,纯 CSS 实现。
// 在 HTML 元素上加 class
<div class="anim-bounce">弹跳</div>
<button class="anim-pulse">呼吸</button>
<div class="anim-fade-in delay-2">延迟 0.2s 淡入</div>
// JS 动态添加
document.querySelector('.btn').classList.add('anim-shake')
.anim-fade-in / .anim-fade-out淡入 / 淡出2.4.anim-slide-up/down/left/right滑入2.4.anim-zoom-in / .anim-zoom-out缩放弹入 (带回弹)2.4.anim-bounce弹跳2.4.anim-pulse呼吸缩放 (循环)2.4.anim-spin旋转 (循环)2.4.anim-shake左右抖动2.4.anim-glow发光呼吸 (循环)2.4.anim-float上下浮动 (循环)2.4.anim-wiggle左右摆动 (循环)2.4.anim-flip / .anim-flip-x3D 翻转 Y/X 轴2.4.anim-heartbeat心跳 (循环)2.4.anim-rubber橡皮筋2.4.anim-swing钟摆2.4.anim-flash / .anim-tada闪烁 / 张狂2.4.anim-fast / .anim-slow / .anim-paused速度控制2.4.delay-1 ... .delay-5延迟 0.1s~0.5s2.4高级形状 v2.4+
G.path(fn) / G.pathStroke(fn)自定义路径2.4G.regularPolygon(x,y,r,sides,rot)正多边形2.4G.gear(x,y,r,teeth)齿轮2.4G.cloud(x,y,r)云朵2.4G.bubble(x,y,r)气泡 (带高光)2.4G.checkmark(x,y,size,color)勾号2.4G.cross(x,y,size,color)X 叉号2.4G.capsule(x,y,w,h)胶囊形2.4G.speech(x,y,w,h,tail)对话气泡2.4数学扩展 v2.4+
G.smoothstep(t) / G.smootherstep(t)平滑阶跃2.4G.damp(cur,tgt,lambda,dt)帧率无关阻尼2.4G.fract(v)取小数部分2.4G.gcd(a,b) / G.lcm(a,b)最大公约数 / 最小公倍数2.4G.isPrime(n)是否质数2.4G.fib(n) / G.factorial(n)斐波那契 / 阶乘2.4G.perlin(x,y)2D Perlin 噪声 (平滑)2.4G.invertColor(c) / G.grayscale(c)反色 / 灰度化2.4G.brightness(c,factor)调亮/调暗2.4G.withAlpha(c,a)加透明度2.4手势 / 高级输入 v2.4+
G.doubleClick(obj,interval)双击检测2.4G.longPress(obj,duration)长按检测2.4G.pinch()双指捏合 {scale,rotation}2.4G.isPressed(x,y,w,h)区域是否被按下 (持续)2.4G.isClicked(x,y,w,h)区域是否被点击 (本帧)2.4G.clicked(obj)obj 是否被点击2.4G.onKeyDown(key,fn)注册按键回调2.4音效扩展 v2.4+
G.tone(freq,dur,type,vol)带音量的 tone2.4G.chord(freqs,dur,type)和弦 (同时多频)2.4G.sweep(f1,f2,dur,type)频率扫描2.4G.noise(dur,vol)白噪声 (爆炸/雨声)2.4G.setMuted(m) / G.isMuted静音控制2.4调试 / 性能 v2.4+
G.debug(key,value)设置调试信息2.4G.drawDebug()绘制调试面板2.4G.profile(name,fn)性能测试2.4G.watch(name,value)限频 log 变量2.4G.stats()引擎统计信息2.4UI 组件库 ★ v2.5 · 高自由度
即时模式 UI 组件库。每帧调用自动处理交互,所有组件支持
opts 自定义颜色/样式/行为。
// 面板 + 按钮 + 开关 + 滑块
G.panel(10, 10, 300, 200, { title: 'Settings', shadow: 8 })
let on = G.toggle(30, 60, on, { label: 'Sound' })
let vol = G.sliderH(30, 100, 200, vol, 0, 100, { showValue: true })
if (G.button('OK', 200, 150, 80, 30, { fill: '#4ade80', glow: true })) {
G.sfx(880, .1)
}
G.uiReset()每帧开始重置 UI id2.5G.panel(x,y,w,h,opts)面板 (标题栏/阴影/圆角)2.5G.label(text,x,y,opts)富文本标签2.5G.button(text,x,y,w,h,opts)★ 高自由度按钮 (glow/shadow/disabled)2.5G.toggle(x,y,on,opts)开关 (平滑动画)2.5G.checkbox(x,y,checked,opts)复选框2.5G.radio(x,y,value,cur,opts)单选按钮2.5G.input(x,y,w,opts)★ 文本输入框 (光标/密码/占位)2.5G.sliderH(x,y,w,v,min,max,opts)水平滑块 (showValue/step)2.5G.sliderV(x,y,h,v,min,max,opts)垂直滑块2.5G.tabs(x,y,w,tabs,cur,opts)标签页2.5G.menu(x,y,items,opts)下拉菜单2.5G.badge(x,y,text,opts)徽章2.5G.chip(x,y,text,opts)可删除标签2.5G.avatar(x,y,r,opts)头像 (状态点/边框)2.5G.divider(x,y,w,opts)分隔线 (水平/垂直)2.5G.iconBtn(x,y,size,icon,opts)图标按钮2.5G.progress(x,y,w,h,value,opts)进度条 (条纹/动画)2.5G.tooltip2(x,y,text,opts)增强 tooltip (箭头)2.5G.modal(title,body,opts)★ 模态对话框2.5G.colorPicker(x,y,color,opts)★ HSV 颜色选择器2.5文件 / 持久化 v2.5+
G.readFile(accept)选择文件读文本2.5G.readImageFile()选择图片文件加载2.5G.saveFile(name,content,type)保存文件到本地2.5G.storage(key,value)通用存取 (read/write/delete)2.5设备 / 屏幕适配 v2.5+
G.fitCanvas()画布自适应父容器2.5G.safeArea安全区域 {top,right,bottom,left}2.5G.lockOrientation(orient)锁定屏幕方向2.5G.fullscreen(elem)切换全屏2.5G.wakeLock()屏幕常亮 (防息屏)2.5G.vibrate(pattern)震动 (移动端)2.5生命周期 / 事件 v2.5+
G.onResume(fn) / G.onPause(fn)页面可见/隐藏回调2.5G.onResize(fn)窗口大小变化回调2.5G.visible页面是否可见2.5点击判断 ★ v2.6 · 精确点击
区分按下 / 持续按住 / 松开三种状态。修复"手指未松开就触发"的 bug。
G.tapRelease (新) = 松开瞬间触发 (推荐)
G.clickIn = 按下+松开都在区域内才算点击 (最严格)
// 旧方式 (可能误触): 手指一按下就触发
if (G.tap && G.hover(btn)) { ... }
// ★ 新方式 (推荐): 手指松开才触发,真正的"点击完成"
if (G.clickIn(btn.x, btn.y, btn.w, btn.h)) { ... }
// 检测双击
if (G.isDoubleClick(0.3)) { ... }
// 检测长按
if (G.isHolding(0.5)) { ... }
G.tap (旧) = 按下瞬间触发 (向后兼容保留)G.tapRelease (新) = 松开瞬间触发 (推荐)
G.clickIn = 按下+松开都在区域内才算点击 (最严格)
G.tapDown本帧刚按下2.6G.tapRelease★ 本帧刚松开 (推荐)2.6G.tapDownPos / G.tapReleasePos按下/松开位置2.6G.pressDuration当前按住时长 (秒)2.6G.clickIn(x,y,w,h)★ 区域内完成点击 (按下+松开都在内)2.6G.clickInCircle(x,y,r)圆形区域内完成点击2.6G.clickOut(x,y,w,h)区域外完成点击 (失焦用)2.6G.clickInObj(obj)obj 上完成点击2.6G.isDown(x,y,w,h)区域是否正在被按下 (持续)2.6G.isDownObj(obj)obj 是否正在被按下2.6G.justPressed(x,y,w,h)本帧刚按下且在区域内2.6G.justReleased(x,y,w,h)本帧刚松开且在区域内2.6G.holdTime() / G.isHolding(sec)按住时长 / 是否按住超过 sec 秒2.6G.tapCount(interval)连续点击计数2.6G.isDoubleClick / isTripleClick双击 / 三击检测2.6G.dragStart(obj) / G.dragEnd()拖拽开始 / 结束2.6G.showKeyboard(text) / hideKeyboard★ 弹出/收起手机键盘2.6G.keyboardVisible键盘是否可见2.6判断 / 检测 v2.6+
G.inRect(px,py,x,y,w,h)点是否在矩形内2.6G.inCircle(px,py,cx,cy,r)点是否在圆内2.6G.inEllipse(px,py,cx,cy,rx,ry)点是否在椭圆内2.6G.inTriangle(px,py,...)点是否在三角形内2.6G.inLine(px,py,x1,y1,x2,y2,t)点是否在线段附近2.6G.rectOverlap(a,b)两矩形是否重叠2.6G.circleOverlap(...)两圆是否重叠2.6G.rectCircleOverlap(...)矩形与圆是否重叠2.6G.lineOverlap(...)两线段是否相交2.6G.onScreen(x,y,w,h)矩形是否在画布内2.6G.pointOnScreen(x,y)点是否在画布内2.6G.isVisible(obj,cam)obj 是否在镜头可见范围2.6G.distanceTo(x,y,obj) / angleToObj到 obj 的距离/角度2.6G.closest(arr,x,y)找最近的元素2.6G.filterInRange(arr,x,y,range)筛选范围内元素2.6G.isEmpty / isNumber / isString / isArray / isFunction类型判断2.6G.inRange(v,min,max)值是否在范围内2.6G.isEven(n) / isOdd(n)偶数 / 奇数2.6G.chance(p)概率判断 (p=0~1)2.6UI 组件库 V2 ★ v2.6 · 更强大
G.drawer(side,w,h,open,opts)抽屉 (侧边滑出)2.6G.snackbar(text,opts)底部通知条 (自动消失)2.6G.pagination(x,y,w,cur,total,opts)分页器2.6G.breadcrumb(x,y,items,opts)面包屑导航2.6G.stepper(x,y,w,v,min,max,step,opts)数字步进器2.6G.accordion(x,y,w,items,openIdx,opts)手风琴2.6G.searchBox(x,y,w,value,opts)搜索框 (带清除)2.6G.numberInput(x,y,w,value,opts)数字输入2.6G.fab(x,y,r,icon,opts)浮动操作按钮2.6G.toast2(text,opts)画布内 toast2.6G.calendar(x,y,w,year,month,day,opts)日历2.6主题系统 ★ v2.7 · UI 换肤
一键切换 UI 主题。8 套内置主题,告别只有蓝色。
// 切换主题
G.theme('ocean') // 海洋蓝青
G.theme('sunset') // 日落橙
G.theme('forest') // 森林绿
G.theme('cyberpunk') // 赛博朋克粉
G.theme('monokai') // 编辑器经典
// 在组件里用主题色
G.button('OK', 100, 100, 80, 30, {
fill: G.t('primary'), // 主题主色
textColor: G.t('text') // 主题文字色
})
// 自定义主题
G.theme({ primary: '#ff00ff', accent: '#00ff00' })
G.theme(name)★ 切换主题 (8 套内置)2.7G.themeColors()获取当前主题色对象2.7G.themes()列出所有主题名2.7G.t(key)★ 取主题色 (primary/accent/success/danger/bg/surface/text)2.7G.localX / G.localY / G.screenX / G.screenY坐标转换 (滚动列表内)2.7网络请求扩展 v2.7+
G.put(url,data) / G.patch(url,data) / G.del(url)PUT/PATCH/DELETE 请求2.7G.putJSON / G.patchJSONPUT/PATCH 解析 JSON2.7G.uploadFile(url,file,onProgress)★ 上传文件带进度2.7G.downloadFile(url,onProgress)★ 下载文件带进度2.7G.jsonp(url,callbackParam)JSONP 跨域请求2.7G.websocket(url)WebSocket 连接2.7G.eventSource(url)SSE 服务端推送2.7G.request(method,url,opts)通用请求 (支持 blob/arrayBuffer)2.7G.setHeaders(headers) / G.formData()默认请求头 / FormData2.7网络图片扩展 v2.7+
G.imageFilter(url,filter,opts)★ 滤镜 (grayscale/sepia/blur/invert/bright...)2.7G.imageTint(url,color,x,y,w,h)着色绘制2.7G.imageRotate(url,x,y,angle,w,h)旋转绘制2.7G.imageAlpha(url,x,y,alpha,w,h)带透明度绘制2.7G.imageFlip(url,x,y,flipX,flipY,w,h)翻转绘制2.7G.imageNine(url,x,y,w,h,inset)九宫格绘制 (可缩放 UI)2.7网络视频 ★ v2.7 · 新分类
在画布上绘制视频帧。支持播放/暂停/跳转/音量控制。
// 加载并播放视频
G.loadVideo('https://example.com/video.mp4', { muted: true, loop: true })
G.videoPlay('https://example.com/video.mp4')
G.run(dt => {
G.cls('#000')
// 绘制视频当前帧
G.video('https://example.com/video.mp4', 20, 20, 280, 200)
// 显示进度
G.text(G.videoTime('...') + ' / ' + G.videoDuration('...'), 20, 240, 14, '#fff')
})
G.loadVideo(url,opts)加载视频 (muted/loop/autoplay)2.7G.video(url,x,y,w,h)★ 绘制视频当前帧2.7G.videoPlay(url) / G.videoPause(url)播放 / 暂停2.7G.videoSeek(url,time)跳转到指定时间2.7G.videoTime(url) / G.videoDuration(url)当前时间 / 总时长2.7G.videoVolume(url,vol) / G.videoMute(url,muted)音量 / 静音2.7G.videoPaused(url) / G.videoEnded(url)是否暂停 / 结束2.7G.clearVideos()清空视频缓存2.7