- 注册时间
- 2005-5-28
- 最后登录
- 2005-10-8
⑥精研
- 积分
- 1253
|
发表于 2005-11-27 06:40:16
|
显示全部楼层
各位好,又到了[ARPG類]的腳本設計教學了。
這次的教學內容是做出ARPG類的地圖行動模式。
在地圖上顯示一個視窗,並且可以透過使用定義按鍵來控制視窗內的變化。
有人因該玩過一些ARPG遊戲,地圖上只有主角一個人在移動,當按下特殊鍵時
主角會切換到第二位腳色來進行。
我這個腳本,不但是帶隊隊長可以在地圖上直接切換,按下esc鍵後整個隊伍排列資料
也會更新。
如此依來,各位就可以設計出更多元化的遊戲內容。
比方說,開寶箱事件要[盜賊]帶隊才可以進行。這樣就更有趣味嚕!!
廢話不多說,下面就是完整的設計腳本!
-----------------------------------------------------------------------
[使用腳本]
Scene_map 地圖場景。用來在地圖上開啟腳色切換功能!
Window_PartyChange 自創的腳色切換功能視窗
-----------------------------------------------------------------------
請將此視窗插入Main上方即可:
#----------------------------------------------------------------------
#本腳本為霞影丸製作,歡迎任意修改、討論!
#MSN kevin7563@hotmail
#----------------------------------------------------------------------
class Window_PartyChange < Window_Selectable
#--------------------------------------------------------------------------
# ● 初始化對像
#--------------------------------------------------------------------------
def initialize
super(0, 0, 80, 64)
self.contents = Bitmap.new(width - 32, height - 32)
self.back_opacity = 160
@max_actor = $game_party.actors.size
@number_actor = 0
end
#主命令
def refresh
x = 0
y = 0
size = 24
self.contents.clear
if $game_party.actors.size <= 1 #判斷當隊伍只有一人或是無人時
#-----------------小臉描繪-------------------------------------------------
actor = $game_party.actors[0]
bitmap = RPG::Cache.character(actor.character_name,actor.character_hue)
src_rect = Rect.new((bitmap.width/4 - size)/2, 0, size, size)
self.contents.blt(x, y, bitmap, src_rect)
else
# 按鍵控制,按下Shift後切換腳色
if Input.trigger?(Input::A) and @number_actor < @max_actor
@number_actor += 1
@number_actor %= @max_actor
actor_temp = $game_party.actors[0] #第一位腳色資料暫存
$game_system.se_play($data_system.cancel_se)
#---腳色資料交換
for i in 0 .. $game_party.actors.size -1
if i >= $game_party.actors.size -1
$game_party.actors = actor_temp
else
$game_party.actors = $game_party.actors[ i + 1]
end
end
$game_player.refresh #更新帶隊腳色!!
end
actor = $game_party.actors[0]
#-----------------小臉描繪-------------------------------------------------
bitmap = RPG::Cache.character(actor.character_name,actor.character_hue)
src_rect = Rect.new((bitmap.width/4 - size)/2, 0, size, size)
self.contents.blt(x, y, bitmap, src_rect)
end
end
end
[解析]
首先我們看到
def initialize
super(0, 0, 80, 64)
self.contents = Bitmap.new(width - 32, height - 32)
self.back_opacity = 160
@max_actor = $game_party.actors.size
@number_actor = 0
end
這一段是用來設定視窗的初始化資料,其中比較重要的是:
@max_actor = $game_party.actors.size
@number_actor = 0
這兩個區域變數是等等用來控制選取功能的範圍使用。
再來看到此腳本的核心:
#主命令
def refresh
x = 0
y = 0
size = 24
self.contents.clear
# 游標右 (+1)
if Input.trigger?(Input::A) and @number_actor < @max_actor
@number_actor += 1
@number_actor %= @max_actor
actor_temp = $game_party.actors[0] #第一位腳色資料暫存
$game_system.se_play($data_system.cancel_se)
#---腳色資料交換
for i in 0 .. $game_party.actors.size
if i >= 3
$game_party.actors = actor_temp
else
$game_party.actors = $game_party.actors[ i + 1]
end
end
$game_player.refresh #更新帶隊腳色!!
end
actor = $game_party.actors[0]
#-----------------小臉描繪----------------------------------------------
bitmap = RPG::Cache.character(actor.character_name,actor.character_hue)
src_rect = Rect.new((bitmap.width/4 - size)/2, 0, size, size)
self.contents.blt(x, y, bitmap, src_rect)
end
其中這一段:
# 游標右 (+1)
if Input.trigger?(Input::A) and @number_actor < @max_actor
@number_actor += 1
@number_actor %= @max_actor
這是設定內定按鍵Shift 按下後,執行後續的動作使用。並且給他一個範圍
以免超過後選取不到腳色資料。
再來看到腳色資料交換的核心:
actor_temp = $game_party.actors[0] #第一位腳色資料暫存
$game_system.se_play($data_system.cancel_se)
#---腳色資料交換
for i in 0 .. $game_party.actors.size
if i >= @player_limit
$game_party.actors = actor_temp
else
$game_party.actors = $game_party.actors[ i + 1]
end
end
$game_player.refresh #更新帶隊腳色!!
首先我設計了 actor_temp 這變數,他是用來暫存第一位腳色的所有資料用。
以免在資料交換時,找不到資料。
基本上的結構就是一個循環。
當腳色被切換後,原本的第一位腳色($game_party.actors[0])會被排到隊伍最後面
而第二位腳色會被推到第一位原本的位置。依此類推~
最後呢,就是要即時的更新地圖上帶隊的腳色圖形了。
我們可以看到在Game_player內,定義帶隊腳色的地方(def refresh)
def refresh
# 同伴人數為 0 的情況下
if $game_party.actors.size == 0
# 清除角色的文件名及對像
@character_name = ""
@character_hue = 0
# 分支結束
return
end
# 獲取帶頭的角色
actor = $game_party.actors[0]
# 設置角色的文件名及對像
@character_name = actor.character_name
@character_hue = actor.character_hue
# 初始化不透明度和合成模式子
@opacity = 255
@blend_type = 0
end
裏面就是取得$game_party.actors[0]的腳色來帶隊。
所以我們只要執行game_player內的refresh這功能就可以達到即時的更新地圖腳色。
$game_player.refresh #更新帶隊腳色!!
最後的小臉描繪,這只是用來在視窗內顯示現在是誰帶隊的小臉圖示而已:
actor = $game_party.actors[0]
#-----------------小臉描繪----------------------------------------------
bitmap = RPG::Cache.character(actor.character_name,actor.character_hue)
src_rect = Rect.new((bitmap.width/4 - size)/2, 0, size, size)
self.contents.blt(x, y, bitmap, src_rect)
以上就是 Window_PartyChange 的設計!!
接下來,我們就要讓這視窗顯示在地圖上了!!
-------------------------------------------------------------------------
開啟Scene_Map 角本,請在下面幾處插入語法:
在 def main 下方插入:
#產生隊員交換視窗
if $game_party.actors.size >= 1 #這是用來判斷萬一初始時沒有主角在隊伍內
@change_window = Window_PartyChange.new
@change_window.x = 50
@change_window.y = 350
end
這是用來定義Window_PartyChange 視窗的初始值資料,以及給他指定地圖上顯示的
座標(@change_window.x = 50 與 @change_window.y = 350)。
再來看到,同樣是在def main 內的下方,可以找到:
# 準備過渡
Graphics.freeze
# 釋放活動塊
@spriteset.dispose
# 釋放訊息窗口
@message_window.dispose
我們在這下方插入:
#釋放隊員交換視窗
if $game_party.actors.size >= 1
@change_window.dispose
end
最後,找到:
#--------------------------------------------------------------------------
# ● 刷新畫面
#--------------------------------------------------------------------------
def update
這裡面我們找到:
# 刷新活動塊
@spriteset.update
# 刷新訊息窗口
@message_window.update
請在這下方插入:
#刷新隊員交換視窗
if $game_party.actors.size >= 1
@change_window.refresh
end
這是直接呼叫Window_PartyChange 並執行這腳本內的 refresh 功能!
解說完畢!!
------------------------------------------------------------------
[使用方法]
各位測試遊戲吧,按下鍵盤上的Shift鍵後,可以看到地圖上的視窗,以及帶隊主角
的及時變化。
再按下esc 鍵,可以看到整個隊伍的排列順序也被更新嚕!! |
|