媒体号
首页
原创
论坛
产品库
开测表
招聘
首页
原创
论坛
产品库
开测表
招聘
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
最新评论
暂无评论
参与评论
推广
开测游戏
查看更多
三国:谋定天下
SLG
上线
研发 | 发行 : bilibili游戏
少年西游记2
卡牌
上线
发行 : 游族网络
剑灵2
RPG
限量删档首测
研发 : NCsoft Corporation
发行 : 腾讯游戏
歧路旅人:大陆的霸者
JRPG
公测
研发 : SQUARE ENIX
发行 : 网易游戏
地下城与勇士:起源
RPG
上线
研发 : Neople
发行 : 腾讯游戏
鸣潮
RPG
公测
研发 : 库洛游戏
商务合作
查看更多
家具装修师
金牛座之战
InOutPath
炼丹模拟器
编辑推荐
查看更多
射雕-武侠大世界
Balatro
逆战:未来-逆战手游
山河旅探
推广
推广