资源描述
网页游戏开发入门教程.docx
《网页游戏开发入门教程.docx》由会员分享,可在线阅读,更多相关《网页游戏开发入门教程.docx(11页珍藏版)》请在冰豆网上搜索。
网页游戏开发入门教程
网页游戏开发入门教程
一、简单的程序框架。
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);
echo"";
$rs=mysql_fetch_array($result);
echo"#map{";
echo"position:
absolute;";
echo"width:
".$rs[X坐标]."px;";
echo"height:
".$rs[Y坐标]."px;";
echo"z-index:
0;";
echo"left:
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))
{
echo"";
echo"
";
}
}
}
上面是一个很简单的地图类。
代码可能不太正确,意思是正确的。
就是根据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("UPDATECitySET Money_time='$Now_Time WHERE City_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,网上有很多倒计时的代码,找个来改改就能用。
varmaxtime=这里是你的时间差///一个小时,按秒计算,自己调整!
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);
strSql="updatecitysetmoney=money+100whereCity_ID='xxx'";//所有的增加、删除、更新都用这段,中间的sql语句可以自己构造。