最近在做仿雷電的游戲,其中敵人飛船的運(yùn)動(dòng)路線和特征需要能靈活的設(shè)置,并且盡量少動(dòng)其他部分的代碼,于是我的想法是把每種類型的飛船指定的運(yùn)動(dòng)路線存入腳本中,然后由引擎根據(jù)腳本執(zhí)行.
因此可以把飛船的路線看成是由一系列的關(guān)鍵點(diǎn)組成,每個(gè)點(diǎn)有比如3個(gè)屬性,X速度,Y速度和保持該速度的持續(xù)時(shí)間。而路線的運(yùn)動(dòng)軌跡可以由簡(jiǎn)單的腳本語(yǔ)言來(lái)定義,比如也許需要在某幾個(gè)點(diǎn)之間重復(fù)移動(dòng)一定的次數(shù)。
以下是一個(gè)Script Demo:
GO
BEGIN
1.0 0.0 500
END
BEGIN
-1.0 0.0 500
END
REPEAT 4
BEGIN
0.0 1.0 500
END
BEGIN
1.0 0.0 500
END
BEGIN
0.0 -1.0 500
END
BEGIN
-1.0 0.0 500
END
END
END
表示先左右移動(dòng)一次,然后向下,向右,向上,向左呈矩形移動(dòng)4次,通過(guò)設(shè)置速度分量可以實(shí)現(xiàn)任何路線的移動(dòng)以及其他特征。
該腳本語(yǔ)言解釋器采用了2個(gè)設(shè)計(jì)模式,F(xiàn)acade和Interpret模式,其中的解釋器使用了幾乎和任何設(shè)計(jì)模式書(shū)上介紹的一樣的結(jié)構(gòu),很經(jīng)典吶~
附上語(yǔ)言的文法定義:
program ::= GO command_list
command_list ::= command* END
command ::= begin_end_block | repeat
begin_end_block ::= BEGIN primitive END // Leaf Node on the Syntax tree
repeat ::= REPEAT INT command_list
primitive ::= SpeedX,SpeedY,Time // Recursive exit
// TestScript.txt
GO
BEGIN
1.0,0.0,500
END
BEGIN
-1.0,0.0,500
END
REPEAT 4
BEGIN
0.0,1.0,500
END
BEGIN
0.0,-1.0,500
END
END
END
// Execute result:
