Re: [問題]關於es2lib虛擬物件的生成

看板mud (網路地下城/文字遊戲)作者 (小太保)時間14年前 (2011/12/28 16:41), 編輯推噓2(203)
留言5則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《happyhero (2010)》之銘言: : Es2lib的物件生成 有種以虛擬物件的方式 : 例如有個檔案是 /std/room.c : 可以在程式碼裡用 : obj=new("/std/room.c"); : 來生成一個新的物件 : 然後檔名會變成/std/room#33 : /std/room#76 : /std/room#177 : .... : (都是原檔名後面增加#數字) : 想請問虛擬物件的檔名是如何產生? : (#後面的數字是亂數決定或是有規律?) : 有辦法改變或指定虛擬物件生成後的檔名嗎? : 想說如果可以的話 : 就可以方便管理整個都用虛擬物件生成的區域 : 最近在寫類似OLG副本的東西 : 例如某個玩家happyhero開啟了副本 : 那那個區域房間名就會以 /std/room/happyhero/0/0/0 : /std/room/happyhero/0/1/0 : 後面數字表示三維空間(x,y,z) 0/0/0=第0層空間的(0,0) : 這樣還可以做出無限層的地下城冒險區域 這個一般建議是不要這樣寫,比方說單人副本,省時省力 的方法就是「全部運作在同一個房間」。 例如該房間平常長底下這樣.. 地下城--一樓 這裡可看到一條長長的走道,走道上十分的陰暗,不遠處 似乎有著水滴的聲音。 明顯出口有: north, south. 則當你往 north 走時 set("pre_exit_func/north","check_north"); object tmp_room; int check_north() { object ppl=this_player(); int *pos=([]); pos=query("pos"); // 讀取房間座標 ({x,y}) 做一下必要的判斷如戰鬥中,etc...時不能走動; if(!tmp_room) tmp_room=find_object_or_load(TMP_ROOM); // 自設一個房間當 tmp_room // 往北走 => y+1 set("pos",({pos[0],pos[1]+1}); set("long",set_room_long()); // 重設房間 long set("exits",set_room_exits()); // 重設房間出口 ppl->move(tmp_room); // 先把玩家移往 tmp_room ppl->move_player(this_object()); // 瞬間再把玩家移回來 clone_mob(); // 做一下房間怪物的隨機召喚 return 1; } 這樣就可以模擬一個玩家在一個「空間」裡面的走動跟戰鬥 ,set_room_long 等函數就看你怎麼寫。 這樣當 n 位玩家同時在解這個「單人任務」時,就可以每個 玩家給一個房間來跑(tmp_room 則是大家共通的),而假設是 n 人組隊型的任務,就限制不能脫隊即可。 而這樣的房間也可以事先寫好,例如預設同一時間只能 10個 團體(包含單人)解任務,那就一次寫好十個房間就可以了,這 樣玩家在解任務時會變更的就只有物件資料(記憶體資料),檔 案的讀寫部份就會比較少。 至於檔案部份一般是 base_name 跟 file_name 的區別,後者 或許你可以找找 simul_efun 區是不是有該函數,那說不定就 能找到後頭的編號是怎麼編的。 (印象中是物件生成流水號) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 223.142.203.159

12/28 20:20, , 1F
全部運作在同一個房間的做法不錯
12/28 20:20, 1F

12/28 20:21, , 2F
這樣就只剩遇敵戰鬥的問題了 限制有mob在時不能逃跑
12/28 20:21, 2F

12/28 20:23, , 3F
或是看不到不同坐標的生物
12/28 20:23, 3F
一般來說有一種做法並不需要知道 file_name 所加的流水號。 例如你因為需要而得在同一時間 new 出 n 個物件,那麼你可以 做個 control_room object cr,new_room; int *pos=([]); string new_pos; if(!cr) cr=find_object_or_load(CONTROL_ROOM); j=sizeof_rooms; // 需 new 出的 n 個房間 for(i=0;i<j;i++) { new_room=new(room); // new 出新的房間 pos=get_pos(i); // 取出第 i 個房間的座標 new_pos=implode(pos,"_"); // 把座標變成 a_b_c 這種字串 cr->set("new_pos",new_room); } 這樣你要讀取座標 (a,b,c) 的房間時 this_room = (object)cr->query(""+a+"_"+b+"_"+c); ※ 編輯: laechan 來自: 122.117.7.33 (12/28 21:00)

12/28 21:52, , 4F
XD...我剛才在寫control room的方式 這裡就出現了
12/28 21:52, 4F

12/28 21:53, , 5F
不過剛事先用單向道做測試 所以很單純記錄1->2->3->4...
12/28 21:53, 5F
文章代碼(AID): #1E-jOpuE (mud)
討論串 (同標題文章)
文章代碼(AID): #1E-jOpuE (mud)