游戏开发论坛

 找回密码
 立即注册
搜索
查看: 21868|回复: 60

用脚本来控制自己的游戏怎么样?Afflatus Script Engine 正式

[复制链接]

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
发表于 2008-6-20 19:54:00 | 显示全部楼层 |阅读模式
很容易使用的:
0:将压缩包中的几个模块文件添加入你的工程
1:读取脚本,存储在一个字符串里
2:释放脚本
3:运行指定函数名
4:清理

这里有三个关键函数:
ReleaseSub(Code,True)
释放脚本:其中Code用一个字符串变量代替,字符串中存储着预先编辑的Afflatus代码。

RunSub(Name,Parameters)
运行指定名字的函数:比如你载入脚本之后想从"main"函数开始运行,你可以
RunSub("main",True)

CleanUp
清除脚本系统中使用的函数,定义,引用,释放的代码等一切数据。


如何控制自己的游戏呢?
这里有两个模块要注意:
首先打开"modAFFInterface"模块,找到"ExcuteInterfaceSentences"函数。这里面可以自己定义自己游戏中需要的命令。"ReplyInterfaceFuntionCall"函数中则可以自定义自己游戏中可以返回一个量的函数。

可以以事件驱动的方式控制游戏,比如,可以在游戏中设置当主角和NPC对话时,运行与NPC对话相关函数:RunSub("TALK_NPC_" & NPC.Name, True),也可以在草地中碰到敌人时,运行相关函数:RunSub("Enemy_Attack", True)
之前将相关函数的内容用Afflatus语言的格式编写在文件里,调用后,剩下的就交给这个脚本系统好啦。
比如之前的和NPC对话的代码可以这么编写:
procedure Talk_NPC_ShopKeeper;
int result;
  talk("你好,请问您要买什么?");
  result:=menu("汉堡包","三明治","冰淇淋","我不要啦");
  buy(result);
endprocedure;

当然,其中的talk,menu,buy等函数都需要您在modAFFInterface模块中设置完成。


"modAFFConsts"模块中可以定义游戏中用到的常量。

其他几个模块都是支持这个系统运作的必须文件,需要修改的请慢慢研究后再作改动。

modAFFCallAPI:调用API
modAFFConsts:系统内置常数设定
modAFFError:错误处理
modAFFGeneral:代码释放
modAFFInterface:开发者自定义函数,过程等接口
modAFFRuntime:运行时
modAFFString:字符串处理模块

下载地址:

sf_2008620195338.rar

34.06 KB, 下载次数:

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
 楼主| 发表于 2008-6-20 19:58:00 | 显示全部楼层

Re:用脚本来控制自己的游戏怎么样?Afflatus Script Engine 正

语法快速向导:


函数体:
procedure name(type varname,type varname...);
  [sentences]
endprocedure;

引用外部文件:
include("filename");

分支:
if(condition);
  [statements]
else;
  [elseifstatements]
endif;

switch(testexpression);
  [case(expressionlist1);
    [statementblock-1]]
  [case(expressionlist2;
    [statementblock-2]]
  .
  .
  .
  [default;
    [statementblock-n]]
endswitch;

循环:
do While(condition);
statements
loop;

do;
statements
loop while(condition);

do until(condition);
statements
loop;

do;
statements
loop Until(condition);

for(initvalue,stopcontidion,incsentence);
statements
next;

Example:
  for(i:=1,i<=100,i:=i+1);s:=s+i;next;
  messagebox("Result is "s".",MB_INFORMATION,"Result");

跳出循环或分支:
break;

数据类型:
int:(长整型)变量存储为 32 位(4 个字节)有符号的数值形式,其范围从 -2,147,483,648 到 2,147,483,647。
string:(字符串) String 之字符码的范围是 0 到 255。字符集的前 128 个字符(0 到 127)对应于标准的 U.S. 键盘上的字符与符号。这前 128 个字符与 ASCII 字符集中所定义的相同。后 128 个字符(128 到 255)则代表特殊字符,例如国际字符,重音符号,货币符号及分数。
float:(单精度浮点型)变量存储为 IEEE 32 位(4 个字节)浮点数值的形式,它的范围在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1.401298E-45 到 3.402823E38。

变量声明:
type varname1,varname2[:=defaultvalue];

Example:
int Number1,Number2;
string strName:="John";
float Sum:=0.5;

定义常量:
define type varname;

Example:
define float PI:=3.14159265;

销毁变量:
destroy varname1,varname2;

赋值语句:
varname:=expression;

Example:
area:=2*PI*r*r;

退出当前过程:
exit;

退出当前程序:
end;

函数中返回值:
return(value);

调用其他过程:
call subname(parameters);

调用API:
callapi(libname,functionname,IsASCIIfunction,type1 varname1,type2 varname2...);

Example:
  callapi("user32","MessageBoxA",1,int 0,string "Hello\cWorld!",string "CallAPI",int 0);
  gtc:=callapi("Kernel32","GetTickCount",0);

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
 楼主| 发表于 2008-6-20 20:07:00 | 显示全部楼层

Re:用脚本来控制自己的游戏怎么样?Afflatus Script Engine 正

实例对比
我以前做的一个RPG游戏的一个测试脚本系统用的地图,脚本语言用的是我以前自制的“蓝宝石”,名字跟了Matz的“红宝石”,呵呵,但是这个系统很糟糕,虽然实现了远离硬编码,灵活控制游戏,但是语法很难记,复杂,开发效率低。



"蓝宝石"脚本语言:
25
   00
2660143,是@Yes/否@No/,是否开始精灵方向测试?%90Yes%00你将看到一个女孩转动身体%19%20%05Girl04,13,12%06Girl04,True%07Girl04,U%021%07Girl04,L%021%07Girl04,D%021%07Girl04,R%021%07Girl04,U%021%06Girl04,False%05Girl04,-1,-1%19%20%90No%
2670143,是@Yes/否@No/,是否开始精灵走动测试?%90Yes%00你将看到一个女孩走动%19%20%05Girl04,13,11%06Girl04,True%07Girl04,D%08Girl04,2%07Girl04,R%08Girl04,2%07Girl04,U%08Girl04,2%07Girl04,L%08Girl04,5%07Girl04,D%08Girl04,2%07Girl04,R%08Girl04,2%07Girl04,U%08Girl04,2%07Girl04,R%08Girl04,1%06Girl04,False%05Girl04,-1,-1%19%20%90No%
2680143,是@Yes/否@No/,是否开始多精灵走动测试?%90Yes%00你将看到一个女孩和一个男孩走动%19%20%05Girl04,10,11%05Boy01,13,11%06Girl04,True%06Boy01,True%07Girl04,D%07Boy01,D%29Girl04/Boy01/,2%07Girl04,R%07Boy01,R%29Girl04/Boy01/,2%07Girl04,U%07Boy01,U%29Girl04/Boy01/,2%07Girl04,L%07Boy01,L%29Girl04/Boy01/,2%06Girl04,False%06Boy01,False%05Girl04,-1,-1%05Boy01,-1,-1%19%20%90No%
2690143,是@Yes/否@No/,是否开始精灵Tip测试?%90Yes%00你将看到自己头上的感叹号%09Lead%19%20%00你将看到一个女孩头上的感叹号%19%20%05Girl04,12,11%06Girl04,True%07Girl04,D%09Girl04%06Girl04,False%05Girl04,-1,-1%19%20%90No%
2700144,开始@Yes/停止@No/,是否开始精灵顺序脚本测试1?%90Yes%00你将看到一个胖男孩绕着这里走动%19%20%05FatBoy01,10,10%06FatBoy01,True%28FatBoy01,True%07Girl04,D%15Exit%90No%05FatBoy01,0,0%06FatBoy01,False%28FatBoy01,False%07Girl04,U%90Exit%19%20%
2710144,开始@Yes/停止@No/,是否开始精灵顺序脚本测试2?%90Yes%00你将看到一个博士在这里随意走动%19%20%05DrOak,13,12%06DrOak,True%28DrOak,True%15Exit%90No%05DrOak,0,0%06DrOak,False%28DrOak,False%90Exit%19%20%
2720148,变成女孩@Girl/变成男孩@Boy/结束@Exit/,是否开始变身测试?%90Girl%00你将变成一个女孩%10Kyouko%15Exit%90Boy%00你将变成一个男孩%10Rebooto%90Exit%19%20%
400000这里是精灵展示区#欢迎测试#只需调查告示牌#就可以看到结果%19%20%
522090Start%144,开始@Yes/恢复@No/退出@Exit/,是否开始Tile变化测试1?%90Yes%00你将看到怪兽球变成石头%19%20%33588,1,Stone%15Exit%90No%00你将看到石头变回怪兽球%19%20%34588,1%90Exit%19%20%
523090Start%144,开始@Yes/恢复@No/退出@Exit/,是否开始Tile变化测试2?%90Yes%00你将看到怪兽球上面有树叶%19%20%33588,2,Tree%15Exit%90No%00你将看到怪兽球上面的树叶消失%19%20%34588,2%90Exit%19%20%
524090Start%144,开始@Yes/恢复@No/退出@Exit/,是否开始碰撞变化测试?%90Yes%00怪兽球将可以通过%19%20%37588,0%15Exit%90No%00怪兽球将不可通过%19%20%37588,1%90Exit%
5250143,是@Yes/否@No/,是否开始动画测试?%90Yes%00你将看到怪兽球的Tile播放开门动画%19%20%38588,1,OpenDoor01,4,0.05%90No%
526000这里是Tile展示区#欢迎测试#只需调查告示牌#就可以看到结果%19%20%
5300143,是@Yes/否@No/,是否开始图片输出测试?%90Yes%00你将看到一张图片#按调查键这张图片才会消失%19%20%18001,0%19%20%00你将看到一张图片#这张图片保留到下一个对话框%19%20%18001,-1%00看到了吗?#这张图片保留到这个对话框#作为了这次对话的背景%00你将看到一张图片#这张图片保留3秒钟%19%20%18001,3%90No%
531021a%143,是@Yes/否@No/,是否开始变量测试?%90Yes%25a,请输入一个字符串,默认字符串%19%20%00你输入的是'a'%25a,请输入一个表达式,(2+3)*2/5%19%20%24a,'a',Number%00计算的结果是'a'%19%20%90No%
534000这里是常规展示区#欢迎测试#只需调查告示牌#就可以看到结果%19%20%
1001000你好#我就是胖男孩#这次测试的临时登场人物%19%20%
1002000你好#我是博士#这次测试的临时登场人物#有能力的话请尽快完成这个游戏%19%20%
343000按<空格键>继续#...%00欢迎你的到来%00这是一幅测试地图#用于测试这个游戏的脚本系统%00下面开始测试#你只需要调查每个公告板#按下<空格键>,就像这样%07Lead,D%19%20%
5320143,是@Yes/否@No/,是否开始延迟特性测试?%90Yes%00请和我一起读秒#从1开始数到5#每秒钟数一下#开始%001,1%002,1%003,1%004,1%005,1%00数完了%19%20%90No%
5330143,是@Yes/否@No/,是否开始预设变量测试?%90Yes%00你目前的位置是'Lead.Position'你目前的#方向是'Lead.Direction'%00现在的日期是'Date'#现在的时间是'Time'%00现在的日期时间是'Now'%19%20%90No%
472021Item1,Item2%24Item1,菜单项1%24Item2,菜单项2%147,'Item1'@Yes/'Item2'@No/,这是菜单变量引用测试,RU%90Yes%90No%19%
370000打开了电脑!,0%19%20%90OpenMenu%146,存档@10/关闭@20/,做什么?,%9010%144,是@Yes/否@OpenMenu/,是否把当前状态记入存档?,%90Yes%70%00已经将当前状态记入存档。,0%19%20%15OpenMenu%9020%19%20%
310119%20%145,是@Yes/否@No/,您确定要离开#脚本测试地图?%90Yes%01start,1,N,N%90No%07Lead,D%08Lead,1%19%20%


现在这个游戏采用Afflatus开发,人物,地形等映射为对象,可以自由操控,编码行云流水,所想流畅输入代码编辑器,开发效率大大提高。

同一段代码用Afflatus脚本语言编写:
int Answer;
int OriginalIndex;
procedure WelcomeBoard_Lookinto;
  messagebox("欢迎来到脚本系统测试地图","这张地图专为测试Afflatus",
"脚本系统而作","这张地图","涉及了控制这个游戏","的各个方面","使用方向键移动",
"在需要测试的项目前","按调查键即可测试该项目","Afflatus是完全免费","和开放源代码的","欢迎您在您的游戏中使用",
"Afflatus作为脚本系统","帮助您更高效地进行","游戏开发工作","有问题请联系我","我的邮件是",
"pokemon1024@hotmail.com","谢谢");
endprocedure;
procedure SpiritTestBoard_Lookinto;
  messagebox("这里是精灵控制测试区");
endprocedure;
procedure SpiritTest01_Lookinto;
  Answer:=Menu("是否开始精灵方向测试?","是","否");
  if(Answer=1);
    messagebox("你将看到一个女孩转动身体");
    Girl04.Position:=365;
    Girl04.Visible:=True;
    Girl04.Direction:=Aff_Up;Sleep(1);
    Girl04.Direction:=Aff_Left;Sleep(1);
    Girl04.Direction:=Aff_Down;Sleep(1);
    Girl04.Direction:=Aff_Right;Sleep(1);
    Girl04.Direction:=Aff_Up;Sleep(1);
    Girl04.Visible:=False;
    Girl04.PosX:=-1;
    Girl04.PosY:=-1;
  endif;
endprocedure;
procedure SpiritTest02_Lookinto;
  Answer:=Menu("是否开始精灵走动测试?","是","否");
  if(Answer=1);
    messagebox("你将看到一个女孩走动");
    Girl04.Move(13,11);
    Girl04.Visible:=True;
    Girl04.Direction:=Aff_Down;Girl04.Step(2);
    Girl04.Direction:=Aff_Right;Girl04.Step(2);
    Girl04.Direction:=Aff_Up;Girl04.Step(2);
    Girl04.Direction:=Aff_Left;Girl04.Step(5);
    Girl04.Direction:=Aff_Down;Girl04.Step(2);
    Girl04.Direction:=Aff_Right;Girl04.Step(2);
    Girl04.Direction:=Aff_Up;Girl04.Step(2);
    Girl04.Direction:=Aff_Right;Girl04.Step(1);
    Girl04.Visible:=False;
    Girl04.Move(-1,-1);
  endif;
endprocedure;
procedure SpiritTest03_Lookinto;
  Answer:=Menu("是否开始多精灵走动测试?","是","否");
  if(Answer=1);
    messagebox("你将看到一个男孩和一个女孩走动");
    Girl04.Move(10,11);
    Boy01.Move(13,11);
    Girl04.Visible:=True;
    Boy01.Visible:=True;
    Girl04.Direction:=Aff_Down;Boy01.Direction:=Aff_Down;
    MoveSpirits(2,"Girl04","Boy01");
    Girl04.Direction:=Aff_Right;Boy01.Direction:=Aff_Right;
    MoveSpirits(2,"Girl04","Boy01");
    Girl04.Direction:=Aff_Up;Boy01.Direction:=Aff_Up;
    MoveSpirits(2,"Girl04","Boy01");
    Girl04.Direction:=Aff_Left;Boy01.Direction:=Aff_Left;
    MoveSpirits(2,"Girl04","Boy01");
    Girl04.Visible:=False;
    Boy01.Visible:=False;
    Girl04.Move(-1,-1);
    Boy01.Move(-1,-1);
  endif;
endprocedure;
procedure SpiritTest04_Lookinto;
  Answer:=Menu("是否开始精灵Tip测试?","是","否");
  if(Answer=1);
    messagebox("你将看到自己头上的感叹号");
    Leader.Tip;
    messagebox("你将看到一个女孩头上的感叹号");
    Girl04.Move(12,11);
    Girl04.Direction:=Aff_Down;
    Girl04.Visible:=True;
    Girl04.Tip;
    Girl04.Visible:=False;
    Girl04.Move(-1,-1);
  endif;
endprocedure;
procedure SpiritTest05_Lookinto;
  Answer:=Menu("是否开始精灵顺序脚本测试?","开始","停止");
  if(Answer=1);
    FatBoy01.Move(10,10);
    FatBoy01.Reset;
    FatBoy01.Visible:=True;
    FatBoy01.Enabled:=True;
  else;
    FatBoy01.Move(-1,-1);
    FatBoy01.Visible:=False;
    FatBoy01.Enabled:=False;
  endif;
endprocedure;
procedure SpiritTest06_Lookinto;
  Answer:=Menu("是否开始精灵随机脚本测试?","开始","停止");
  if(Answer=1);
    DrOak.Move(13,12);
    DrOak.Visible:=True;
    DrOak.Enabled:=True;
  else;
    DrOak.Move(-1,-1);
    DrOak.Visible:=False;
    DrOak.Enabled:=False;
  endif;
endprocedure;
procedure SpiritTest07_Lookinto;
  Answer:=Menu("是否开始角色模型变化测试?","变成女孩","变成男孩","结束");
  if(Answer=1);
    Leader.Model:="Kyouko";
  endif;
  if(Answer=2);
    Leader.Model:="Rebooto";
  endif;
endprocedure;
procedure FatBoy01_Lookinto;
  messagebox("如果测试结果正确","我应该绕着这里走");
endprocedure;
procedure DrOak_Lookinto;
  messagebox("如果测试结果正确","我应该随机走动");
endprocedure;
procedure TileTestBoard_Lookinto;
  messagebox("这里是地形控制测试区");
endprocedure;
procedure TileTest01_Lookinto;
  Answer:=Menu("是否开始Tile变化测试1?","开始","恢复","结束");
  if(Answer=1);
    messagebox("你将看到怪兽球变成石头");
    OriginalIndex:=Mark01.BG1;
    Mark01.BG1:=Stone.Index;
  endif;
  if(Answer=2);
    if(Mark01.BG1<>Stone.Index);
      messagebox("已经是怪兽球了");
    else;
      messagebox("你将看到石头变回怪兽球");
      Mark01.BG1:=OriginalIndex;
    endif;
  endif;
endprocedure;
procedure TileTest02_Lookinto;
  Answer:=Menu("是否开始Tile变化测试2?","开始","恢复","结束");
  if(Answer=1);
    messagebox("你将看到怪兽球旁的盆景");
    Mark01.BG2:=Tree01.Index;
    Mark02.BG1:=Tree02.Index;
    Mark02.Collision:=True;
  endif;
  if(Answer=2);
    if(Mark01.BG2=0);
      messagebox("已经清除盆景了");
    else;
      messagebox("怪兽球上面的盆景将会消失");
      Mark01.BG2:=0;
      Mark02.BG1:=0;
      Mark02.Collision:=False;
    endif;
  endif;
endprocedure;
procedure TileTest03_Lookinto;
  Answer:=Menu("是否开始地形碰撞控制测试?","开始","恢复","结束");
  if(Answer=1);
    messagebox("怪兽球将可以通过");
    Mark01.Collision:=False;
  endif;
  if(Answer=2);
    messagebox("怪兽球将不可以通过");
    Mark01.Collision:=True;
  endif;
endprocedure;
procedure TileTest04_Lookinto;
  Answer:=Menu("是否开始地形动画播放测试?","是","否");
  if(Answer=1);
    Refresh;
    Mark01.PlayAnimation(1,"OpenDoor01");
  endif;
endprocedure;
procedure Mark01_Walkon;
  messagebox("正站在怪兽球上面");
endprocedure;
procedure GeneralTestBoard_Lookinto;
  messagebox("这里是常规项目测试区");
endprocedure;
procedure GeneralTest01_Lookinto;
  Answer:=Menu("是否进行图片输出测试?","是","否");
  if(Answer=1);
    messagebox("你将看到一张图片","按调查键这张图片才会消失");
    PaintPicture("gfx001",0);
    Refresh;
    messagebox("你将看到一张图片","这张图片保留到下一个对话框");
    PaintPicture("gfx001",-1);
    messagebox("看到了吗?","这张图片保留到了这个对话框","作为这次对话的背景");
    messagebox("你将看到一张图片","这张图片保留3秒钟");
    PaintPicture("gfx001",3);
    messagebox("测试结束");
  endif;
endprocedure;
procedure GeneralTest02_Lookinto;
string TextLine;
  Answer:=Menu("是否进行变量测试?","是","否");
  if(Answer=1);
    TextLine:=inputbox("请输入一个字符串","默认字符串");
    messagebox("你输入的是:"TextLine);
    TextLine:=inputbox("请输入一个表达式","(2+3)*2/5");
    TextLine:=CalcExpression(TextLine);
    messagebox("计算的结果是:"TextLine);
  endif;
endprocedure;
procedure GeneralTest03_Lookinto;
  Answer:=Menu("是否开始延迟特性测试?","是","否");
  if(Answer=1);
    messagebox("请和我一起读秒","从1开始数到5","每秒钟数一下","开始");
    messageboxdelay("1",1);
    messageboxdelay("2",1);
    messageboxdelay("3",1);
    messageboxdelay("4",1);
    messageboxdelay("5",1);
    messagebox("结束");
  endif;
endprocedure;
procedure GeneralTest04_Lookinto;
  Answer:=Menu("是否开始预设变量测试?","是","否");
  if(Answer=1);
    messagebox("现在的时间是:"Time,"现在的日期是:"Date);
  endif;
endprocedure;

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
 楼主| 发表于 2008-6-20 20:09:00 | 显示全部楼层

Re:用脚本来控制自己的游戏怎么样?Afflatus Script Engine 正

占位子。

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
 楼主| 发表于 2008-6-20 20:20:00 | 显示全部楼层

Re: 用脚本来控制自己的游戏怎么样?Afflatus Script Engine 正




方向键控制走动,X确定,Z取消,Q打开菜单。
演示用游戏(包含代码):

PS:这个游戏的脚本都放在游戏目录下的"Script"里面。

sf_2008620202021.rar

342.39 KB, 下载次数:

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2008-6-20 20:32:00 | 显示全部楼层

Re:用脚本来控制自己的游戏怎么样?Afflatus Script Engine 正

好,支持口袋一下。

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
 楼主| 发表于 2008-6-20 20:35:00 | 显示全部楼层

Re: Re:用脚本来控制自己的游戏怎么样?Afflatus Script Engine

ricohcanon: Re:用脚本来控制自己的游戏怎么样?Afflatus Script Engine 正式发布。

好,支持口袋一下。

啊!谢谢支持,也请看看我的游戏和代码,提出宝贵意见!!

88

主题

1125

帖子

1136

积分

金牌会员

Rank: 6Rank: 6

积分
1136
QQ
发表于 2008-6-20 20:46:00 | 显示全部楼层

Re:用脚本来控制自己的游戏怎么样?Afflatus Script Engine 正

很棒.
这个是不是只支持VB?

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
 楼主| 发表于 2008-6-20 20:50:00 | 显示全部楼层

Re:用脚本来控制自己的游戏怎么样?Afflatus Script Engine 正

哦,是。
给各位VB区还在坚守VB阵地的人开发的,使用起来很方便的。

0

主题

386

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
QQ
发表于 2008-6-20 20:59:00 | 显示全部楼层

Re:用脚本来控制自己的游戏怎么样?Afflatus Script Engine 正

好像集合了好多语言的风格,包括Delphi(Pascal).
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-21 22:33

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表