支持: 0 | 反对: 0 | 打印 | 推荐 | 订阅 | 收藏
标题: web策略类游戏开发(二) 24小时执行的基础--事件系统
  本主题由 蕾歌薇儿 于 2007-11-13 00:20 提升 
dogvane
勋爵
Rank: 40Rank: 40Rank: 40Rank: 40Rank: 40



UID 22711
精华 6
积分 7234
帖子 139
威望 13
现金 7737 银币
金币 2 金币
阅读权限 60
注册 2007-4-22
状态 离线
发表于 2007-11-12 21:37  资料  个人空间  短消息 

网页游戏英雄之门
web策略类游戏开发(二) 24小时执行的基础--事件系统


1.1 事件系统
事件系统是整个WebGame系统里一个核心的组成部分,它控制着游戏的进程,使游戏世界里能够24小时运行
事件系统分为2个大部分
1.事件的逻辑处理
2.事件触发器
1.1.1 什么是事件
事件是指游戏里玩家玩家的某个活动,它可以分为瞬时活动和非瞬时活动。
瞬时活动顾名思义就是在玩家发出指令的瞬间就能完成的活动。想某些RPG游戏里,玩家从NPC里购买一瓶药水,在玩家发出这个指令后,玩家的金钱减少,药水增加1瓶,这一切都在玩家发出指令后瞬间完成(当然实际逻辑上处理还需要几个ms处理时间)。
而非瞬时活动则是在玩家发出某个指令后一段事件才会被执行。例如RPG里玩家鼠标点击地图上某个地方,游戏角色则会自动行走到刚才点击处。这个移动过程就是一个非瞬时过程,它有了一个移动的过程,这个过程需要消耗一定的时间(玩家能感知的事件)
WebGame里,玩家的很多操作可以看作时候瞬时事件和非瞬时事件的结合。
例如在《Travian》里升级建筑物,瞬时事件是村庄资源减少,非瞬时事件是建筑物建设,非瞬时事件的结果是建筑物等级上升。
有比如《Travian》里的攻击,瞬时事件是当前村庄的士兵减少,非瞬时事件是减少的士兵移动到需要攻击的村庄,结果是,两个村庄开打了。
1.1.2 触发器(事件队列)
前面说了瞬时事件和非瞬时事件的概念,当WebGame24小时运行的时候,系统就会产生大量的非瞬时事件,通常把这些非瞬时事件统一拿出来,按事件的结束时间进行排序,并组成一个队列(事件队列)。再通过一个触发器,在事件设定的结束时间到达的那一刻执行对应的事件。
实现
数据库
数据库主要作用是存放事件队列,通常会存在结束时间、事件类型、事件参数等数据。
Asp.net
Asp.net的处理在触发器上的处理就比较简单了。在服务器程序启动的时候,就开辟一个线程,定时(1s)从数据库里取结束时间<当前事件的事件进行处理。
php
没用过,不过好像不能在php里创建唯一的线程,用纯php实现触发器估计有点难度。欢迎大家过来讨论。
1.1.3 游戏资源的24小时自动增长
游戏资源的24小时自动增长,这是一个有趣的话题,很多刚开始设计WebGame的朋友都会在这个问题上卡一下。每个人对于如何实现这个功能都有自己的独到见解,我在这里就不能给出一个唯一的答案,这里给的解决方案只是自己正在做的WebGame用到的方案。
首先,在系统设计之处就否定了每个时间间隔(10分钟)就执行更新村庄资源的设计,这即不准确,同时也很消耗服务器资源。所以,我们的系统就只有在用户执行事件(瞬时的和非瞬时)的时候才将新的资源信息写入数据库。平时显示的时候利用
(当前时间 - 上一次更新事件)*资源每小时产量+上一次更新产量
公式计算出当前资源并显示在页面上。
Travian》在界面上看到资源不断的上涨其实是利用JavaScript实现,并不会真正的在服务器端进行计算。



本帖最近评分记录
今夜没得疯   2007-11-12 22:10  现金  +10   支持下




web 三国开发进行中

http://www.51wsg.cn

持续开发中...

blog: http://www.cnblogs.com/yahle
顶部
[广告] 论坛投票锁帖系统(主题帖投票)启用,会员可以控制帖子的关闭与否
蕾歌薇儿
管理员
Rank: 104Rank: 104Rank: 104Rank: 104Rank: 104Rank: 104


帝国元帅(OGame勋章)   活动组织奖章(奖励勋章)  
UID 12852
精华 7
积分 38272
帖子 6284
威望 56
现金 96500 银币
金币 500 金币
阅读权限 200
注册 2007-1-22
状态 离线
发表于 2007-11-12 23:53  资料  个人空间  短消息 

资源增长的话,在OGame里是玩家登录,或者有人侦查,攻击等时候再更新的





OGame中文专题站:http://ogame.cwebgame.com
顶部
[广告] web棋牌市 6.16内测开启
Rail100
骑士
Rank: 24Rank: 24Rank: 24



UID 99050
精华 0
积分 2146
帖子 204
威望 0
现金 1108 银币
金币 0 金币
阅读权限 50
注册 2007-9-10
状态 离线
发表于 2007-11-13 00:29  资料  个人空间  短消息 

用脚本计算资源显示在界面,当刷新网页以及其他玩家互动时才刷新服务器的资源。如果开一个线程每秒检查一次资源的话,你的服务器能抗得住吗,随着用户的增加,这个计算要耗多少资源?

顶部
[广告] 论坛红包功能恢复,准骑士以上可评分。结婚系统安装完毕,大家可以开始表白了
xyz990 (啊丹)
勋爵
Rank: 40Rank: 40Rank: 40Rank: 40Rank: 40
恋爱时代


UID 340
精华 0
积分 6065
帖子 1085
威望 5
现金 220 银币
金币 0 金币
阅读权限 60
注册 2006-4-30
状态 离线
发表于 2007-11-13 09:24  资料  个人空间  短消息 

HOHO 我现在就是用的村庄战争的JS显示资源方式 蛮好看的





OGAME游戏生涯终结老
啊丹 的马甲   独裁统治 严禁自由
OGame银河帝国中文信息站
http://www.adan2.cn
顶部
[广告] 论坛投票锁帖系统(主题帖投票)启用,会员可以控制帖子的关闭与否
蜡笔小黑
骑士
Rank: 24Rank: 24Rank: 24
XE的怪蜀黍


UID 12951
精华 0
积分 2399
帖子 880
威望 0
现金 5146 银币
金币 0 金币
阅读权限 50
注册 2007-1-24
来自 utopia
状态 离线
发表于 2007-11-13 21:25  资料  个人空间  主页 短消息  添加 蜡笔小黑 为MSN好友 通过MSN和 蜡笔小黑 交谈 QQ

个人觉得如果是做RPG,用一个线程每一分钟扫描一次怪物队列来刷新怪物还不错,更新资源,个人倾向于有玩家操作的时候再进行计算.

[ 本帖最后由 蜡笔小黑 于 2007-11-13 21:26 编辑 ]






http://utopia-china.myminicity.com
顶部
[广告] CWG维权点子征集
dogvane
勋爵
Rank: 40Rank: 40Rank: 40Rank: 40Rank: 40



UID 22711
精华 6
积分 7234
帖子 139
威望 13
现金 7737 银币
金币 2 金币
阅读权限 60
注册 2007-4-22
状态 离线
发表于 2007-11-13 22:47  资料  个人空间  短消息 



QUOTE:
原帖由 蕾歌薇儿 于 2007-11-12 23:53 发表
资源增长的话,在OGame里是玩家登录,或者有人侦查,攻击等时候再更新的

OGame里不只只有这些操作时才更新资源的数据,向生产舰船,升级建筑物等也都需要进行更新的。

QUOTE:
原帖由 Rail100 于 2007-11-13 00:29 发表
用脚本计算资源显示在界面,当刷新网页以及其他玩家互动时才刷新服务器的资源。如果开一个线程每秒检查一次资源的话,你的服务器能抗得住吗,随着用户的增加,这个计算要耗多少资源?

每个1s检查一下是否有事件发生,有的话就进行事件操作,这个时间大概会消耗几个毫秒时间,对服务器来说可以忽略不计。
每个玩家在24小时内,最多不会创建操作20个事件,<Travian>里一般是2w的玩家,1w的活跃玩家,每天最多20w个事件,平均到8w秒,其中每秒2.x次。繁忙时每秒计算10次~20次。每个事件处理也就几毫秒的事情。整个事件触发过程一般达不到cpu的10%占用率。





web 三国开发进行中

http://www.51wsg.cn

持续开发中...

blog: http://www.cnblogs.com/yahle
顶部
[广告] CWG维权点子征集
fuzi83
新进市民
Rank: 5Rank: 5Rank: 5Rank: 5Rank: 5



UID 110269
精华 0
积分 6
帖子 1
威望 0
现金 2416 银币
金币 0 金币
阅读权限 10
注册 2007-11-12
状态 离线
发表于 2007-11-15 11:07  资料  个人空间  短消息 
楼主说的非瞬时时间能否用sleep()(PHP)实现??


楼主说的非瞬时时间能否用sleep()(PHP)实现??

新人 想学习webgame

顶部
[广告] 论坛投票锁帖系统(主题帖投票)启用,会员可以控制帖子的关闭与否
蜡笔小黑
骑士
Rank: 24Rank: 24Rank: 24
XE的怪蜀黍


UID 12951
精华 0
积分 2399
帖子 880
威望 0
现金 5146 银币
金币 0 金币
阅读权限 50
注册 2007-1-24
来自 utopia
状态 离线
发表于 2007-11-15 17:35  资料  个人空间  主页 短消息  添加 蜡笔小黑 为MSN好友 通过MSN和 蜡笔小黑 交谈 QQ

我觉得楼主有必要公布消息队列的数据结构

用队列的话,插入,撤消,和按实际执行时间组成队列很困难,几乎不行

那么用向量,操作是简单了,但是每次都要历遍所有数据,并比较时间字段.似乎效率又不高.






http://utopia-china.myminicity.com
顶部
[广告] 多玩独家代理欧美航海题材网页游戏《Seafight海战英豪》7月14日公测
dogvane
勋爵
Rank: 40Rank: 40Rank: 40Rank: 40Rank: 40



UID 22711
精华 6
积分 7234
帖子 139
威望 13
现金 7737 银币
金币 2 金币
阅读权限 60
注册 2007-4-22
状态 离线
发表于 2007-11-15 20:33  资料  个人空间  短消息 



QUOTE:
原帖由 fuzi83 于 2007-11-15 11:07 发表
楼主说的非瞬时时间能否用sleep()(PHP)实现??

新人 想学习webgame

触发器可以用sleep(1000ms)的方法实现

QUOTE:
原帖由 蜡笔小黑 于 2007-11-15 17:35 发表
我觉得楼主有必要公布消息队列的数据结构

用队列的话,插入,撤消,和按实际执行时间组成队列很困难,几乎不行

那么用向量,操作是简单了,但是每次都要历遍所有数据,并比较时间字段.似乎效率又不高.

队列只有一个时间,就是执行时间,插入时间不需要,可以记录也可以不记录(我记录了,但发现没什么作用),查询的时候是通过数据库查询的,虽然每次要遍历整个表,但我认为消耗的时间不会太多。

数据库表:

列名

数据类型

长度

ID

int

VillageCode

int

TargetVillageCode

int

Type

int

BeginTime

datetime

EndTime

datetime

ShowText

varchar

50

EventObject

varchar

0




处理代码:
    public class SystemEvent
    {
        public static void DoEvent(DateTime time)
        {
            List<Event> evs = Event.GetEvents(time);//  从数据库里活动在比当前时间小的事件
            foreach (Event e in evs)
            {
                try
                {
                    IEvent ie = e.Object;
                    if (ie != null)
                        ie.DoEvent();
                }
                catch (Exception ex)
                {
                    Common.Logging.Error(ex.ToString(), e.EventObject);
                }
                try
                {
                    e.Delete();    // 从数据库里删除信息
                }
                catch (Exception ex)
                {
                    Common.Logging.Error(ex.ToString());
                }
            }
        }
    }





web 三国开发进行中

http://www.51wsg.cn

持续开发中...

blog: http://www.cnblogs.com/yahle
顶部
[广告] web棋牌市 6.16内测开启
ot512
骑士
Rank: 24Rank: 24Rank: 24


UID 40078
精华 1
积分 1994
帖子 182
威望 2
现金 3257 银币
金币 0 金币
阅读权限 50
注册 2007-8-3
状态 离线
发表于 2007-11-15 22:32  资料  个人空间  短消息  QQ

请问你用的是jsp吗?
如果是,用的什么操作数据库呢?





公元184年,张角相约信众在3月5日以“苍天已死,黄天当立,岁在甲子,天下大吉”为口号兴兵反汉;
“苍天”是指东汉,"黄天"指的就是太平道,根据五德始终说的推测,汉为火德,火生土,而土为黄色,
所以众信徒都头绑黄巾为记号,象征要取代腐败的东汉.
三国的故事由此开篇:
http://61.161.125.7/tc
顶部
[广告] web棋牌市 6.16内测开启
dogvane
勋爵
Rank: 40Rank: 40Rank: 40Rank: 40Rank: 40



UID 22711
精华 6
积分 7234
帖子 139
威望 13
现金 7737 银币
金币 2 金币
阅读权限 60
注册 2007-4-22
状态 离线
发表于 2007-11-15 22:52  资料  个人空间  短消息 



QUOTE:
原帖由 ot512 于 2007-11-15 22:32 发表
请问你用的是jsp吗?
如果是,用的什么操作数据库呢?

使用asp.net,数据库目前是access,正式发布时看情况切换到MSSQL或者MySQL





web 三国开发进行中

http://www.51wsg.cn

持续开发中...

blog: http://www.cnblogs.com/yahle
顶部
[广告] 论坛红包功能恢复,准骑士以上可评分。结婚系统安装完毕,大家可以开始表白了
蜡笔小黑
骑士
Rank: 24Rank: 24Rank: 24
XE的怪蜀黍


UID 12951
精华 0
积分 2399
帖子 880
威望 0
现金 5146 银币
金币 0 金币
阅读权限 50
注册 2007-1-24
来自 utopia
状态 离线
发表于 2007-11-16 15:29  资料  个人空间  主页 短消息  添加 蜡笔小黑 为MSN好友 通过MSN和 蜡笔小黑 交谈 QQ

谢过楼主先,最近玩C++玩多,老喜欢把数据读到内存处理,忘了还可以放数据库的说,汗一个..........






http://utopia-china.myminicity.com
顶部
[广告] 论坛红包功能恢复,准骑士以上可评分。结婚系统安装完毕,大家可以开始表白了
 


海盗王

当前时区 GMT+8, 现在时间是 2008-7-26 09:08
沪ICP备06036464号

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.5.0 Licensed  © 2001-2007 Comsenz Inc.
Processed in 0.086163 second(s), 12 queries , Gzip enabled

清除 Cookies - 联系我们 - Chinese Webgame BBS 中国网页游戏论坛 - Archiver - WAP