`

web策略类游戏开发(二) WebGame事件

    博客分类:
  • Game
阅读更多

作者:Yahle
曾用网名:Dogvane
原载:http://www.cnblogs.com/yahle
版权所有。转载时必须以链接形式注明作者和原始出处。
 


1 事件系统

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

1.1 事件的概念
事件是指游戏里玩家的某个(系列)活动,它可以分为瞬时活动和非瞬时活动。
瞬时活动顾名思义就是在玩家发出指令的瞬间就能完成的活动。像RPG游戏里,玩家从NPC里购买一瓶药水,在玩家发出这个指令后,玩家的金钱减少,并获得药水,这一切都在玩家发出指令后瞬间完成(当然实际逻辑上处理还需要几个ms处理时间)。
而非瞬时活动则是在玩家发出某个指令后一段事件才会被执行。例如RPG里玩家鼠标点击地图上某个地方,游戏角色则会自动行走到刚才点击处。这个移动过程就是一个非瞬时过程,它有了一个移动的过程,这个过程需要消耗一定的时间(玩家能感知的事件)
非瞬时系列活动是指一位或者多位玩家通过一系列的瞬时\非瞬时活动完成一个动作(功能)。例如wow里面的拍卖场,有1位玩家提供道具,同服务器里的其他玩家对该道具进行竞拍。
在WebGame里,玩家的很多操作其实是非瞬时部分事件是村庄资源减少(前提投资),非瞬时事件是建筑物建设,这个动作(同能)的结果是建筑物等级上升。
又比如《Travian》里的攻击,瞬时事件是当前村庄的士兵减少(派出部队),非瞬时事件是减少的士兵移动到需要攻击的村庄(行军过程),动作结束是,两个村庄的部队开打了(战斗)。

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

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

 

ID

int

VillageCode

int

TargetVillageCode

int

Type

int

EndTime

DateTime

EventObject

ntext

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

1.2.2 触发器
Asp.net
Asp.net的处理在触发器上的处理就比较简单了。在服务器程序启动的时候,就执行一个线程,定时(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);
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    public class SystemEvent
 6    {
 7        public static void DoEvent(DateTime time)
 8        {
 9            List<Event> evs = Event.GetEvents(time);
10            foreach (Event e in evs)
11            {
12                try
13                {
14                    IEvent ie = e.Object;
15                    if (ie != null)
16                    {
17                        ie.Parent = e;
18                        ie.DoEvent();
19                    }

20                }

21                catch (Exception ex)
22                {
23                    Common.Logging.Error(ex.ToString(), e.EventObject);
24                }

25                try
26                {
27                    e.Delete();    // 从数据库里删除信息
28                }

29                catch (Exception ex)
30                {
31                    Common.Logging.Error(ex.ToString());
32                }

33            }

34        }

35    }

36


php
PHP没用过,不过好像不能在PHP页面里无法创建线程,用纯PHP服务端来实现触发器估计有点难度。但是可以做成一个PHP的应用程序,由应用程序来实现触发器。

1.3 游戏资源的24小时自动增长
游戏资源的24小时自动增长,这是一个有趣的话题,很多刚开始设计WebGame的朋友都会在这个问题上卡一下。每个人对于如何实现这个功能都有自己的独到见解,我在这里就不能给出一个唯一的答案,这里给的解决方案只是自己正在做的WebGame用到的方案。
首先,我们否定了每个时间间隔(10分钟)就执行更新村庄资源的设计,这即不准确,同时也很消耗服务器资源。所以,我们的系统就只有在用户执行事件(瞬时的和非瞬时)的时候才将新的资源信息写入数据库。平时显示资源的时候用 
(当前时间 - 上一次更新事件)*资源每小时产量+上一次更新产量
公式计算出当前资源并显示在页面上。也就是说,每次页面更新时重新计算资源,但只只要用户没有做任何修改资源的动作(事件),就不会把重新计算后的资源写回数据库。
《Travian》在前台界面上看到资源不断的上涨其实是利用JavaScript实现的小效果。

分享到:
评论

相关推荐

    FLASH WEBGAME古装小游戏源码

    【标题】"FLASH WEBGAME古装小游戏源码"所涉及的知识点主要集中在Web游戏开发领域,特别是使用Adobe Flash技术创建的在线游戏。Flash Webgame是一种基于Adobe Flash平台开发的网络小游戏,它在过去曾广泛应用于网页...

    侠域WebGame源码下载

    【标题】:“侠域WebGame源码下载”指的是获取并研究一款名为“侠域”的Web...总之,“侠域WebGame源码下载”提供了一个宝贵的学习资源,无论是对初学者还是有经验的开发者,都能从中学习到Web游戏开发的全方位知识。

    一套完整的php webgame源码

    在Web开发领域,PHP是一种广泛应用的服务器端脚本语言,尤其在构建Webgame(网页游戏)方面具有显著优势。"一套完整的php webgame源码"提供了一个完整的PHP游戏开发实例,对于初学者来说,这是一个宝贵的资源,可以...

    游戏网站智能管理系统.net2.0_webgame.zip

    游戏网站智能管理系统是一款基于.NET 2.0框架开发的Web应用程序,主要针对网络游戏或电子娱乐类网站进行管理和运营。此系统旨在提供高效、便捷的后台管理功能,帮助网站管理员优化运营流程,提升用户体验,实现数据...

    XXXX年网页游戏市场分析.pptx

    Webgame大致可以分为Social Game(社交游戏)和Web Game,后者更侧重游戏本身而非社交互动。 2007年至2011年间,中国网页游戏市场规模呈现快速增长态势。据iResearch的数据,2009年是市场增长的关键期,市场规模和...

    webgame游戏策划

    ### Webgame游戏策划知识点 #### 一、网页在线游戏概述 网页在线游戏作为一种无需安装客户端的游戏形式,具有明显的优缺点: - **优点**: - 用户门槛低:几乎任何能够联网的计算机都能运行,便于玩家迅速加入...

    Travianx-master.zip_Travian-x_travian_travian 源码_webgame

    总的来说,通过对Travian 4.0源码的深度学习,不仅可以了解一款大型网络策略游戏的开发流程,还能掌握PHP编程、Web开发、数据库设计、游戏设计等多个领域的知识。这对于提升个人技能、理解游戏开发背后的复杂逻辑...

    Osori-WebGame:Osori网络游戏引擎项目

    Osori-WebGame引擎针对这类游戏进行了优化,提供了一套完整的塔防游戏框架,包括地图编辑器、单位路径规划、敌我单位行为控制、资源管理、升级系统等核心模块。开发者可以根据需求,快速构建并定制自己的塔防游戏...

    黑夜传说webame 源码

    总的来说,"黑夜传说Webgame"的源码涵盖了Web开发的众多核心技术,包括前端与后端开发、网络编程、游戏逻辑设计、性能优化以及安全防护。对于想要深入理解和学习Webgame开发的人来说,这是一个宝贵的资源,通过研究...

    ogame中文源代码(网络转载)

    通过分析源代码,我们可以学习到如何实现复杂的游戏循环、事件驱动以及状态机的设计,这对于任何想要开发策略类游戏的开发者都是宝贵的经验。 3. **前端技术** 前端部分展示了如何使用JavaScript(可能包括jQuery...

    react-webgame

    接下来,我们将探讨React Web游戏开发中的一些关键知识点: 1. **React组件**:React的核心是组件化,游戏的每个部分,如游戏板、角色、得分面板等,都可以被封装为独立的React组件,便于复用和维护。 2. **状态...

Global site tag (gtag.js) - Google Analytics