最近在做仿雷电的游戏,其中敌人飞船的运动路线和特征需要能灵活的设置,并且尽量少动其他部分的代码,于是我的想法是把每种类型的飞船指定的运动路线存入脚本中,然后由引擎根据脚本执行.
因此可以把飞船的路线看成是由一系列的关键点组成,每个点有比如3个属性,X速度,Y速度和保持该速度的持续时间。而路线的运动轨迹可以由简单的脚本语言来定义,比如也许需要在某几个点之间重复移动一定的次数。
以下是一个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
表示先左右移动一次,然后向下,向右,向上,向左呈矩形移动4次,通过设置速度分量可以实现任何路线的移动以及其他特征。
该脚本语言解释器采用了2个设计模式,Facade和Interpret模式,其中的解释器使用了几乎和任何设计模式书上介绍的一样的结构,很经典呐~
附上语言的文法定义:
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: