[分享]分區寫法的修改

WOG設定安裝教學

版主: 涅魂, 簫哥


涅魂
 
文章: 4463
註冊時間: 2004-01-04 11:17 am
來自: Taiwan
性別: 男生

[分享]分區寫法的修改

文章涅魂 » 2007-07-09 1:15 pm

這篇是為了讓分區更好操作而改的。

首先,這裡將原本的sec Array改成 section Object

然後將sec Array的資料與birth的資料全部放入section 裡面,並透過areaData()和placeData()來建立結構

原本取用sec的名稱時只要直接帶入place的id到sec的index即可取得,換成section時則透過內建的getPlace()功能來取得名稱(也有getArea()來取得國家名稱)

或許有人會覺得為何要弄得這麼麻煩,但是我認為弄成這樣是有必要的

因為程式設計者看得懂的東西其他人不一定看得懂,所以這時就要用直覺化的物物件給他們操作了

就像上面提到的以前取得sec名稱的寫法,我想有部分架設wog的使用者可能還不明白為何要這樣寫

說了這麼多,還是來看看程式碼吧,下面這串程式碼加在wog.js

尋找
代碼: 選擇全部
/*=====================================================
 Copyright (C) ETERNAL<iqstar.tw@gmail.com>
 Modify : 2005/09/17
 URL : http://www.2233.idv.tw

 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.
===================================================== */

下方加上
代碼: 選擇全部
var section={
area: new Array(),
placeNum:0,
addArea:function(area_id,name,place){
   this.area[area_id]=new areaData(name,place);
},
addPlace:function(area_id,name,place_id){
   this.area[area_id].place.push(new placeData(name,area_id,place_id));
   this.placeNum++;
},
getArea:function(area_id){
   return this.area[area_id].name || null;
},
getPlace:function(place_id){
   for(var i in this.area){
      for(var j in this.area[i].place){
         if(this.area[i].place[j].place_id==place_id){
            return this.area[i].place[j].name;
         }
      }
   }
   return null;
}
}
function areaData(name,place){
   this.name=name,this.place=place || new Array();
}
function placeData(name,area_id,place_id){
this.name=name,this.area_id=area_id,this.place_id=place_id;
}
section.addArea(0,"選擇場所");
section.addArea(1,"中央大陸");
section.addArea(2,"魔法王國");
section.addArea(3,"熱帶雨林");
section.addArea(4,"末日王城");
section.addPlace(0,"選擇場地","");
section.addPlace(1,"中央平原",1);
section.addPlace(1,"黑暗沼澤",3);
section.addPlace(1,"王者之路",7);
section.addPlace(1,"水晶之間",13);
section.addPlace(2,"試鍊洞窟",2);
section.addPlace(2,"幻獸森林",8);
section.addPlace(2,"天空之城",12);
section.addPlace(2,"最果之島",15);
section.addPlace(3,"迷霧森林",4);
section.addPlace(3,"星河異界",9);
section.addPlace(3,"無淵洞窟",11);
section.addPlace(4,"古代遺跡",5);
section.addPlace(4,"久遠戰場",6);
section.addPlace(4,"灼熱荒漠",10);
section.addPlace(4,"失落古船",14);

雖然需要寫較多的程式碼,但是更容易維護的這項優點我想應該能夠蓋過這項缺點^^

接著是直接利用section的兩個函式:select_area()和onlinelist()的程式碼,首先先看select_area()
代碼: 選擇全部
function select_area(num,s)
{
   var ctr=0;
   if(num==='')
      num=0;
   s.act1.selectedIndex=0;
   var area=section.area[num];
   for(var i=0;i<area.place.length;i++){
      s.act1.options[i]=new Option(area.place[i].name,area.place[i].place_id);
   }
   s.act1.length=i;
   s.act1.options[0].selected=true;
}

看到這裡應該可以看得出來,結構化後的寫法原先的方法簡單多了,而且也比較容易維護^^

接著是onlinelist()
代碼: 選擇全部
function onlinelist(peo)
{
   var f=parent.wog_peo.document;
   message_cls(f,0);
   f.write(online_temp_table1);
   var secArr=new Array();
   var secNum=section.placeNum;
   var boy=0;
   var girl=0;
   if(peo!="")
   {
      f.write('<tr bgcolor="#2B4686"><td>名稱</td><td>LV</td><td>PK</td></tr>');
      var s1=peo.split(";");
      for(var i=0;i<s1.length;i++)
      {
         var s2=s1[i].split(",");
         var fcolor=psex(s2[1]);
         (s2[1]=="1")?boy++:girl++;
         s2[3]=(s2[3]==1)?"Y":"N";
         if(!secArr[s2[5]])
            secArr[s2[5]]='';
         secArr[s2[5]]+='<tr><td><a href=javascript:parent.yesname("'+s2[0]+'") target="foot" title="'+s2[4]+'"><b><font color="'+fcolor+'">'+s2[0]+'</font></b></a></td><td >'+s2[2]+'</td><td>'+s2[3]+'</td></tr>';
      }
      for(var i=0;i<secNum;i++)
      {
         if(secArr[i])
         {
            f.write(secArr[i]);
         }
         f.write('<tr><td  bgcolor="#2B4686" colspan="3">↑'+section.getPlace(i)+'練功↑</td></tr>');
      }
      f.write('<tr><td bgcolor="#2B4686" colspan="3"><font color="#66ccff">男生</font> '+boy+' 人</td></tr>');
      f.write('<tr><td bgcolor="#2B4686" colspan="3"><font color="#ff99cc">女生</font> '+girl+' 人</td></tr>');
      f.write('<tr><td bgcolor="#2B4686" colspan="3">線上人數 '+s1.length+' 人</td></tr>');
   }else
   {
      f.write('<tr><td colspan="3"  bgcolor="#2B4686">線上人數 0 人</td></tr>');
   }
   f.write(temp_table2);
}

寫法跟以前有點差距,且運作次數也和以前的不同,不知道這裡有沒有朋友能夠看出點端倪呢? 現在就先賣個關子吧XD

除了這裡之外還有些部分也會用到section的內容,像是status_view()和status_view2()等等,這些部分因為比較瑣碎也有很大的不定性,所以麻煩用搜尋功能尋找後自行改成section的用法吧^^"

以上,若有問題歡迎指教。


最後由 涅魂 於 2008-07-23 9:19 am 編輯,總共編輯了 2 次。
圖檔

頭像
齋月
 
文章: 557
註冊時間: 2006-02-27 7:54 am

文章齋月 » 2007-07-09 1:23 pm

先想辦法度過我的魔鬼體育暑修課再來慢慢研究 XD

(太有深度的一篇了...)


全身痠痛。。。 已經連續四天每天五個小時多快六小時的操了

明天開始連續五天。。。




涅魂
 
文章: 4463
註冊時間: 2004-01-04 11:17 am
來自: Taiwan
性別: 男生

文章涅魂 » 2007-07-09 2:00 pm

月會覺得有深度應該是還不習慣物件的寫法吧,這部分比較常寫在framework上而不會出現在一般的程式碼中

魔鬼體育暑修課…就當作是黃金週吧XD

還是說不只一週?雖然痛苦但這也是好事吧~我覺得這樣想著的話就不會覺得厭煩了


圖檔

頭像
齋月
 
文章: 557
註冊時間: 2006-02-27 7:54 am

文章齋月 » 2007-08-02 7:12 am

線上玩家有練功的區域才顯示 寫:尋找
代碼: 選擇全部
      for(var i=0;i<secNum;i++)
      {
         if(secArr[i])
         {
            f.write(secArr[i]);
         }
         f.write('<tr><td  bgcolor="#2B4686" colspan="3">↑'+section.getPlace(i)+'練功↑</td></tr>');
      }
覆蓋成
代碼: 選擇全部
      for(var i=0;i<secNum;i++)
      {
         if(secArr[i])
         {
            f.write(secArr[i]);
            [color=red]f.write('<tr><td  bgcolor="#2B4686" colspan="3">↑'+section.getPlace(i)+'練功↑</td></tr>');[/color]
         } 
      }


(完)



另外有個地方有點不是太方便。。。
就是當要關閉區域的時候,無法直接註解掉(所以區域號碼間不能有空掉)
這點不知道能不能解決 @@?

[hr]
即日起消失兩星期XD
去找樓下的美國玩 :face5:




涅魂
 
文章: 4463
註冊時間: 2004-01-04 11:17 am
來自: Taiwan
性別: 男生

文章涅魂 » 2007-08-02 5:58 pm

月說的應該是將某個area跟area旗下的place註解掉後會出現問題吧??

這是因為顯示area 選單的部分沒有一起改成這種形式的寫法所以會出現點問題,請做下列修改吧

in ad_view() Function

尋找
代碼: 選擇全部
<option value="" SELECTED>選擇場所</option><option value="1" >中央大陸</option><option value="2" >魔法王國</option><option value="3" >熱帶雨林</option><option value="4" >末日王城</option>

刪除

尋找
代碼: 選擇全部
var temp_s=Gookie("wog_set_cookie");

上方,加上
代碼: 選擇全部
var oForm=parent.wog_view.document.f1;
   for(var i=0;i<section.area.length;i++){
      oForm.act_area.options[i]=new Option(section.area[i].name,i);
   }

[hr]
記得要帶份土產唷 XDD


圖檔

頭像
齋月
 
文章: 557
註冊時間: 2006-02-27 7:54 am

文章齋月 » 2008-01-18 11:08 am

喔喔

是因為先把玩家的資料依冒險區域用 secArr=new Array(); 記錄下來

然後再一口氣掃過全部區域 抽出對應的 secArr 來顯示

所以運作比較快嗎 ^^?




原本的是 每一個地區 就跑全部玩家列表一次 相對應的才顯示 然後再跑下一區

所以 50 個區域的話 同樣的玩家列表資料就跑了 50 次 @@




不知道我有沒有猜對 XD




回到 精華區

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 12 位訪客