一个3D的多人在线游戏, 服务端 + 客户端 【转】
最近学院组织了一个实训,要求是利用Socket通信和D3D的知识, 写一个多人在线的游戏, 服务端是在linux下, 客户是在Windows下; 写这个的目的是想让大家给我找错, 欢迎大家的意见。我的QQ 是343167101,希望和大家一起讨论。
服务端(linux下):
服务端使用的是非阻塞Select模型,下面是项目的结构图:
![]()
由于其中有很多的消息,其次为了扩展,所以使用了工厂模式,我把从客户端接受的消息都放在输入缓冲区中, 向客户端发送的消息都放在输出缓冲区中, 为了对玩家进行管理
设计了一个Manager(单例)来管理玩家,主要是为了实现删除,添加,获取等操作, 所以就用了STL中Map这个容器。值得一提的是InputSocketStream是使用的一种循环队列的思
想设计的。
客户端:
客户端由于是在windows中,所以使用了Windows的socket通信,同时使用了多线程,其中一个线程主要是为了接受玩家的数据,主线程主要是为了负责逻辑和渲染。
渲染层的结构:
![]()
CUI端,目前做的比较简单就是使用CEGUI这个重量级的界面库,发现不是那么好用,太庞大了。
通信端:(主要是负责和服务器的通信),包括玩家和虚拟玩家的消息
![]()
想用的需要被指CEGUI 0.7.1
客户端的代码,: 由于资源文件太大了就不上传了
目前还存在的问题就是虚拟玩家的同步问题,不知到有高手懂这个问题的吗,提供个思路.
我的思路是这样的,比如玩家按下W键,向服务器发送这个消息,服务器负责转发给其他的客户端,该客户端开始走动,知道玩家抬起W键后发送停止的消息给服务器,服务器负责转发。但是在实现这个问题的时候,由于我使用了DiretInput,但是响应Keydown事件时,按下W键时,Keydown执行了很多次,没有找到一个办法知道keydown这个事件什么时候停止的。谁有好的做法希望能告诉我。
一个3D的多人在线游戏, 服务端 + 客户端 【转】的更多相关文章
- 【坦克大战】Unity3D多人在线游戏(泰课的坦克大战--旋转的螺丝钉)
[坦克大战]Unity3D多人在线游戏 http://www.taikr.com/my/course/937 1.NetworkManager的介绍: 说明:选择固定生成时会自动寻找有StartPos ...
- 游戏服务端中使用Servlet和Java注解的一个好设计
SNS类游戏基本都是使用HTTP短连接,用Java来开发服务端时能够使用Servlet+Tomcat非常轻松的架构起服务端来.在这里介绍一种使用Servlet比較好的一种设计,我也见过非常多基于HTT ...
- 为什么多数游戏服务端是用 C++ 来写
早年开发游戏必须用C++,这没得说,2000-2004年,java还没有nio,其他动态语言不抗重负,只能C/C++能开发出完整可用的游戏服务端.直到2005年,韩国的游戏很多都还是纯C++写服务端, ...
- 转: 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端
from: http://ybak.iteye.com/blog/1853335 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端 游戏服 ...
- kbengine开源分布式游戏服务端引擎
一款开源的支持多人同时在线实时游戏的服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互,使用KBEngine插件能够快速与(Unity3D.OGRE.Cocos2d.HTML5,等等)技术结 ...
- 看懂 游戏《Minecraft》的崩溃报告 服务端/客户端
如何看懂Minecraft报错的关键信息. 让你如何看懂Minecraft报错 前言 一些俏皮话 寻找崩溃日志 打开崩溃日志 重要的事说三遍 下载文本编辑器 开始分析 深度分析 得出结论 修复报错 解 ...
- go语言游戏服务端开发(三)——服务机制
五邑隐侠,本名关健昌,12年游戏生涯. 本教程以Go语言为例. P2P网络为服务进程间.服务进程与客户端间通信提供了便利,在这个基础上可以搭建服务. 在服务层,通信包可以通过定义协议号来确定该包怎 ...
- Pomelo:网易开源基于 Node.js 的游戏服务端框架
Pomelo:网易开源基于 Node.js 的游戏服务端框架 https://github.com/NetEase/pomelo/wiki/Home-in-Chinese
- 浏览器在一次 HTTP 请求中,需要传输一个 4097 字节的文本数据给服务端,可以采用那些方式?
浏览器在一次 HTTP 请求中,需要传输一个 4097 字节的文本数据给服务端,可以采用那些方式? 存入 IndexdDB 写入 COOKIE 放在 URL 参数 写入 Session 使用 POST ...
随机推荐
- TextView的一些高级应用(自定义字体、显示多种颜色、添加阴影)
1. 自定义字体可以使用setTypeface(Typeface)方法来设置文本框内文本的字体,而android的Typeface又使用TTF字体文件来设置字体所以,我们可以在程序中放入TTF字 ...
- linux环境变量查看及修改
例如用命令 echo $PATH 则可以查看该环境变量为/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 添加环境定义一个变量 ...
- my sql
如果改了上面的4个配置文件,要让其立即生效,可以使用如下方法 source .bash_profile . .bash_profile 基于Apache+php+mysql的许愿墙网站的搭建 方案一: ...
- Linux中vi、vim命令大全
一.一般模式:删除.复制与粘贴类命令 x,X x为向后删除一个字符,X为先前删除一个字符 nx(n代表数字) 向后删除n个字符 dd 删除当前行 D 删除当前行所有字符,试成为空行 ndd(n代表数字 ...
- Magicodes.WeiChat——利用纷纭打造云日志频道
纷纭,是个免费的渠道集成工具.这里我就不多介绍了,右侧是飞机票:https://lesschat.com/ 在开发或者在运维情况下,我们经常需要查看并关注服务器端日志以确保程序是否健康运行.尤其是在微 ...
- MySql、SqlServer、Oracle 三种数据库查询分页方式
SQL Server关于分页 SQL 的资料许多,有的使用存储过程,有的使用游标.本人不喜欢使用游标,我觉得它耗资.效率低:使用存储过程是个不错的选择,因为存储过程是颠末预编译的,执行效率高,也更灵活 ...
- C# 类型转换问题一
问题描述:double类型向int类型的一个转化 详细描述:课上,我们的web老师,利用C#重新温故了我们初学C语言时的一个小程序——给定成绩,有程序判定等级.学过C语言的童鞋想必都知道这个switc ...
- 工作圈redis 使用
redis作为内存数据库,更多的是作为内存cache来使用. 再所负责的工作圈中的使用,主要是分两方面: 1.数据对象: 主题的内容存储 主题回复内容的存储 用户信息存储 圈子信息存储 2.各数据对象 ...
- Javascript中prototype属性的详解
原文链接:http://www.cnblogs.com/Uncle-Keith/p/5834289.html 在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象 ...
- atitit 提升数据库死锁处理总结
atitit 提升数据库死锁处理总结 正常的来说,锁上都是自动的..不用官.. 正常来讲,insert时不需要加rowlock,就默认是rowlock了, #-----锁的自动转换原理.(正常的不用理 ...