欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

網(wǎng)頁(yè)游戲開(kāi)發(fā)入門(mén)教程三(簡(jiǎn)單程序應(yīng)用)

 更新時(shí)間:2009年11月02日 21:57:58   作者:  
用哪種組合,真的不重要。重要的是時(shí)間和成本。復(fù)雜的地方在數(shù)據(jù)的交互和完善,而不在技術(shù)或效果的實(shí)現(xiàn)。
網(wǎng)頁(yè)游戲開(kāi)發(fā)入門(mén)教程二(游戲模式+系統(tǒng))
http://www.dbjr.com.cn/article/20724.htm

一、選擇開(kāi)發(fā)語(yǔ)言
后臺(tái):java .net php
前臺(tái):flex javascript ajax
數(shù)據(jù)庫(kù):mysql mssql
用哪種組合,真的不重要。重要的是時(shí)間和成本。復(fù)雜的地方在數(shù)據(jù)的交互和完善,而不在技術(shù)或效果的實(shí)現(xiàn)。往往遇到一些問(wèn)題。比如地圖如何編?人物移動(dòng)如何實(shí)現(xiàn)?其實(shí)這些問(wèn)題從技術(shù)上實(shí)現(xiàn)都比較容易。難在實(shí)現(xiàn)后,數(shù)據(jù)如何交互。沒(méi)有解決數(shù)據(jù)交互的問(wèn)題,實(shí)現(xiàn)這些技術(shù)點(diǎn)的意義不大。我用的是php+javascript+mysql。
原因:簡(jiǎn)單,上手快??梢员容^快速的出產(chǎn)品。
二、程序簡(jiǎn)單應(yīng)用。
、模板
為了方便UI的修改。所以用模板。smart template還算方便。很簡(jiǎn)單。代碼也可以嵌套在模板里。唯一的問(wèn)題是如果美術(shù)不會(huì)程序,修改模板還得程序來(lái)。不科學(xué)啊。
smart template的教程網(wǎng)上有。只說(shuō)一點(diǎn)??梢栽谀0澹?html的文件)里用<?php ?>嵌套任何代碼。獲得傳值。用$_obj[‘xxx']或者用$_stack[0][‘']可以和{xxx}寫(xiě)法的代碼嵌套。跟.php的文件一樣,沒(méi)任何區(qū)別。
、地圖
因?yàn)橛螒蝾?lèi)型不是ogame模式的,所以地圖并不是自動(dòng)生成。而是全從數(shù)據(jù)庫(kù)里調(diào)用。思路很簡(jiǎn)單。地圖是一整張大圖。切成多個(gè)小圖塊。數(shù)據(jù)庫(kù)里記錄下每個(gè)小圖塊對(duì)應(yīng)大圖的絕對(duì)坐標(biāo)。顯示的時(shí)候,調(diào)用相應(yīng)坐標(biāo)區(qū)域的小圖塊。
代碼類(lèi)似:
$sql="select * from map where mapx between $xxx and $xxx and mapy between $ yyy and $yyy ";
意思就是從地圖表里,獲得橫坐標(biāo)xx到xx??v坐標(biāo)xx到xx的所有小圖塊。比如20個(gè)。假設(shè)我們寫(xiě)個(gè)函數(shù)showMap(x,y),把獲得的數(shù)據(jù)全顯示出來(lái)。地圖可以有很多層。
每個(gè)小圖塊都是一個(gè)div。具體的控制就用css就行了。小圖塊可以當(dāng)作div的背景。也可以用作div里的圖片??刂坪胐iv的left和top就行了。(left和top就是小圖塊相對(duì)于大圖塊的絕對(duì)坐標(biāo))showMap(x,y)就放在下面兩個(gè)層的里面。
一個(gè)層處理地圖大?。?
<div style=\"position:relative;width:".$mapwidth."px;height:".$mapheight."px;overflow:hidden\" >
一個(gè)層處理拖動(dòng):

復(fù)制代碼 代碼如下:

<div style=\"position:absolute;z-index:10;left:2px;top:2px;width:".$mapwidth."px;height:".$mapheight."px;\" onmousedown=\"fDragging(this, event,false);\">
//處理拖動(dòng)的js代碼。(網(wǎng)上抄的。。感謝這位大大。)
<script>
function fDragging(obj, e, limit){
if(!e) e=window.event;
var x=parseInt(obj.style.left);
var y=parseInt(obj.style.top);
var x_=e.clientX-x;
var y_=e.clientY-y;
if(document.addEventListener){
document.addEventListener('mousemove', inFmove, true);
document.addEventListener('mouseup', inFup, true);
document.body.style.cursor="move";
} else if(document.attachEvent){
document.attachEvent('onmousemove', inFmove);
document.attachEvent('onmouseup', inFup);
document.body.style.cursor="move";
}
inFstop(e);
inFabort(e)
function inFmove(e){
var evt;
if(!e)e=window.event;
if(limit){
var op=obj.parentNode;
var opX=parseInt(op.style.left);
var opY=parseInt(op.style.top);
if((e.clientX-x_)<0) return false;
else if((e.clientX-x_+obj.offsetWidth+opX)>(opX+op.offsetWidth)) return false;
if(e.clientY-y_<0) return false;
else if((e.clientY-y_+obj.offsetHeight+opY)>(opY+op.offsetHeight)) return false;
//status=e.clientY-y_;
}
obj.style.left=e.clientX-x_+'px';
obj.style.top=e.clientY-y_+'px';
inFstop(e);
} // shawl.qiu script
function inFup(e){
var evt;
if(!e)e=window.event;
if(document.removeEventListener){
document.removeEventListener('mousemove', inFmove, true);
document.removeEventListener('mouseup', inFup, true);
} else if(document.detachEvent){
document.detachEvent('onmousemove', inFmove);
document.detachEvent('onmouseup', inFup);
}
inFstop(e);
document.body.style.cursor="auto";
//實(shí)現(xiàn)類(lèi)似google地圖的拖動(dòng)效果。
ajaxRead('map.php?mapx='+(e.clientX-x_)+'&mapy='+(e.clientY-y_)+'','2');
} // shawl.qiu script
function inFstop(e){
if(e.stopPropagation) return e.stopPropagation();
else return e.cancelBubble=true;
} // shawl.qiu script
function inFabort(e){
if(e.preventDefault) return e.preventDefault();
else return e.returnValue=false;
} // shawl.qiu script
}
//]]>
</script>

注意下面這段代碼:
ajaxRead('map.php?mapx='+(e.clientX-x_)+'&mapy='+(e.clientY-y_)+'','2');
這句代碼的位置,是在拖動(dòng)層后,釋放鼠標(biāo)的時(shí)候觸發(fā)的。你可以用alert(“地圖拖動(dòng)到了這里”); 替換。測(cè)試下效果。這句代碼的意思是,根據(jù)當(dāng)前地圖被拖動(dòng)的坐標(biāo)。調(diào)用一個(gè)ajax。也就是重新從數(shù)據(jù)庫(kù)里獲得地圖信息。AjaxRead()是一個(gè)ajax的調(diào)用函數(shù)。你可以全部自己寫(xiě)。也可以用如prototype.js之類(lèi)的框架寫(xiě)。
//處理ajax的代碼。(還是網(wǎng)上抄的,有輕微的改動(dòng)。。。唉,怎么老抄呢。。主要是為了節(jié)約開(kāi)發(fā)時(shí)間。。還有一點(diǎn)就是我的JavaScript很垃圾的(*^__^*) 嘻嘻)
復(fù)制代碼 代碼如下:

function ajaxRead(file,action)
{
var xmlObj = null;
if(window.XMLHttpRequest)
{
xmlObj = new XMLHttpRequest();
}
else if(window.ActiveXObject)
{
xmlObj = new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
return;
}
function ajaxDo(action)
{
switch(action)
{
case "2":
document.getElementById('display').innerHTML = xmlObj.responseText;//這里的display是你在頁(yè)面上層的id。上面的地圖代碼都需要放到這個(gè)層里。如<div id=display name=display></div>寫(xiě)id和name,是為了方便firefox和ie的兼容。
break;
}
}
xmlObj.onreadystatechange = function()
{
/*
if(xmlObj.readyState == 1 )//loading狀態(tài)。
{
document.getElementById('xianshi2').innerHTML = "正在載入";
}
*/
if(xmlObj.readyState == 4)//完成狀態(tài)時(shí)。
{
ajaxDo(action);
}
}
xmlObj.open ('GET', file, true);
//xmlObj.reload('GET', file, true);
xmlObj.send (null);
//xmlObj.abort ('');
}

整個(gè)代碼的意思就是:
當(dāng)拖動(dòng)地圖釋放鼠標(biāo)后,顯示層重新獲得數(shù)據(jù)。并無(wú)刷新的顯示出來(lái)。地圖里的圖片都用的png32的透明圖。Ie7和ff3都沒(méi)問(wèn)題。遇到ie6的話(huà)。。用gif的替代吧。map.php的功能。根據(jù)獲得的x,y顯示相應(yīng)的一謝謝小圖塊。這個(gè)功能其實(shí)就是上面說(shuō)的showMap(x,y),這個(gè)很像google地圖的拖動(dòng)。不過(guò)簡(jiǎn)單了很多。簡(jiǎn)單,效果還不錯(cuò)。2、角2、角色屬性
因?yàn)樵O(shè)定的要求。角色需要有裝備加成,有狀態(tài)加成(buff,debuff)。這時(shí)候,把所有需要的加成,都放到角色類(lèi)里。是一個(gè)很好的方法。
大概像這樣:
復(fù)制代碼 代碼如下:

class role
{
//獲得角色數(shù)據(jù)。
getRloe()
{
從數(shù)據(jù)庫(kù)里獲得角色信息。
}
//獲得裝備加成。
getEquip()
{
獲得裝備加成信息。
}
//獲得狀態(tài)加成
getState()
{
獲得狀態(tài)加成信息。
}
//把上面獲得的信息相加或者相減,或者調(diào)整。
//返回角色數(shù)據(jù)。
Return xxx
}

專(zhuān)門(mén)把這條提出來(lái)說(shuō)。是因?yàn)闆](méi)把加成放到角色對(duì)象里時(shí)。每次要戰(zhàn)斗或者要干點(diǎn)什么的時(shí)候。獲得角色數(shù)據(jù)后,還要加一大堆代碼處理加成。重復(fù)太多。一讓代碼前置,世界就清靜了。。。
、道具
道具比較特殊。因?yàn)榉N類(lèi)繁多,使用方式多,可能有多個(gè)存放地點(diǎn),可能有唯一道具。有天看了web魔獸的代碼。發(fā)現(xiàn)他的道具只有一個(gè)表。有一個(gè)字段,來(lái)處理道具位置,如(1,拍賣(mài)行,2,背包,3,倉(cāng)庫(kù),4,商店)這個(gè)辦法挺好的。不過(guò),如果道具的復(fù)雜度上去了。比如不同的倉(cāng)庫(kù),不同的拍賣(mài)行,需要合成等等。還是只有分表。
基礎(chǔ)道具表:
id
itemname 名稱(chēng)
itemprice 價(jià)格
itemimage 圖片
itemtype 類(lèi)型
uptype 增加類(lèi)型
uppoint 增加點(diǎn)數(shù)
addtype 增加類(lèi)型(永久)
addpoint 增加點(diǎn)數(shù)(永久)
cleardebuff 清除debuff
addbuff 增加buff
從uptype開(kāi)始。都可以寫(xiě)成xx|yy|zz的形式。最好一一對(duì)應(yīng)。分割符號(hào)可以自己選。
調(diào)用和處理數(shù)據(jù)的時(shí)候,可以用類(lèi)似下面的方式:
復(fù)制代碼 代碼如下:

$uptype = explode("|", $iteminfo['uptype']);
$uppoint = explode("|", $iteminfo['uppoint']);
for ($j=0;$j<count($uptype);$j++)
{
echo $uptype[$j];
echo $uppoint[$j];
}

倉(cāng)庫(kù),拍賣(mài)行,商店,背包等等。承載道具的地方。只要有個(gè)id字段來(lái)存道具id就可以。至于是橫表或者是縱表,根據(jù)實(shí)際需要選擇。目前為止,道具看上去處理得還不錯(cuò)。這時(shí)候,策劃說(shuō)。道具需要有唯一的,需要能附魔。ok,那么你把所有組合都填到道具表里吧。合成也就是a+b=c而已。。一計(jì)算。比如40個(gè)可能附魔的東西。200個(gè)可以附魔的道具。40*200=8000。顯然,策劃不會(huì)同意的。那么頭痛的就是程序了。怎么處理呢。加表吧。
唯一道具表:
id 唯一道具id(與普通道具id不能重復(fù)。方便背包等等調(diào)用)
temp_id 臨時(shí)id(默認(rèn)0。合成道具的時(shí)候可能會(huì)用到。)
itemid 原始道具id(獲得道具的初始值)
fumo_id 附魔id。(默認(rèn)0,即無(wú)附魔)
附魔表:(即增加的屬性)
id
uptype 增加類(lèi)型
uppoint 增加點(diǎn)數(shù)
cleardebuff 清除debuff
addbuff 增加buff
現(xiàn)在看功能修改
首先是道具類(lèi):
class Item
{
getItem()
{
//以前是直接根據(jù)id獲得道具信息就ok了。
//現(xiàn)在增加了附魔
//首先判斷道具id是否屬于唯一道具。(比如普通道具1-10000。唯一道具id的從10001開(kāi)始。如果覺(jué)得這樣不好,那么基礎(chǔ)道具表里,加個(gè)字段。判斷道具是否唯一)
if (道具唯一)
{
//從唯一道具表獲得原始道具id和附魔id
//根據(jù)原始道具id,或者道具基礎(chǔ)信息。
//根據(jù)附魔id,獲得附魔加成信息。
//兩邊值相加。
Return 道具信息。
}
else
{
直接獲得道具信息。
}
}
}
附魔功能:
道具A。(基礎(chǔ)道具)+道具B。(基礎(chǔ)道具) =道具C。(唯一道具)
也就是唯一道具是在附魔功能執(zhí)行的時(shí)候生成。以背包舉例。沒(méi)附魔前。
背包內(nèi)道具A。id為1。
背包內(nèi)道具B。id為2。
當(dāng)執(zhí)行附魔功能后。道具A,道具B的id都置0(橫表),或者刪除了(縱表)。生成一個(gè)唯一數(shù)。temp_id。(md5生成就行了。)生成一個(gè)唯一道具。這時(shí)候,根據(jù)temp_id,讓A的背包再次獲得唯一道具的id。道具,比較完善的解決了。
以下部分均涉及到一些商業(yè)問(wèn)題,所以只能給思路,及很少的代碼。
--------------------------------------------------------------------------------
、記時(shí)器
處理等待xx時(shí)間后,執(zhí)行xx的問(wèn)題。php自帶一個(gè)sleep()函數(shù)。等待時(shí)間也可以控制。
但是顯然,不管從運(yùn)用還是效率上講。都不足以支持游戲計(jì)時(shí)的。思路很簡(jiǎn)單。將需要倒計(jì)時(shí)的事件的所有參數(shù),以及開(kāi)始時(shí)間、結(jié)束時(shí)間。都存儲(chǔ)到一個(gè)表里。前臺(tái)用javascript倒計(jì)時(shí),時(shí)間到后,通過(guò)ajax調(diào)用時(shí)間到后的處理程序。后臺(tái)每隔一定時(shí)間,自動(dòng)執(zhí)行一次調(diào)用時(shí)間到后的處理程序。
至少需要三個(gè)php頁(yè)面。
一個(gè)用來(lái)寫(xiě)存取定時(shí)的內(nèi)容。
一個(gè)處理前臺(tái)時(shí)間到時(shí),結(jié)束操作。
一個(gè)處理后臺(tái)定時(shí)刷新,判斷時(shí)間到了就執(zhí)行結(jié)束,時(shí)間未到不作處理。
miracle:計(jì)時(shí)器是不同的計(jì)時(shí)器對(duì)應(yīng)不同的事件,還是可以多個(gè)事件都調(diào)用同一個(gè)計(jì)時(shí)器,如果一個(gè)玩家他調(diào)用了一個(gè)計(jì)時(shí)器計(jì)時(shí)一個(gè)建筑建設(shè)多長(zhǎng)時(shí)間,在之中又調(diào)用了這個(gè)計(jì)時(shí)器用來(lái)計(jì)時(shí)另一個(gè)建筑建設(shè)多長(zhǎng)時(shí)間,這樣行不行的?會(huì)不會(huì)有沖突?
鍵盤(pán)上的煙灰:
多個(gè)事件對(duì)應(yīng)1個(gè)計(jì)時(shí)器。
你可以在timer里增加一個(gè)字段。比如叫做actiontype(事件類(lèi)型)
每個(gè)用戶(hù)可以同時(shí)處理多件事。只是每個(gè)事情都有固定編號(hào)。
比如你的用戶(hù)允許同時(shí)做5件事情。那么actiontype里直接編號(hào)為1-5。調(diào)用計(jì)時(shí)器的時(shí)候,根據(jù)不同的編號(hào),你就知道這是用戶(hù)的第某個(gè)“線(xiàn)程”。
miracle
如果是不同的用戶(hù),調(diào)用同一個(gè)計(jì)時(shí)器是不會(huì)發(fā)生沖突的吧
鍵盤(pán)上的煙灰:
當(dāng)然不會(huì)。你看。userid可以用來(lái)確定某一個(gè)用戶(hù)。actiontype可以用來(lái)確定是第幾個(gè)線(xiàn)程。
、事件控制
結(jié)合記時(shí)器,處理開(kāi)始(),過(guò)程(),結(jié)束()
復(fù)制代碼 代碼如下:

interface Action
{
function doAction();
function beginAction();
function processAction();
function endAction();
}
//簡(jiǎn)單事件工廠(chǎng)
class ActionFactory
{
public function getAction($what)
{
$ActionName = $what;
return new $ActionName;
}
}
//比如移動(dòng)
class Move implements Action
{
function doAction()
{
具體執(zhí)行函數(shù)
什么時(shí)候該這行哪一個(gè)過(guò)程。都在這里判斷。
}
function beginAction()
{
事件開(kāi)始時(shí)候執(zhí)行。
這里可以把數(shù)據(jù)存到記時(shí)器里。以后就從記時(shí)器里取數(shù)據(jù)了。
}
function processAction()
{
從記時(shí)器里取數(shù)據(jù)。
事件執(zhí)行的過(guò)程。比如用戶(hù)刷新頁(yè)面的時(shí)候。如果仍然在倒計(jì)時(shí)。那么就是調(diào)用這里了。
}
function endAction()
{
從記時(shí)器里取數(shù)據(jù)。
事件結(jié)束的過(guò)程。
記時(shí)到后,完成事件。
}
}
//第一次調(diào)用的時(shí)候。
$Action = new ActionFactory();
$InstanceAction = $Action->getAction("Move");
$InstanceAction->set ($parameter);
$InstanceAction->doAction();
//以后調(diào)用的時(shí)候。
$Action = new ActionFactory();
$InstanceAction = $Action->getAction("Move");
//這時(shí)候,事件的參數(shù)或數(shù)據(jù)都從記時(shí)器里取得。
$InstanceAction->doAction();

、戰(zhàn)斗
即時(shí)和半即時(shí)的回合戰(zhàn)斗(兩人或多人即時(shí)回合制戰(zhàn)斗)比較繁瑣。
至少包含:
前臺(tái):
自動(dòng)接收邀請(qǐng)信息。Ajax
顯示戰(zhàn)斗過(guò)程。Ajax
回合倒計(jì)時(shí)間。javascript
后臺(tái):
發(fā)送邀請(qǐng),接受,拒絕,超時(shí)。一個(gè)表。戰(zhàn)斗數(shù)據(jù)。一個(gè)表。保存雙方或多方的數(shù)據(jù),包括回合時(shí)間,第幾回合等。
戰(zhàn)斗控制。一系列函數(shù)。處理玩家的操作,將操作存到戰(zhàn)斗數(shù)據(jù)表里。時(shí)間到后執(zhí)行操作。
出兵后,直接返回戰(zhàn)報(bào)。
寫(xiě)在事件里就行了。
function endAction()
{
從記時(shí)器里取數(shù)據(jù)。
生成回合,生成戰(zhàn)報(bào)。
}
注:由于本人工作原因,此系列可能要暫停一段時(shí)間才更新,望大家見(jiàn)諒。。。

相關(guān)文章

最新評(píng)論