媒体号
首页
原创
论坛
产品库
开测表
榜单
招聘
首页
原创
论坛
产品库
开测表
榜单
招聘
论坛
更多
登录
GameRes游资网在以下平台有媒体号,欢迎关注收藏:
微信公众号
微博
头条号
百家号
网易号
知乎号
开
放
分
享
游戏梦的起点!
投稿邮箱:news@gameres.com
产品邮箱:cp@gameres.com
产业
专访
厂商
观察·投资
产品
政策
电子竞技
直播
区块链
元宇宙
人工智能
平台
手游
页游·H5
端游·PC
主机
虚拟·VR·AR
云游戏
研发
拆解分析
策划
程序·引擎
美术
音乐
测试
市场
职场·创业
运营·渠道
海外
数据·报告
App Store
Steam
其他
硬件·周边
八卦
活动
综合
《球球大作战》源码解析(7):游戏循环
作者:罗培羽
2019-03-22
分享
球球大作战-领金蘑菇
厂商:巨人网络科技有限公司
发行:Giant Network Technology Co., Ltd.
7
系列文章
《球球大作战》源码解析——(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
收藏
评论
评论
侧栏打开
登录
后参与讨论
暂无评论,来抢沙发
相关推荐
UF2025(Shanghai)——《命运扳机》大世界渲染技术深度解析:全局光照与阴影系统的工程实践
聚势增长!Unity 确认参展 2025 ChinaJoy BTOB
维塔士获选加入虚幻引擎服务合作伙伴计划
从一粒尘埃到黑洞:《成为黑洞》把太空吞噬做成短局增量
推广
开测游戏
查看更多
幻兽帕鲁
抓宠
限量删档测试
研发 : 新闻消息
异人之下
多平台
限量删档终测
研发 : 腾讯
蓝色星原:旅谣
收集
上线
研发 : 积咪网络
发行 : 蛮奈网络
影之刃零
恋爱
上线
研发 : 灵游坊
发行 : S-GAME Publishing
三国志:王道天下
3D
限量删档计费
研发 : 哔哩哔哩游戏
饼干人联盟
多平台
限量删档计费测试
研发 : 儒意景秀
发行 : 景秀游戏
编辑推荐
查看更多
失落城堡2
塔塔冒险队
剑侠世界4:无限
篮球少女:飞跃巅峰
【爆款新游】【潜力佳作】分析系列
推广
类魂游戏设计专题
推广