媒体号
首页
原创
论坛
产品库
开测表
招聘
首页
原创
论坛
产品库
开测表
招聘
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
最新评论
暂无评论
参与评论
推广
开测游戏
查看更多
王于兴师
模拟
上线
研发 : Guangdong Liwei Network Technology Co.,Ltd
胜利女神:新的希望
射击
上线
发行 : 腾讯游戏
洛克人:时空裂隙
横版
上线
研发 : 云畅游戏
无声冲突
飞行射击
上线
研发 : 谷得游戏
发行 : TBG LIMITED
踏风行
角色扮演
上线
研发 : 祖龙游戏
热血美职篮-5.8正式上线
篮球
上线
研发 : 腾讯游戏
商务合作
查看更多
蘑菇岛
降妖伏魔录
斗道世界
点点传说
编辑推荐
查看更多
王者荣耀世界
黑暗世界:因与果
AI LIMIT 无限机兵
龙息:神寂-正版龙与地下城联动
【爆款新游】【潜力佳作】分析系列
推广
推广