策略类webgame游戏开发

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

策略类webgame游戏开发目录前言1、简单的webgame程序框架2、一个详细的例子3、总结一、WebGame架构篇二、WebGame事件三、多线程下数据库并发更新的处理四、一个可以承载万人在线的架构五、数据库表设计六、缓存概述一、简单的webgame程序框架。webgame程序构成:三大部分。第一是数据流程。第二是程序。第三是美术。其中,数据流程包括了功能。也只有在功能中才能体现数据流程。数据流程相当的麻烦,后面再讨论。比如最简单的卖买产品。要实现这个功能。那么需要有产品基础表、产品详细表、商店表、背包表。如果扩展性更强,相应的双表是少不不了的。表的问题都简单了。关键是这个物品有什么用。这样物品的来源,一大堆数据,物品的走向,又是一大堆数据。最后,这些数据得绕成一个圈。绕圈是一件困难的事情。特别是功能和道具多了起来的时候。难度是2的n次方。在绕圈之前,如果你比较熟练设计模式。那么这个过程可以简化。难度由2的n次方变为1。只需要有控制器、事件工厂、抽象道具工厂这三个虚类;再加上定时器,任务编辑器,这两个通用类。即可以构建一个健壮、高扩展的webgame。在webgame里控制器几乎可以等同于页面。随便采用一种模板技术即能很方便的处理。事件工厂是一个抽象类,所有的事件,如打工、战斗、移动等都由事件工厂的生产。并且接口相同,方便控制器控制。工厂模式。抽象道具工厂是一个抽象类,所有的道具,如城市、地图、装备等,都由抽象道具工厂生产。并且接口相同。工厂模式。事件与道具的结合又是一个桥接模式。美术:UI。简洁漂亮的界面总会有好处。小图标。道具,地图,装备。一类至少10个吧?大体上百把个是需要的。程序分5个部分:服务器定时器。(C语言或自己设定服务器)定时循环执行某一段代码。而这段代码主要是根据数据库的数据进行更新。这个可以找个C语言程序员来做。对于C语言程序员来讲,这个功能是相当的简单。当然,具体的处理数据的判断和操作数据库,需要你自己写。让C语言程序员给你段标准代码就行了。完全支持sql语句的。php的话,可以配置corn实现。但是不管是什么操作系统,配置的时间最低是1分钟。所以,如果你要处理1秒钟刷新一次的情况。你还需要专门的定时器程序来处理,或者被定时执行的php需要包含sleep().当然,即使有即时交互,可以不管服务器端。只处理交互的双方的客户端。js和ajax实现。功能页面、功能函数。主要就是数据存取,判断,数据走向。用上抽象类,会比较轻松。不过子类的爆炸是少不了的了。ajax函数。(可选)某些需要伪即时的功能要用到。为了让游戏看起来酷一点。用吧。javascript函数。(可选)模拟客户端的数据计算。也就是webgame的与时间相关的数据。分为两部分。一部分是真实数据,是由服务器端的定时器计算的。另一部分是只有初始值,客户端显示用的。不需要即时同步,仅仅需要模拟同步就行。这里还包括一些漂亮的UI特效。毕竟是游戏。数据库。一大堆基础数据表和详细数据表。基础数据表:比如等级1到等级100的用户的属性初始值。详细数据表:每个用户的具体属性。数据库上,尽量优化。结构上能用1字节的就别用2字节。二、一个详细的例子。单纯的讨论数据流程是件痛苦的事情。讨论程序而不给代码也是比较痛苦。这里用的是php+mysql的。同时,这个例子没有用到类。如果时间充足的话,今年年底,我会提供一个带即时交互的简单webgame代码和核心类来说明使用了设计模式的好处。那就按一个超简单的webgame的方式来讨论。配上适当的代码。应该有所帮助。不足的地方也请大家指出,对我个人也是帮助。我们不去考虑游戏的可玩性,数值平衡等等问题。我们先只考虑一个简单例子的实现。那么一个webgame的基本内容需要些什么呢?数据库:玩家、地图、城市、建筑、武器、士兵。功能:登陆、升级、个人战斗、士兵之间的战斗、与城市的战斗、修建建筑、打造武器、买卖道具。(注意:每一个功能,必然对应1个或多个数据表。上面数据库中所列的只是基础中的基础。)首先是地图、城市、建筑。这里认为,地图可以有多张,城市在地图上,建筑在城市内。地图表Map:Map_ID,X坐标,Y坐标,City_ID(城市ID),描述。其中Map_ID是指地图的id。不是自动编号。一张地图就是一个Map_ID,可以重复。城市表City:City_ID,城市名字,城市所有人,城市等级,城市资源,描述。建筑表Build:ID,City_ID,建筑名称,建筑等级,建筑功能。其中,地图表确定城市的位置,城市表确定城市的相关数据以及所有人,建筑表内的多条信息属于某一个城市。建表后,显示出来。一个for循环。把地图表整个取出来就ok。跟普通网站的新闻列表没太大区别。不同的是,你需要取得X坐标和Y坐标定位。可以用tabel也可以用div。classMap//地图类{var$Map_ID;functionMap_bg_css($Map_ID){$this-Map_ID=$Map_ID;mysql_select_db($db_name,$link);$sql=select*frommapwhereMap_ID='.$this-Map_ID.'limit1;$result=mysql_query($sql,$link);echostyletype=.text./.css;$rs=mysql_fetch_array($result);echo#map{;echoposition:absolute;;echowidth:.$rs[X坐标].px;;echoheight:.$rs[Y坐标].px;;echoz-index:0;;echoleft:0px;top:0px;};}functionMap_bg($Map_ID){$this-Map_ID=$Map_ID;$sql=select*frommapwhereMap_ID='.$this-Map_ID.';$result=mysql_query($sql,$link);while($rs=mysql_fetch_array($result)){echodivid=Layer_bg_.$rs[X坐标]._.$rs[Y坐标].;echoimgsrc=.$rs[Map_bg].border=0title=.$rs[ID]./div;}}}上面是一个很简单的地图类。代码可能不太正确,意思是正确的。就是根据map表中的坐标,生成了一组div层,以及这一组层的css。你可以改为table的。你可以也把坐标放到一个字段里,用数组的形式取。使用的时候,用newmap;map(N);其中N是map表里的地图Map_ID.城市内的建筑也类似。如果要显示出来的话。关于地图,现在我采用的方式更为简单。通过坐标来判断需要哪些图,然后直接显示出来。当然没有碰撞什么的,因为暂时不需要。至于人物走动什么的,不在本文讨论范围。有了地图和城市后。涉及到的问题就是城市里资源的产生。这时候,City表里需要有可供判断的时间和数量的字段。比如:产生资金量Money,产生资金花费的时间Action_Time,上次产生资金时间Money_time。这两个字段的数值应该在City_base表里出现。(即城市基础表,不同等级,不同类型城市的对应数值。这是给策划填数据用的,建好表后就等策划去头痛吧。如果你身兼数职。。。)如何自动产生资源呢?我们可以在城市所有人改变的时候,写入一个时间。或者在城市初始化的时候写入一个时间。$Now_Time=date('Y-m-dH:i:s');(说明:$开头是变量的意思。php里特有的。如果是asp的话可以写成。Now_Time=Now())把$Now_Time写入到Money_time里。update(UPDATECitySETMoney_time='$Now_TimeWHERECity_ID='$City_ID'LIMIT1;);$City_ID是你自己定义的。指某一个城市。如:$City_ID=1;我们假定当前城市产生资金量为100。即$Money=100;(具体的数值,应该是由City_base表里取出的。)假设间隔时间为$Action_Time,我们再假定是每小时执行一次。即$Action_Time=3600;(具体的数值,是根据你的初始化表里取得的。也可以根据城市等级或者用户等级取得。反正随便你自己怎么设定。)这时候,有基础时间了。有基础资金产量了。有间隔时间了。让它循环执行起来就行了。上面说过,服务端用C语言定时器。客户端用javascript。服务端,资源定时器设定为5分钟执行一次。那么我们的误差就是5分钟。对网页游戏来说,可以接受。(战斗的定时器得1分钟吧。当然服务器够牛的话,几秒钟都可以。)当然,可以完全php写,然后配置php的corn。现在我在做的程序就是直接用php写了。包括任意长时间的定时器类,专门控制抽象事件用的。C的定时器暂时没用。每次执行什么代码呢?首先得新建一个定时器任务的表。目的就是让定时器知道需要执行哪些程序和数据的更新。表内容比如:城市资源更新。当然,这个表可要可不要。建立的好处是方便处理类似保护状态不产生资源之类的问题。服务端程序:获得当前服务器时间。获得当前需要更新城市。判断服务器时间与$Money_time的时间差。(时间戳,具体的时间戳网上资料满多的。)判断时间差是否大于$Action_Time。大于,则更新资源。同时更新$Money_time。小于,则无操作。客户端程序:获得当前服务器时间。获得当前城市的$Money,$Money_time,$Action_Time。使用javascript显示剩余时间的倒计时,以及增加的资源量。客户端特殊情况触发:因为客户端显示的资源情况是伪同步,所以当客户端使用该资源的时候。需要服务端将当前的实际资源更新,属于定时器处理的时间也需要更新。即,当客户端触发涉及资源的情况时,立即更新当前资源。同时更新定时器中会用到的$Money_time。这样才不会造成,看的资源用不到,或者定时器重复产生资源。总体来说。这部分程序都很简单。难点在C语言定时器的制作,以及前台javascipt倒计时的写法上。C语言定时器,找个C语言程序员,超简单;前台的javascipt,网上有很多倒计时的代码,找个来改改就能用。SCRIPTLANGUAGE=JavaScriptvarmaxtime=这里是你的时间差///一个小时,按秒计算,自己调整!functionCountDown(){if(maxtime=0){minutes=Math.floor(maxtime/60);seconds=Math.floor(maxtime%60);msg=你的文字说明+minutes+分+seconds+秒;//动态显示剩余时间。document.all[timer].innerHTML=msg;//if(maxtime==3)document.all[timer].innerHTML='只剩3秒!';--maxtime;}else{clearInterval(timer);document.all[timer].innerHTML='时间到';}}timer=setInterval(CountDown(),1000);/SCRIPTdivid=timer/div这个是网上找的代码。稍微修改就可以用的。这里只是显示了倒计时。也可以改为显示资源的增加情况。C语言里操作mysql数据库。//TODO:AddyourcontrolnotificationhandlercodehereboolbRes=m_dbConn.Connect(数据库ip地址,3306,用户名,密码,数据库名);if(!bRes){AfxMessageBox(connectfail);return;}stringstrSql=select*fromcitylimit1;//所有显示或取值类的都用这段。中间的sql语句可以自己构造。ResultSe

1 / 28
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功