教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 范文大全 > 行业范文 >

web策略类游戏开发

来源:网络收集 时间:2026-09-04
导读: 1 体系结构 1.1 传统的网站的架构 传统的网站一般都是以N层结构一般N为3,就是我们常说的三层架构。 3层架构分为数据层、业务逻辑层、页面显示层。 1.2 WebGame的架构 WebGame可以看作是网站和游戏的结合体,因此它具备了这两类系统的特性。我们不但可以把We

1 体系结构

1.1 传统的网站的架构

传统的网站一般都是以N层结构一般N为3,就是我们常说的三层架构。

3层架构分为数据层、业务逻辑层、页面显示层。

1.2 WebGame的架构

WebGame可以看作是网站和游戏的结合体,因此它具备了这两类系统的特性。我们不但可以把WebGame看作是一个网站,也可以把它看作是一个网络游戏。

的网站是B/S结构,网络游戏则是C/S结构,WebGame则是这两者的结合我们暂且称之为B/C/S结构。既在用户眼里,它是一个通过浏览器范围的网站。在服务器系统里,它又是一个传统的C/S结构的网络游戏。

从上图分析,用户通过浏览器访问服务器的时候,首先是访问网页服务器,如windows平台下的IIS,linux下的Apache。在通过网页服务器,以某种特殊的方式(分布式访问,如.net下的remoting)去访问游戏服务器,通知游戏逻辑服务器执行玩家操作,并从游戏逻辑服务器里获得游戏相关的信息,或者直接通过访问数据库而获得游戏数据。

1.2.1 为什么要将服务器分为游戏服务器和网页服务器

网页服务器的特点是触发执行,及当有用户访问网页的时候,才会执行该网页的程序代码。而我们常见的WebGame(Ogame,Travian)这些游戏实际上是需要24小时不间断执行的,因此网页服务器的执行方式并不适合与游戏。因此我们另外需要一个应用程序来执行这些24小时不间断要做的事情。这也就是我们需要增加一个游戏服务器的原因。

1.3 Web三国的架构

因为目前Web三国是非商业开发,因此如果照搬上面的WebGame架构来设计,会导致开发

周期过长,开发效率低下的问题。实际上在开发初期,Web三国是按照上面的架构去开发,碰上了上述问题,才换了另外一种结构。

实际性现在Web三国的结构和WebGame架构差不多,只不过将游戏服务器集成到网页服务器里,项目里按照传统的网站架构,将游戏分为:数据层、游戏逻辑层、页面层。

至于如何实现24小时不间断处理,者是通过在游戏启动时,创建一个线程去处理。这个是http://www.77cn.com.cn里的一个功能,我不清楚php里是否也有这样的功能。

1 事件系统

事件系统是整个WebGame系统里一个核心的组成部分,我们用它来控制的进程,让游戏世界里能够24小时运转。

1.1 事件的概念

事件是指游戏里玩家的某个(系列)活动,它可以分为瞬时活动和非瞬时活动。

瞬时活动顾名思义就是在玩家发出指令的瞬间就能完成的活动。像RPG游戏里,玩家从NPC里购买一瓶药水,在玩家发出这个指令后,玩家的金钱减少,并获得药水,这一切都在玩家发出指令后瞬间完成(当然实际逻辑上处理还需要几个ms处理时间)。

而非瞬时活动则是在玩家发出某个指令后一段事件才会被执行。例如RPG里玩家鼠标点击地图上某个地方,游戏角色则会自动行走到刚才点击处。这个移动过程就是一个非瞬时过程,它有了一个移动的过程,这个过程需要消耗一定的时间(玩家能感知的事件)

非瞬时系列活动是指一位或者多位玩家通过一系列的瞬时\非瞬时活动完成一个动作(功能)。例如wow里面的拍卖场,有1位玩家提供道具,同服务器里的其他玩家对该道具进行竞拍。

在WebGame里,玩家的很多操作其实是非瞬时部分事件是村庄资源减少(前提投资),非瞬时事件是建筑物建设,这个动作(同能)的结果是建筑物等级上升。

又比如《Travian》里的攻击,瞬时事件是当前村庄的士兵减少(派出部队),非瞬时事件是减少的士兵移动到需要攻击的村庄(行军过程),动作结束是,两个村庄的部队开打了(战斗)。

1.2 触发器(事件队列)

前面说了瞬时事件和非瞬时事件的概念,当WebGame在24小时运转的时候,系统会产生大量的非瞬时事件,这些非瞬时事件不会在玩家点击页面时执行,而是需要等一段时间后才会执行,因此在游戏里把这些非瞬时事件拿出来,按事件的执行时间进行排序,组成一个事件队列。再通过一个触发器,在事件设定的执行时间到达的那时执行相对应的事件。 这里面就涉及到两个内容:

非瞬时的事件队列

事件触发器

1.2.1 事件队列

数据库除了用于存储外,其查询功能也非常强大,直接拿来做事件队列很合适。事件队列里通常保存事件涉及的对象(村庄),结束时间、事件类型以及事件相关参数等。

下表为我们系统里使用的事件表:

保存时将这些对象做xml序列化保存到EventObject字段里。当然如果为了效率还可以存储二进制序列化后的对象,这样在序列化以及反序列化时能节省大部分时间。

1.2.2 触发器

http://www.77cn.com.cn

http://www.77cn.com.cn的处理在触发器上的处理就比较简单了。在服务器程序启动的时候,就执行一个线程,定时(1s)从数据库里取结束时间<当前事件的事件进行处理。

1

/**////

<summary>

2 /// 事件处理线程

3 /// 每间隔1s处理一次到时间了的事件

4 ///

</summary>

5

static

void EventThread()

6 {

7 DateTime lastTime = DateTime.Now;

8 while (Run)

9 {

10 try

11 {

12 Event.SystemEvent.DoEvent(lastTime);

1 多线程下数据库并发更新的处理

1.1 背景

不知道大家在玩《Travian》时有没有做过这样的事情:

同时打开多个集结点,并设定好要出发的士兵及数量,在快到压秒的时候,快速切换页面,不断的点确定,以确保游戏不会通讯问题导致压秒失败。

再看一个教科书里经常提到的数据库脏数据的案例:

A操作从表里获得数据D=10,在计算的时候,线程刚好进行切换,切换到B,B也需要操作D,并从数据库里取道值为10,在进行简单操作(D=D- 2)后将D=8的值写回数据库。

B操作处理结束后,线程再切换回A操作,这时A在做自己的操作时,仍然采用先前取到D(10)的值,在进行一个简单操作(D=D-1)后,仍然写回数据库。这时,数据库里的值变为9,而实际上D的值应该是7(D=10-2-1).。造成这个问题主要是因为CPU在执行A、B操作时没有按照顺序来执行,而是让B抢先在A执行完之前执行,导致它们在计算D的时候,因为数据没有同步而发生写入脏数(A的数据覆盖了B的数据)据的问题。 A操作伪代码:

{

D=GetDB()

D=D-1

SetDB(D)

}

B操作伪代码:

{

D=GetDB()

D=D-2

SetDB(D)

}

一个简单的图表表示它们的操作:

13 }

14 catch (Exception ex)

15 {

16 Common.Logging.Error(ex.ToString());

17 }

18

19 long def = DateTime.Now.Ticks - lastTime.Ticks;

20 lastTime = DateTime.Now;

21

22 if (def <

10000000)

23 {

24 // 线程休息,并等待下一次时间间隔

25

int ms = (int)(10000000

- def) /

10000;

26 if (ms >

0)

27 System.Threading.Thread.Sleep(ms);

28 }

29 }

30 }

31

1

/**////

<summary>

2 /// 系统事件

3 /// 主要作用是执行处理事件的过程

4 ///

</summary>

5< …… 此处隐藏:5212字,全部文档内容请下载后查看。喜欢就下载吧 ……

web策略类游戏开发.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/fanwen/1984921.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)