【php精品源码栏目提醒】:网学会员--在 php精品源码编辑为广大网友搜集整理了:PHP5网游开发入门教程 - 综合课件绩等信息,祝愿广大网友取得需要的信息,参考学习。
网页游戏开发入门教程一(webgamedesign)一、简单的程序框架。
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 字节。
二、一个详细的例子。
单纯的讨论数据流程是件痛苦的事情。
讨论程序而不给代码也是比较痛苦。
这里用的是 phpmysql 的。
同时,这个例子没有用到类。
如果时间充足的话,今年年底,我会提供一个带即时交互的简单 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。
1 class Map//地图类 2 3 var Map_ID 4 function Map_bg_cssMap_ID 5 6 this-gtMap_ID Map_ID 7 8 mysql_select_dbdb_namelink 9 sqlquotselect from map where Map_IDquot.this-gtMap_ID.quot limit 1quot10 resultmysql_querysqllink11 echo quotltstyle typequot.quottextquot.quot/quot.quotcssgtquot12 rsmysql_fetch_arrayresult1314 echo quotmapquot15 echo quotposition:absolutequot16 echo quotwidth:quot.rsX 坐标.quotpxquot17 echo quotheight:quot.rsY 坐标.quotpxquot18 echo quotz-index:0quot19 echo quotleft:0pxtop:0pxquot2021 2223 function Map_bgMap_ID2425 this-gtMap_ID Map_ID2627 sqlquotselect from map where Map_IDquot.this-gtMap_ID.quotquot28 resultmysql_querysqllink29 whilersmysql_fetch_arrayresult30 31 echo quotltdiv idLayer_bg_quot.rsX 坐标.quot_quot.rsY 坐标.quotgtquot32 echo quotltimg srcquot.rsMap_bg.quot border0 titlequot.rsID.quotgtlt/divgtquot3334 3536 37 38上面是一个很简单的地图类。
代码可能不太正确,意思是正确的。
就是根据 map 表中的坐标,生成了一组div 层,以及这一组层的 css。
你可以改为 table 的。
你可以也把坐标放到一个字段里,用数组的形式取。
使用的时候,用new mapmapN其中 N 是 map 表里的地图 Map_ID.城市内的建筑也类似。
如果要显示出来的话。
关于地图,现在我采用的方式更为简单。
通过坐标来判断需要哪些图,然后直接显示出来。
当然没有碰撞什么的,因为暂时不需要。
至于人物走动什么的,不在本文讨论范围。
有了地图和城市后。
涉及到的问题就是城市里资源的产生。
这时候,City 表里需要有可供判断的时间和数量的字段。
比如:产生资金量 Money产生资金花费的时间 Action_Time上次产生资金时间 Money_time。
这两个字段的数值应该在 City_base 表里出现。
(即城市基础表,不同等级,不同类型城市的对应数值。
这是给策划填数据用的,建好表后就等策划去头痛吧。
如果你身兼数职。
。
。
)如何自动产生资源呢?我们可以在城市所有人改变的时候,写入一个时间。
或者在城市初始化的时候写入一个时间。
Now_TimedateY-m-d H:i:s说明:开头是变量的意思。
php 里特有的。
如果是 asp 的话可以写成。
Now_TimeNow 把Now_Time 写入到 Money_time 里。
updatequotUPDATE City SET Money_timeNow_Time WHERE City_IDCity_ID LIMIT 1quotCity_ID 是你自己定义的。
指某一个城市。
如:City_ID1我们假定当前城市产生资金量为 100。
即Money100;(具体的数值,应该是由 City_base 表里取出的。
)假设间隔时间为Action_Time我们再假定是每小时执行一次。
即Action_Time3600;(具体的数值,是根据你的初始化表里取得的。
也可以根据城市等级或者用户等级取得。
反正随便你自己怎么设定。
)这时候,有基础时间了。
有基础资金产量了。
有间隔时间了。
让它循环执行起来就行了。
上面说过,服务端用 C 语言定时器。
客户端用 javascript。
服务端,资源定时器设定为 5 分钟执行一次。
那么我们的误差就是 5 分钟。
对网页游戏来说,可以接受。
(战斗的定时器得 1 分钟吧。
当然服务器够牛的话,几秒钟都可以。
)当然,可以完全
php 写,然后配置
php 的 corn。
现在我在做的程序就是直接用
php 写了。
包括任意长时间的定时器类,专门控制抽象事件用的。
C 的定时器暂时没用。
每次执行什么代码呢?首先得新建一个定时器任务的表。
目的就是让定时器知道需要执行哪些程序和数据的更新。
表内容比如:城市资源更新。
当然,这个表可要可不要。
建立的好处是方便处理类似保护状态不产生资源之类的问题。
服务端程序:获得当前服务器时间。
获得当前需要更新城市。
判断服务器时间与Money_time 的时间差。
(时间戳,具体的时间戳网上资料满多的。
)判断时间差是否大于Action_Time。
大于,则更新资源。
同时更新Money_time。
小于,则无操作。
客户端程序:获得当前服务器时间。
获得当前城市的MoneyMoney_timeAction_Time。
使用 javascript 显示剩余时间的倒计时,以及增加的资源量。
客户端特殊情况触发:因为客户端显示的资源情况是伪同步,所以当客户端使用该资源的时候。
需要服务端将当前的实际资源更新,属于定时器处理的时间也需要更新。
即,当客户端触发涉及资源的情况时,立即更新当前资源。
同时更新定时器中会用到的Money_time。
这样才不会造成,看的资源用不到,或者定时器重复产生资源。
总体来说。
这部分程序都很简单。
难点在 C 语言定时器的制作,以及前台 javascipt 倒计时的写法上。
C 语言定时器,找个 C 语言程序员,超简单;前台的 javascipt,网上有很多倒计时的代码,找个来改改就能用。
1 ltSCRIPT LANGUAGEquotJavaScriptquotgt 2 var maxtime 这里是你的时间差///一个小时,按秒计算,自己调整 3 function CountDown 4 ifmaxtimegt0 5 minutes Math.floormaxtime/60 6 seconds Math.floormaxtime60 7 msg quot你的文字说明quotminutesquot分quotsecondsquot秒quot//动态显示剩余时间。
8 document.allquottimerquot.innerHTMLmsg 9 //ifmaxtime 3 document.allquottimerquot.innerHTML只剩 3 秒!10 --maxtime11 12 else13 clearIntervaltimer14 document.allquottimerquot.innerHTML时间到15 16 17 timer setIntervalquotCountDownquot100018 lt/SCRIPTgt1920 ltdiv idtimergtlt/divgt21这个是网上找的代码。
稍微修改就可以用的。
这里只是显示了倒计时。
也可以改为显示资源的增加情况。
C 语言里操作 mysql 数据库。
1 // TODO: Add your control notification handler code here 2 bool bRes m_dbConn.Connectquot数据库 ip 地址quot 3306 quot用户名quot quot密码quot quot数据库名quot 3 ifbRes 4 5 AfxMessageBoxquotconnect failquot 6 return 7 8 9 string strSql quotselect from city limit 1quot//所有显示或取值类的都用这段。
中间的 sql 语句可以自己构造。
10 ResultSet rs m_dbConn.ExecuteQuerystrSql11 whilers-gtNext12 13 string str rs-gtGetStringquotusernamequot14 AfxMessageBoxstr.c_str15 16 /17 strSql quotupdate city set moneymoney 100 where City_IDxxxquot//所有的增加、删除、更新都用这段,中间的 sql 语句可以自己构造。
1819 bRes m_dbConn.ExecuteUpdatestrSql20 ifbRes21 22 AfxMessageBoxquotExecuteUpdate failquot23 24 /25 m_dbConn.Close2627 定时器的主函数。
28 void CBeiLiDlg::Go29 30 whiletrue31 32 // AfxMessageBoxquotgoquot3334 Sleep51000//毫秒。
定时器刷新时间。
35 36 当然。
这里的 C 的代码不能直接用。
只是一部分。
新的方法是,通过
php 定时器类负责前台、时间到后,调用 ajax 执行完成。
后台通过定时执行
php 定时器类的专用处理函数,处理前台掉线,前台未正常执行等情况。
如果我们的新游戏今年年底能正常上线的话。
我可以公开这个类,没技术含量,但是很巧妙。
地图、城市、基本上算是有了。
接下来是城市里的建筑。
上面讲的资源增加,其实定位在建筑上更准确。
不过建筑的分类和数值会复杂很多。
那是策划考虑的问题。
建筑上,只讲一个前台的修建效果。
当然,这个效果是可有可无。
你可以直接给个类似新闻列表的显示,再加个倒计时就行。
显示的效果就是,点修建后。
不刷新页面,调入一张动画图片。
并在时间到后自动转换为其他图片。
1 ltscript languagejavascriptgt 2 function xiujian 3 4 top.abc.document.getElementById前台建筑位置所在图片的id.src修建后建筑的图片地址 5 //显示修建后的建筑图片。
可以加上后台时间判断。
其中 abc,是建筑所在层的 id, 6 7 function xiujian1 8 9 setTimeoutxiujian5000//动画时间 5 秒。
这里也可以加入时间判断。
当时间不到的完成的时候,继续调用动画。
10 11 function donghua12 13 top.abc.document.getElementById前台建筑位置所在图片的id.src建筑动画所在的地址//显示修建动画。
14 15 donghua16 xiujian117 lt/scriptgt18附带讲一下。
如果要考虑多浏览器兼容,那么用 prototype.js。
如果只需要 ff 和 ie。
那么用而 jqury.js或尽量自己写。
因为 120k 的 prototype.js 不算小。
后台部分,把时间到,增加资源的代码,改为时间到,增加或更新建筑就行了。
又是增加 N 个表。
。
新的方法是,增加事件子类。
建筑基础表:产出,类型,图片等等。
。
建筑详细表:属于哪个城市,可以在城市表里关联。
关联的方式不同会对程序有很大的影响。
各种关联方式都行,但是一旦关联方式确定后,最好别改动。
现在建筑也有了。
用类似的定时方式,打工,征兵等等都可以实现。
战斗,兵的参数:兵种,数量,攻击,防御等等。
战斗的临时表:谁的兵,打谁,出发时间,战斗时间,战斗结果。
这里的几个字到是简单。
实际的表会复杂一些。
webgame 中,战斗的过程分两种,一种是给出双方参数,时间到,就根据公式计算结果。
一种是半即时或者即时的战斗,可以边打边喝药边用技能的那种。
第一种流程。
点出兵。
这时候,兵的参数,出发时间,到达时间,都记录进战斗临时表。
定时器中,处理战斗的部分,判断时间是否到开打的时候。
到开打的时间了,则取得被攻击方的兵的参数。
然后通过几个公式计算结果。
处理结果,比如谁的兵挂了多少,战场掉落了多少钱,城市被谁抢到了。
一大堆判断以及 updata。
(这里的定时器处理和获得资源的定时器处理是很类似的。
)最后把结果分别发给双方。
(又涉及到一个短信息系统。
)第二种流程。
点攻击。
马上就处理数据。
打打 npc 好做。
玩家之间对战,也可以把被攻击的玩家当成 npc 来处理。
两个人或两人以上即时战斗。
需要用到 ajax 了。
目前在技术上和理论上是没问题的,还没实际写代码,所以不好讲。
现在,技术上已经确定可以很好的实现了。
很简单的公式,两种战斗都可以用到:intvalsqrtUser_B_AP-sqrtUser_A_DP根号下攻击-根号下防御伤害。
具体写的时候,公式肯定会复杂不少,不过这头痛的事,还是交给策划去做吧。
战斗的具体参数,其实已经不是程序考虑的了。
程序只需要考虑从数据表 A 取得数据,存入临时表 B。
然后当时间到了后(通过定时器实现),再从数据表 C 取得数据,通过公式计算,最后删除临时表 B 或者把临时表 B 存到另外一个地方备份。
这里的思路其实就是定时器类。
数据是哪些?找策划要。
有几个表?找策划要。
战斗公式?找策划要。
有地图、城市、建筑、士兵、战斗后,道具的出现就有必要了。
为什么呢?有了城市能做什么?产生资源,产生钱,产生兵。
有了士兵做什么?可以抢资源,抢钱。
资源和钱做什么?买道具。
买道具做什么?更好的抢资源和抢钱。
(同时,抢资源,抢钱的时候,资源会被消耗)这是一个很简单的循环。
就是绕成了一个圈,虽然这个圈很小。
有部分策划想得非常好,就是绕不成圈,那样没任何意义。
首先,需要一个道具的基础表。
自动 ID,道具类型,道具属性,说明。
在道具的处理上,可以在玩家表里增加更多字段,道具跟随玩家。
也可以单独建一个道具的详细表。
用类似背包的方式实现。
背包的方式有两种,一是用数组存储,二是用横向表存储。
都挺麻烦的。
不过从道具流通和买卖上考虑。
用背包的方式是值得的。
接下来的功能。
商店。
拍卖行。
基本上跟一般的网站应用很类似。
只不过产品变为了游戏里的道具。
货币是游戏币。
三、总结上面的小例子,思路上是基本完善,没问题的。
程序代码上只给了一小部分,能真正理解这一小部分。
其他部分的程序应该不是问题。
webgame 重要的还是数据流的绕成圈,以及可玩性。
现在讲为:程序的健壮和数据流的清晰。
上面的功能,真的做出来,是不够玩的。
就是没什么可玩性,做出来都没意义。
但是,仅仅是做出来,仍然是一件困难的事情。
游戏里涉及的东西太多。
即使是很简单的游戏,即使 webgame 看上去很简单,甚至实际也很简单;做出来,非常困难。
没有过开发 webgame 经验的人,来策划 webgame 或者说开发 webgame。
会觉得很简单。
大功能其实就那么几个。
思路上也容易绕成圈。
实际情况是,一个非常简单的功能,当它需要绕圈的时候;当它需要交互的时候。
这个功能就不再简单,而是复杂,相当的复杂。
这是当你不太明白设计模式的时候,如果你精通设计模式,那么功能就会简单起来。
特别是你想制作一款有足够的可玩性,能面向市场的产品,即使是初期思路非常简单,功能也很单纯。
但你实际策划的时候,实际编程的时候。
大量的数据、数值需要你去处理,大量的交互需要你去处理。
这时候,开始的简单,已经变得复杂了。
虽然从程序的角度讲,技术含量不高。
更准确的讲,是繁琐,非常繁琐。
优秀的策划是可以把数据表列出来,把数据走向清晰的列出来,放在你面前。
这样的策划不多的。
当然,他不一定列得很准确,但是程序员能比较准确的理解他的意思。
网页游戏开发入门教程二(游戏模式系统) 一、游戏模式目前 webgame 游戏模式大体上可以分为以下四类:1、玩家拥有一个城市,不断的升级城市内建筑,建筑可以自动获得物资,可以生产军队,军队之间进行对比数值的战斗。
这里我简单的称为 Ogame 模式。
比较优秀的代表:战神世界 II,Travian,Ogame,武林三国,纵横天下,领主 online,乱舞春秋,热血三国,方便面三国等等。
这是一个比较成熟的模式, 但正因为成熟。
因此,玩家接触到这类游戏比较的多,除非你能超过这些优秀的代表,否则就只是简单的重复开发。
对玩家来说:优点:Ogame 模式模拟一个君主,发动一系列战争。
满足君主的成就感。
缺点:玩 Ogame 模式的游戏需要足够的耐心。
当然有钱也行。
对开发者来说:优点:有相当多的地方可以参考。
甚至有源代码参考。
Ogame 的源代码缺点:不管名字怎么改,策划怎么策划。
本质没有变化。
换汤不换药,玩家不是傻子。
Ogame 模式所获得的成功,就像传奇刚出来的时候。
不是因为这个模式非常好,而是因为暂时还没有更强的模式超过他。
所以,如果你想做网页游戏赚钱,而不是好玩,或者仅仅为了架设一个自己的服务器。
那么请从新开发一种新模式。
2、游戏的核心就是战斗,不断的战斗,不断的完成任务。
这里我简单的称为 Ebs 模式。
比较优秀的代表:EBSII,web 幻想(wog),无心宠物(论坛插件)。
Ebs 模式也是成熟的模式。
对玩家来说:优点:只管不断的战斗,完成任务,PK。
缺点:只能不断的战斗,完成任务,PK。
对开发者来说:优点:有相当多的地方可以参考。
甚至有源代码参考。
wog( web 幻想)的源代码,无心宠物的源代码缺点:收益到底如何呢?3、mmRPG 模式游戏。
猫游记、英雄之门、昆仑(昆仑不应该算网页游戏了)。
模拟具有客户端的网络游戏。
本身这个想法非常好,但是,谁来玩是一个问题。
对玩家来说:优点:类似有客户端的网络游戏。
缺点:画面、游戏性等等都比不过客户端网络游戏,要玩 mmrpg,有必要玩网页游戏吗?对开发者来说:优点:模式清晰,参考众多。
(大部分网络游戏都可以作为参考)缺点:策划难度高,技术难度高。
4、经营模式游戏。
武林足球经理、XBA 篮球经理。
经营类游戏在游戏消耗上,和成就感上比较难处理。
毕竟不是单机的经营游戏。
如果策划够强,经营类游戏是很好的选择。
那么,作为开发者来说,选择哪一类入手呢?从程序的角度上来说,不管哪一类,都需要六个系统。
二、网页游戏六大系统1、经济系统。
经济系统包括:商店、拍卖行、生产或打工场所、道具和资源。
生产或打工场所通过 .
上一篇:
php100视频教程下载地址非常详细
下一篇:
基础体育课教改初探