作者 Nicholas Carlini
2020-11-21
连续第三年参加JS13k竞赛,目标是用不超过13kB的JavaScript代码制作游戏。今年的挑战是开发具有复杂网络功能的多人游戏——一个精简版MOBA(多人在线战术竞技游戏)。
点击此处播放游戏 | 源代码
选择MOBA类型因其具备:
初始采用每100ms同步全量状态的方式,在5FPS更新频率和200ms延迟下会出现明显卡顿:
// 服务端基础逻辑
class MovingBlock {
constructor() { this.position = ZERO; }
update(dt) { this.position = this.position.add(NewVector(dt,0,0)); }
}改为传输运动函数而非离散坐标:
function linear_move_withtime(start_pos, end_pos, rate, start_time) {
return cur_time =>
start_pos.lerp(end_pos,
clamp((cur_time - start_time)/duration, 0, 1))
}优势:
服务端通过差异检测仅发送变更属性:
var delta = Object.keys(state).reduce((diff, key) => {
if (JSON.stringify(state[key]) === JSON.stringify(last_state[key])) return diff
return {...diff, [key]: state[key]}
}, {})通过特殊标记实现函数网络传输:
{
_function: "linear_move_withtime",
args: [[0,0,0], [5,0,0], 3, 0]
}本地立即响应移动指令,再同步服务端确认:
// 客户端直接执行移动
player.move(target);
// 异步通知其他客户端
socket.emit('move', target);在剩余6kB空间内实现:
体验完整游戏 | 研究源代码
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。