媒体号
首页
原创
论坛
产品库
开测表
招聘
首页
原创
论坛
产品库
开测表
招聘
More
GameRes游资网在以下平台有媒体号,欢迎关注收藏:
微信公众号
微博
头条号
百家号
网易号
知乎号
开
放
分
享
游戏梦的起点!
投稿邮箱:news@gameres.com
产品邮箱:cp@gameres.com
厂商·专访
产品
观察·投资
专访
电子竞技
区块链
直播
政策
元宇宙
人工智能
手游
虚拟·VR·AR
页游·H5
端游·PC
主机
云游戏
拆解分析
策划
程序·引擎
美术
音乐
测试
数据·报告
运营·渠道
职场·创业
Steam
App Store
海外
八卦
活动
综合
硬件·周边
扫一扫,手机打开
《球球大作战》源码解析(7):游戏循环
作者:罗培羽
2019-03-22
系列文章
《球球大作战》源码解析——(1)运行起来
《球球大作战》源码解析:服务器与客户端架构
《球球大作战》源码解析:移动算法
《球球大作战》源码解析(6):碰撞处理
《球球大作战》源码解析(7):游戏循环
《球球大作战》源码解析(8):消息广播
服务端程序中有3个定时器函数,前两篇解析的moveloop方法处理了玩家的移动,另外两个方法分别是gameloop和sendUpdates。其中gameloop负责排行榜和食物产生等逻辑。gameloop是在定时器中调用,相关语句为:setInterval(gameloop, 1000),即每秒执行1次。下图为游戏右上角的排行榜。
排行榜
gameloop先将user表按照重量大小排序,然后把前10名放到topUsers列表中,代码如下所示。
function gameloop() {
if (users.length > 0) {
users.sort( function(a, b) { return b.massTotal - a.massTotal; });
var topUsers = [];
for (var i = 0; i < Math.min(10, users.length); i++) {
if(users[i].type == 'player') {
topUsers.push({
id: users[i].id,
name: users[i].name
});
}
}
……
}
复制代码
紧接着更新leaderboard列表,如果topUsers较之前有改变的话,就标记leaderboardChanged,这样可以减少不必要的消息 同步,只发送有更改的数据。
if (isNaN(leaderboard) || leaderboard.length !== topUsers.length) {
leaderboard = topUsers;
leaderboardChanged = true;
}
else {
for (i = 0; i < leaderboard.length; i++) {
if (leaderboard[i].id !== topUsers[i].id) {
leaderboard = topUsers;
leaderboardChanged = true;
break;
}
}
}
复制代码
质量损失
如果小球质量较大,那么它会定时损耗质量,相关代码如下所示。
for (i = 0; i < users.length; i++) {
for(var z=0; z < users[i].cells.length; z++) {
if (users[i].cells[z].mass * (1 - (c.massLossRate / 1000)) > c.defaultPlayerMass && users[i].massTotal > c.minMassLoss) {
var massLoss = users[i].cells[z].mass * (1 - (c.massLossRate / 1000));
users[i].massTotal -= users[i].cells[z].mass - massLoss;
users[i].cells[z].mass = massLoss;
}
}
}
复制代码
食物和病毒
最后gameloop调用balanceMass方法,它先计算现在场上所有食物和所有玩家的质量之和,然后看看食物会不会太少,如果太少则调用addFood添加食物,多了就减少一些食物。同理,也增加或减少一些病毒。
function balanceMass() {
var totalMass = food.length * c.foodMass +
users
.map(function(u) {return u.massTotal; })
.reduce(function(pu,cu) { return pu+cu;}, 0);
var massDiff = c.gameMass - totalMass;
var maxFoodDiff = c.maxFood - food.length;
var foodDiff = parseInt(massDiff / c.foodMass) - maxFoodDiff;
var foodToAdd = Math.min(foodDiff, maxFoodDiff);
var foodToRemove = -Math.max(foodDiff, maxFoodDiff);
if (foodToAdd > 0) {
//console.log('[DEBUG] Adding ' + foodToAdd + ' food to level!');
addFood(foodToAdd);
//console.log('[DEBUG] Mass rebalanced!');
}
else if (foodToRemove > 0) {
//console.log('[DEBUG] Removing ' + foodToRemove + ' food from level!');
removeFood(foodToRemove);
//console.log('[DEBUG] Mass rebalanced!');
}
var virusToAdd = c.maxVirus - virus.length;
if (virusToAdd > 0) {
addVirus(virusToAdd);
}
}
复制代码
最后依然还是放个广告吧,笔者出版的一本书《Unity3D网络游戏实战》充分的讲解怎样开发一款网络游戏,特别对网络框架设计、网络协议、数据处理等方面都有详细的描述,相信会是一本好书的。
作者:罗培羽
专栏地址:https://zhuanlan.zhihu.com/p/28488266
最新评论
暂无评论
参与评论
推广
开测游戏
查看更多
创造吧!我们的星球-新世界版
SOC
限量计费删档测试
研发 : 英雄互娱
发行 : 英雄互娱
银与绯
角色扮演
上线
发行 : 沐瞳
灵兽大冒险
回合
万灵测试
研发 : 网易游戏
发行 : 网易游戏
最终幻想14:水晶世界
近期热门预约
上线
研发 : 腾讯游戏
大奉打更人
MMO
限量删档计费测试
发行 : 景秀游戏
龙骑士学园
角色扮演
上线
研发 : 37手游
商务合作
查看更多
降妖伏魔录
斗道世界
点点传说
维斯塔的餐桌
编辑推荐
查看更多
暴吵萌厨
三国志幻想大陆2:枭之歌
胜利女神:新的希望
泡姆泡姆
【爆款新游】【潜力佳作】分析系列
推广
推广