最近学院组织了一个实训,要求是利用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的多人在线游戏, 服务端 + 客户端 【转】的更多相关文章

  1. 【坦克大战】Unity3D多人在线游戏(泰课的坦克大战--旋转的螺丝钉)

    [坦克大战]Unity3D多人在线游戏 http://www.taikr.com/my/course/937 1.NetworkManager的介绍: 说明:选择固定生成时会自动寻找有StartPos ...

  2. 游戏服务端中使用Servlet和Java注解的一个好设计

    SNS类游戏基本都是使用HTTP短连接,用Java来开发服务端时能够使用Servlet+Tomcat非常轻松的架构起服务端来.在这里介绍一种使用Servlet比較好的一种设计,我也见过非常多基于HTT ...

  3. 为什么多数游戏服务端是用 C++ 来写

    早年开发游戏必须用C++,这没得说,2000-2004年,java还没有nio,其他动态语言不抗重负,只能C/C++能开发出完整可用的游戏服务端.直到2005年,韩国的游戏很多都还是纯C++写服务端, ...

  4. 转: 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端

    from: http://ybak.iteye.com/blog/1853335 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端 游戏服 ...

  5. kbengine开源分布式游戏服务端引擎

    一款开源的支持多人同时在线实时游戏的服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互,使用KBEngine插件能够快速与(Unity3D.OGRE.Cocos2d.HTML5,等等)技术结 ...

  6. 看懂 游戏《Minecraft》的崩溃报告 服务端/客户端

    如何看懂Minecraft报错的关键信息. 让你如何看懂Minecraft报错 前言 一些俏皮话 寻找崩溃日志 打开崩溃日志 重要的事说三遍 下载文本编辑器 开始分析 深度分析 得出结论 修复报错 解 ...

  7. go语言游戏服务端开发(三)——服务机制

    五邑隐侠,本名关健昌,12年游戏生涯. 本教程以Go语言为例.   P2P网络为服务进程间.服务进程与客户端间通信提供了便利,在这个基础上可以搭建服务. 在服务层,通信包可以通过定义协议号来确定该包怎 ...

  8. Pomelo:网易开源基于 Node.js 的游戏服务端框架

    Pomelo:网易开源基于 Node.js 的游戏服务端框架 https://github.com/NetEase/pomelo/wiki/Home-in-Chinese

  9. 浏览器在一次 HTTP 请求中,需要传输一个 4097 字节的文本数据给服务端,可以采用那些方式?

    浏览器在一次 HTTP 请求中,需要传输一个 4097 字节的文本数据给服务端,可以采用那些方式? 存入 IndexdDB 写入 COOKIE 放在 URL 参数 写入 Session 使用 POST ...

随机推荐

  1. 【Java学习笔记】<集合框架>TreeSet,Comparable,Comparator

    public class Person implements Comparable{ private String name; private int age; public Person(){ su ...

  2. Hadoop MapReduce编程创建maven项目时所用到的pom依赖

    <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> & ...

  3. C++ set使用

    C++ set使用 实际上c++ STL中的set是的实现和C++ STL中的map的实现的底层数据结构是一样的,如果我们不在考虑红黑树中的卫星数据,而只是关键字,那么同样不允许key值得重复,那么就 ...

  4. 第35讲:List的map、flatMap、foreach、filter操作代码实战

    List类的高阶方法          val fmap = List( 1,2 ,3). map { _ + 1 } //List(2, 3, 4)    val fruit_rev2 = frui ...

  5. java基础-jdbc——三种方式加载驱动建立连接

    String url = "jdbc:mysql://localhost:3306/student?Unicode=true&characterEncoding=utf-8" ...

  6. MongoDB新增及查询数据(一)

    新增操作    insert函数会添加一个文档到集合里面.例如我们要登记一个人的信息,首先我们在shell力创建一个局部变量person,其记录了人的姓名和性别,我们通过db.persons.inse ...

  7. C#执行OracleHelper

    /// <summary> /// 执行存储过程获取带有Out的参数 /// </summary> /// <param name="cmdText" ...

  8. Android UI开发【开篇导航】

    如今移动互联网正处于飞速发展的时期,正式看中这个行业的发展势头,本人在2011年从.NET转行做了移动应用开发这块,接触了android和ios开发,到今已快3个年头,先前忙于学习各种基础知识和语法方 ...

  9. windowsXP用户被禁用导致不能网站登录

    1.查看系统事件,发现弹出如下的错误 2.根据上面的错误,我们很容易就可以判断是禁用了账户引起的 2.1后面进入计算机管理,再进入用户管理 2.2双击点开Internet来宾用于,发现此用户已经停用了 ...

  10. ASP.NET中GridView控件删除数据的两种方法

      今天在用GridView控件时,发现了一个问题,就是使用GridView控件在删除数据时的问题.接下来我们通过模板列方式和CommandField方式删除某条数据讲解下两者之间的区别. 方式一:通 ...