系列文章
《球球大作战》源码解析(7):游戏循环
《球球大作战》源码解析(8):消息广播
服务端处理了游戏的各种游戏逻辑,怎样让小球移动是重点之一。若想做服务端运算的游戏,这一部分代码是很值得参考的。
SetInterval
nodejs中的setInterval是定时器,如下的代码表示每隔1秒执行一次myfunc方法。
setInterval(myfunc,1000);
function myfunc(){
console.log("hehe");
};复制代码
3个定时器
源码中设置了3个定时器,分别是moveloop、gameloop和sendUpdates。其中moveloop每秒执行60次,它主要处理小球的移动计算。
setInterval(moveloop, 1000 / 60);
setInterval(gameloop, 1000);
setInterval(sendUpdates, 1000 / c.networkUpdateFactor);复制代码
moveloop
Moveloop方法的代码如下,它对每个玩家执行tickPlayer,处理每个小球的移动。
function moveloop() {
for (var i = 0; i < users.length; i++) {
tickPlayer(users[i]);
}
for (i=0; i < massFood.length; i++) {
if(massFood[i].speed > 0) moveMass(massFood[i]);
}
}复制代码
moveMass
moveMass就是移动质量,小球可以喷射身体的一部分出去,喷出去的部分变成了食物。每个喷射出去的“质量”都会被保存在massFood列表里。moveMass会处理这些“质量”的运动轨迹,先是喷射出去、然后减速、停止。
image001.png (39.99 KB, 下载次数: 6)
2019-3-6 16:50 上传
moveMass的代码比较简单,先看看这一部分。Mass的运动分是个减速过程,喷射时Mass带有较高的初速度,然后每一帧减速0.5,直到停止。代码后半部分还对Mass撞上边缘的情况做处理。
function moveMass(mass) {
var deg = Math.atan2(mass.target.y, mass.target.x);
var deltaY = mass.speed * Math.sin(deg);
var deltaX = mass.speed * Math.cos(deg);
mass.speed -= 0.5;
if(mass.speed < 0) {
mass.speed = 0;
}
if (!isNaN(deltaY))