开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1908

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1656|回复: 16

[碧俐千仞] 《球球大作战》源码解析—— (8)消息广播

[复制链接]  [移动端链接]
排名
17344
昨日变化
5

27

主题

182

帖子

711

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
31
蛮牛币
1962
威望
0
注册时间
2014-11-6
在线时间
112 小时
最后登录
2017-10-20

专栏作家

发表于 2017-9-27 23:19:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
知乎 @罗培羽

服务端程序中有3个定时器函数,前几篇分别解析了处理玩家移动的moveloop方法、以及处理排行榜、食物生成等游戏逻辑的gameloop。最后一个定时器函数为sendUpdates,调用语句是:setInterval(sendUpdates, 1000 / c.networkUpdateFactor),其中networkUpdateFactor默认值为40,即是每秒执行40次sendUpdates,处理消息的广播。sendUpdates会对每个玩家都做操作,具体的结构如下。

[AppleScript] 纯文本查看 复制代码
function sendUpdates() {
users.forEach( function(u) {
   ……
}
}


同步食物列表
那么看看foreach里面的内容,先获取对该用户可见的食物信息,这里通过范围判断,获取该用户视野范围内的食物,然后组合成visibleFood列表。后面只要把visibleFood的信息发送给该用户就好了,其他看不见的就不管了。

[AppleScript] 纯文本查看 复制代码
        var visibleFood  = food
            .map(function(f) {
                if ( f.x > u.x - u.screenWidth/2 - 20 &&
                    f.x < u.x + u.screenWidth/2 + 20 &&
                    f.y > u.y - u.screenHeight/2 - 20 &&
                    f.y < u.y + u.screenHeight/2 + 20) {
                    return f;
                }
            })
            .filter(function(f) { return f; });


同步病毒列表
使用同样的方法计算可见的病毒,产生同步列表visibleVirus。

[AppleScript] 纯文本查看 复制代码
        var visibleVirus  = virus
            .map(function(f) {
                if ( f.x > u.x - u.screenWidth/2 - f.radius &&
                    f.x < u.x + u.screenWidth/2 + f.radius &&
                    f.y > u.y - u.screenHeight/2 - f.radius &&
                    f.y < u.y + u.screenHeight/2 + f.radius) {
                    return f;
                }
            })
            .filter(function(f) { return f; });


同步massFood列表
使用同样的方法计算可见的massFood,产生同步列表visibleMass。

[AppleScript] 纯文本查看 复制代码
        var visibleMass = massFood
            .map(function(f) {
                if ( f.x+f.radius > u.x - u.screenWidth/2 - 20 &&
                    f.x-f.radius < u.x + u.screenWidth/2 + 20 &&
                    f.y+f.radius > u.y - u.screenHeight/2 - 20 &&
                    f.y-f.radius < u.y + u.screenHeight/2 + 20) {
                    return f;
                }
            })
            .filter(function(f) { return f; });


同步其他玩家
用类似的方法计算玩家可以看到的其他玩家,因为其他玩家可能有多个分身,这里对每个分身做处理。如果分身在可见范围内,就把相关的信息放到visibleCells 列表里面。列表里包括玩家自己的信息和其他玩家的信息,如果是其他玩家,还要加上他们的名字和id。

[AppleScript] 纯文本查看 复制代码
       var visibleCells  = users
            .map(function(f) {
                for(var z=0; z<f.cells.length; z++)
                {
                    if ( f.cells[z].x+f.cells[z].radius > u.x - u.screenWidth/2 - 20 &&
                        f.cells[z].x-f.cells[z].radius < u.x + u.screenWidth/2 + 20 &&
                        f.cells[z].y+f.cells[z].radius > u.y - u.screenHeight/2 - 20 &&
                        f.cells[z].y-f.cells[z].radius < u.y + u.screenHeight/2 + 20) {
                        z = f.cells.lenth;
                        if(f.id !== u.id) {
                            return {
                                id: f.id,
                                x: f.x,
                                y: f.y,
                                cells: f.cells,
                                massTotal: Math.round(f.massTotal),
                                hue: f.hue,
                                name: f.name
                            };
                        } else {
                            //console.log("Nombre: " + f.name + " Es Usuario");
                            return {
                                x: f.x,
                                y: f.y,
                                cells: f.cells,
                                massTotal: Math.round(f.massTotal),
                                hue: f.hue,
                            };
                        }
                    }
                }
            })
            .filter(function(f) { return f; });


发送数据
最后就是发送数据了,服务端发送serverTellPlayerMove协议,并且把可见食物、可见其他玩家部位、可见的mass和病毒发过去。如果排行榜发生了变化,还通过leaderboard协议把排行榜数据发送出去。客户端收到协议后,更新画面。

[AppleScript] 纯文本查看 复制代码
        sockets[u.id].emit('serverTellPlayerMove', visibleCells, visibleFood, visibleMass, visibleVirus);
        if (leaderboardChanged) {
            sockets[u.id].emit('leaderboard', {
                players: users.length,
                leaderboard: leaderboard
            });
        }
    });
    leaderboardChanged = false;




还是放个广告吧,笔者出版的一本书《网络游戏实战》充分的讲解怎样开发一款网络游戏,特别对网络框架设计、网络协议、数据处理等方面都有详细的描述,相信会是一本好书的。
球球大作战 源码解析84020.png




回复

使用道具 举报

5熟悉之中
751/1000
排名
8884
昨日变化
122

2

主题

547

帖子

751

积分

Rank: 5Rank: 5

UID
241666
好友
0
蛮牛币
2889
威望
0
注册时间
2017-9-6
在线时间
108 小时
最后登录
2017-10-24
发表于 2017-9-28 06:09:14 来自Mobile--- | 显示全部楼层
感谢分享

回复

使用道具 举报

7日久生情
1975/5000
排名
6332
昨日变化
48

4

主题

1622

帖子

1975

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
209186
好友
3
蛮牛币
2561
威望
0
注册时间
2017-3-1
在线时间
191 小时
最后登录
2017-10-23
发表于 2017-9-28 08:53:24 | 显示全部楼层
好东西,谢分享

回复

使用道具 举报

9以坛为家
17447/50000
排名
1167
昨日变化
3

98

主题

1万

帖子

1万

积分

Rank: 9Rank: 9Rank: 9

UID
78862
好友
7
蛮牛币
10026
威望
0
注册时间
2015-3-11
在线时间
1590 小时
最后登录
2017-10-24
QQ
发表于 2017-9-28 09:12:12 | 显示全部楼层
罗老师,你好,我看了你的这本书收获挺大的,之前一直搞客户端,现在也想往服务器方向发展,我想问问您有没有服务器架构方面的书籍,谢谢!

回复 支持 反对

使用道具 举报

4四处流浪
312/500
排名
9134
昨日变化
106

2

主题

89

帖子

312

积分

Rank: 4

UID
18138
好友
1
蛮牛币
734
威望
0
注册时间
2014-3-19
在线时间
129 小时
最后登录
2017-10-23
发表于 2017-9-28 09:31:48 | 显示全部楼层
简单易懂一看就明白了这是啥

回复 支持 反对

使用道具 举报

排名
17344
昨日变化
5

27

主题

182

帖子

711

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
31
蛮牛币
1962
威望
0
注册时间
2014-11-6
在线时间
112 小时
最后登录
2017-10-20

专栏作家

 楼主| 发表于 2017-9-28 09:50:33 | 显示全部楼层
lilexy 发表于 2017-9-28 09:12
罗老师,你好,我看了你的这本书收获挺大的,之前一直搞客户端,现在也想往服务器方向发展,我想问问您有没 ...

服务端的书籍确实少啊,推荐的话下面的书可以参加下,第一本需要有点基础,第二本是因为redis和服务端设计有很多相通的地方。
《Linux多线程服务端编程 使用muduo C++网络库》  陈硕
《Redis源码设计与实现(第二版)》   黄健宏

回复 支持 反对

使用道具 举报

9以坛为家
17447/50000
排名
1167
昨日变化
3

98

主题

1万

帖子

1万

积分

Rank: 9Rank: 9Rank: 9

UID
78862
好友
7
蛮牛币
10026
威望
0
注册时间
2015-3-11
在线时间
1590 小时
最后登录
2017-10-24
QQ
发表于 2017-9-28 11:38:59 | 显示全部楼层
tyxxxx 发表于 2017-9-28 09:50
服务端的书籍确实少啊,推荐的话下面的书可以参加下,第一本需要有点基础,第二本是因为redis和服务端设 ...

好的,非常感谢!!

回复 支持 反对

使用道具 举报

7日久生情
1865/5000
排名
17344
昨日变化
5

2

主题

1566

帖子

1865

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
185807
好友
0
蛮牛币
2518
威望
0
注册时间
2016-11-22
在线时间
274 小时
最后登录
2017-10-23
发表于 2017-9-28 14:18:09 | 显示全部楼层
赞,学习了,谢谢分享
[发帖际遇]: 东坡肘子2010 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

排名
13783
昨日变化
354

0

主题

21

帖子

84

积分

Rank: 2Rank: 2

UID
245707
好友
0
蛮牛币
66
威望
0
注册时间
2017-9-24
在线时间
23 小时
最后登录
2017-10-23
发表于 2017-9-28 17:56:44 | 显示全部楼层
谢谢楼主分享!

回复

使用道具 举报

5熟悉之中
571/1000
排名
5320
昨日变化
38

0

主题

222

帖子

571

积分

Rank: 5Rank: 5

UID
220310
好友
0
蛮牛币
906
威望
0
注册时间
2017-5-2
在线时间
151 小时
最后登录
2017-10-23
发表于 2017-9-29 09:41:17 | 显示全部楼层

回复

使用道具 举报

排名
14137
昨日变化
11

1

主题

12

帖子

80

积分

Rank: 2Rank: 2

UID
228559
好友
0
蛮牛币
266
威望
0
注册时间
2017-6-25
在线时间
29 小时
最后登录
2017-10-19
发表于 2017-9-29 10:48:52 | 显示全部楼层
是罗老师本人啊,我的天,最近在看这本书
[发帖际遇]: 游戏小猪 乐于助人,奖励 2 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

7日久生情
1975/5000
排名
6332
昨日变化
48

4

主题

1622

帖子

1975

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
209186
好友
3
蛮牛币
2561
威望
0
注册时间
2017-3-1
在线时间
191 小时
最后登录
2017-10-23
发表于 2017-9-30 09:19:37 | 显示全部楼层
谢谢分享

回复

使用道具 举报

7日久生情
1540/5000
排名
1252
昨日变化
6

27

主题

223

帖子

1540

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
124569
好友
24
蛮牛币
7662
威望
0
注册时间
2015-10-4
在线时间
534 小时
最后登录
2017-10-23
发表于 2017-10-2 09:34:36 | 显示全部楼层
6666666666666666

回复 支持 反对

使用道具 举报

排名
38787
昨日变化
154

0

主题

3

帖子

8

积分

Rank: 1

UID
145487
好友
0
蛮牛币
42
威望
0
注册时间
2016-4-14
在线时间
2 小时
最后登录
2017-10-11
发表于 2017-10-10 09:28:42 | 显示全部楼层
学习学习,感谢

回复

使用道具 举报

3偶尔光临
239/300
排名
10830
昨日变化
9

0

主题

124

帖子

239

积分

Rank: 3Rank: 3Rank: 3

UID
182268
好友
0
蛮牛币
268
威望
0
注册时间
2016-11-9
在线时间
49 小时
最后登录
2017-10-20
发表于 2017-10-11 11:29:05 | 显示全部楼层
我丝毫没有慌张,因为这是罗老师本人

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表