QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: sjinny

关于网络游戏的初步设想

[复制链接]
发表于 2003-9-12 19:53:23 | 显示全部楼层
《浅谈网络游戏服务器端的设计- 网络的游戏构思》中
“一个网络游戏是否能够成功,就看它是否能引入一种游戏规则,让玩家一上手就觉得自己不得不不停的做一件在他认为是很有意义的事”
这句话很有启发意义
回复

使用道具 举报

 楼主| 发表于 2003-9-12 21:56:49 | 显示全部楼层
开发游戏的出发点:站在玩家的角度,和站在商家的角度。
我觉得好的游戏和好的文学作品、好的电影一样,能让有得到些什么,而不仅仅是打发时间。
不好的游戏则是诱惑玩家去浪费时间。
读好的小说和读垃圾小说,其结果是不同的;玩游戏也一样。
游戏的灵魂是剧情:即可能是电脑里的剧情,也可能是玩家与玩家之间的剧情。我们搞程序的人的任务,就是帮助策划去展现剧情,帮助玩家去参与和创造剧情。
回复

使用道具 举报

发表于 2003-9-13 21:01:22 | 显示全部楼层
[quote:b5641079e7="deaboway"]《浅谈网络游戏服务器端的设计- 网络的游戏构思》中
“一个网络游戏是否能够成功,就看它是否能引入一种游戏规则,让玩家一上手就觉得自己不得不不停的做一件在他认为是很有意义的事”
这句话很有启发意义 [/quote]
我想我们暂且不谈剧情的,作为程序员还是关注自己的本职工作,我之所以提到这点,是想sjinny兄在规划游戏的时候考虑一下此方面的事,吸纳一些有关行业的人才啊~~
当然,好象有些为时过早,我们近期的目标是开发出一个Demo版就不错了
还有,在项目详细的计划出来前后,我们是否考虑开几次会议? ----
回复

使用道具 举报

 楼主| 发表于 2003-9-13 21:59:38 | 显示全部楼层
我想我把设计说明做详细点就可以了~~~
有时开会会变成聊天的~~
回复

使用道具 举报

发表于 2003-9-14 16:59:39 | 显示全部楼层
呵呵,好象也是~不过,聊一下天也不错呀
回复

使用道具 举报

发表于 2003-9-15 06:46:39 | 显示全部楼层
[quote:bad5cbd7a1="deaboway"][quote:bad5cbd7a1="rocklgk"]是的传奇这个游戏就是这样,把大部分的内容都放在服务器上,也就是说消息和决策都有服务器来执行,这样可以避免外挂(虽然现在外挂还是很猖獗 ),但你看看石器那个大大的客户端就知道了为什么石器的外挂更无赖,不过现在我们考虑这些问题还早吧。    最后祝你短暂的传奇旅程愉快![/quote]

没办法,只好再找服务端来看看了。 [/quote]

你可以去找传奇的私服
网上应该有下载的
盗版光盘也有的卖
不过那个东西更弱智
你还要准备好配置BDE的数据库引擎
我记得好像是一共有三到四个独立进程在运行
另外重点可以看看里面的命令是怎么交互的
比如GM命令接口在哪里
回复

使用道具 举报

 楼主| 发表于 2003-9-15 12:59:55 | 显示全部楼层
关于客户端:
设想一下:像CS一样,屏幕中心有一个准心,当有键盘或鼠标事件时,这些事件针对的对象就是准心当前所指向的东东。比如定义鼠标左键是使用剑攻击的技能,鼠标右键是施展轻功。于是,当用户按下鼠标左键后,从窗口系统得到一个用户事件,然后我使用屏幕中心的坐标找到准心所指向的对象,然后就把这个事件发送给这个对象自己的消息队列。有一个线程,专门遍历所有对象,从消息队列里取出一个消息并处理之。当这个对象“被施展攻击技能”这个消息被处理时,会把这个消息发送给服务器,怎么发送呢?假如一个网络模块对象叫net,那么就是调用net.send(id, 消息类型, 消息内容)。其实这只是把消息转移到了网络对象的消息队列里,然后这个对象的操作就返回,那个线程就去处理其他对象的消息。网络对象自己使用一个线程,从消息队列里取出每个消息,然后发送给服务器。
这些都是一条消息流,另一条消息流是从服务器来的信息。网络模块还有一个线程,检测是否有数据从服务器发来,把接受到的信息作为消息分发给各个对象,然后由它们自己去处理。
关于服务器端:
网络方面其实是和客户端上的网络模块差不多的,区别在于向外发送的信息不是从用户那来的,而是 各个对象根据收到的消息来做出响应 而产生的消息。当然,可能也要提供接口,让管理员在服务器端做一些操作。另外,客户端一般只需要和服务器端通信,也不会有消息广播;服务器端要和很多客户端通信,也需要有 广播数据 的功能。

另外,网络模块要负责维持(或维护)和服务器/客户端之间的网络连接,确保能尽量早的发现网络方面的问题

所以,网络模块其实是独立的,除了消息队列的操作,它不会去调用别的对象的多少成员函数;而除了消息队列的操作,别的对象一般也不会去调用网络对象的成员函数。


暂时只考虑到这么多,先发上来给大家讨论讨论~
回复

使用道具 举报

 楼主| 发表于 2003-9-16 00:13:22 | 显示全部楼层
我画了一个结构简图(客户端的,但是服务器端和它差不多)。
今天太晚了,以后再把说明发上来~

本帖子中包含更多资源

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

×
回复

使用道具 举报

 楼主| 发表于 2003-9-16 14:08:56 | 显示全部楼层
如上图所示,客户端里,各个模块之间是靠“消息”联系起来的。
我认为可以这样:
每个模块都使用至少一个线程,使用一个消息队列。每个模块都作为一个对象而存在。
由一个线程不停地做下面的操作:
调用一个对象的处理消息的函数,不使用参数,这时会去读取消息列表(如果没有消息就等待消息),然后这个模块就会去处理自己的事务,等处理完了,函数就返回,然后这个线程再调用这个函数……一直到程序出错或退出。
这样,各个模块之间就不会互相等待,比如网络模块收到了一个数据包,就可以把它变成一个消息交给仿真模块,然后再去检查是否有其他数据到达,而不用等待仿真模块把这个消息处理掉再去检查是否有其他数据到达。
下图是这种模块机制的一个模式图。

对于上图,一个典型的消息流是这样的:
网络模块收到一个数据包 -> 转变为一个消息并发送给Rule模块,由这个规则模块负责检测这个消息是否合法,以及对这个消息进行修正以使其合法,如果最终能得到一个合法消息,就发送给World模块 -> World模块就是仿真模块(使用八叉树),当收到消息后会将其分发给与这个消息对应的一个对象(在八叉树里),然后由仿真模块的线程来统一更新对象状态
然后显示模块的线程会定时读取仿真模块里对象的状态并渲染出来。

对不起,这个消息流并不是客户端上的典型的消息流,只是我现在还没能把客户端和服务器端完全区分开来。

本帖子中包含更多资源

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

×
回复

使用道具 举报

发表于 2003-9-18 19:04:13 | 显示全部楼层
这几天我在看浙江大学出版的《Linux内核源代码分析》重的第七章——用socket进行进程间通信部分,帮助还是很大的,只可惜内核使用C编写的,而且书中只讲了有关Linux内部的进程间通讯,而没有讲使用socket进行网络通信的部分……
还是要去买书阿!谁能推荐一本好一些的书阿?
回复

使用道具 举报

发表于 2003-9-18 22:25:40 | 显示全部楼层
http://www.fanqiang.com/a4/b7/index.html
去这看看,不错,里面有一篇《Proxy源代码分析--谈谈如何学习linux网络编程》,是一个经典程序的经典讲解,不过程序有错误,看完之后要动手找出来。
回复

使用道具 举报

 楼主| 发表于 2003-9-18 22:29:53 | 显示全部楼层
楼上二位,怎么不对我的设计发表点评论啊? ;)
回复

使用道具 举报

发表于 2003-9-20 10:00:21 | 显示全部楼层
rocklgk, 这个网站不错,哈哈
sjinny, 呵呵,不好意思……
各个模块之间是靠“消息”联系起来的

这句话绝对正确。我现在考虑的是各个模块间到底如何通讯的问题:
我们知道在计算机通讯的C/S模式中,如果基于socket,那么在服务端——首先调用sys_sockercall来进入socket;然后,创建端口,用sys_bind绑定端口地址;再用sys_listen侦听网络消息队列,此时,如果客户端有连接请求,服务器端又有空余的端口和进程可以使用,就通过鸡生蛋的方式新建一个端口通过sys_accept接受请求。
而在客户端——首先也是调用sys_sockercall来进入socket;然后,创建端口;接着,通过aya_connect向服务器端提出连接请求,如果被服务器端接受,则客户端和服务器端通过sys_sendmsg和sys_recvmsg实现报文的接收和发送……

我还是画个图把,如下:
回复

使用道具 举报

发表于 2003-9-20 10:42:02 | 显示全部楼层

我的Visio坏掉了,只好用画图了,还好可以看:)

回复

使用道具 举报

发表于 2003-9-20 10:46:24 | 显示全部楼层
上传图片好麻烦啊,我要先把他传到校友录,然后才能连接过来,不爽啊!
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-9 03:11 , Processed in 0.051250 second(s), 13 queries .

© 2021 Powered by Discuz! X3.5.

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