AMP中LUA的特殊之处



nosh
2010-01-12 18:11:54

[i=s] 本帖最后由 nosh 于 2010-1-22 16:48 编辑 [/i]

整理了一下各个帖子中的内容和自己的心得:
------------------------------------------------------------------------------------
Q:在学习使用AMP的过程中发现代码这样写不执行:
for i=1,10 do
Print('some string');
end
而改成这样之后就执行了:
for i=1,10 do Print('some string'); end
A:AMP有两种脚本模式,一种是start.lua采用的一帧执行一句指令的模式,还有直接载入,一次性执行的模式,由Run()指令,Jump()指令压入AMP的脚本采用的一帧一句的模式,这个模式下任何语句的分行书写都会出现语法错误,而由Include()指令,ResInit(),ResFree()指令载入的脚本则是一次性执行的,只要遵循lua的语法就不会出现任何问题。(白叔原版回答)
以最新版AMP0.55beta为例,module,system目录下的文件都是一次性执行的,user目录下的文件都是一帧一句执行的。按这个规矩写就没问题。
------------------------------------------------------------------------------------
Q:为什么每行语句后边都有个分号?不写不行吗?
A:AMP打包过程中把回车换行符都给去掉了。要是再没有分号,就无法分隔各个语句了。因此在普通LUA中可有可无的分号,在AMP中就是必要的。
------------------------------------------------------------------------------------
Q:为啥我的程序mp3播放语句发不出声音?
A:由于nge2库的硬伤,amp如果不播放一次pmp视频,声音系统不会初始化,所以会没声音。
------------------------------------------------------------------------------------
Q:下面的语句中
goto(*ev15_hxend);
*ev15_hx
Print("此处河蟹1000字...");
*ev15_hxend
为啥“此处河蟹1000字...”还会显示出来?
A:因为标签“ev15_hxend”“ev15_hx”被AMP看成是同样标签了。改善方法是一个标签名不能包含另一个标签名。
goto(*hxend_ev15);
*hx_ev15
Print("此处河蟹1000字...");
*hxend_ev15
这样就OK了。
------------------------------------------------------------------------------------
Q:下面的语句中
eventchose[1] = 3; Print(eventchose[1]);
为啥什么都没有显示出来?
A:别忘了数组的初始化。
eventchose = {}; eventchose[1] = 3; Print(eventchose[1]);
这样就可以显示出来了。
------------------------------------------------------------------------------------
Q:jump("event1.lua"); 执行了这句之后并没有运行我写在event1.lua里面的代码,为什么?
A:请检查其它目录下是否还有个名"event1.lua"的文件。这个问题还是跟AMP打包过程有关。因为打包时并不保存路径信息,运行时amp首先读取了打包文件的目录表,搜索名字的时候是按顺序搜索表,名字先对上哪个读取哪个。所以遇到同名字的文件,就杯具了。
------------------------------------------------------------------------------------
Q:game.ini这文件有啥用?
A:这是开放给用户的脚本。开发者可以在里面定义常量、函数,而打包的时候这个文件是不会打包进amcode.bin中的,因此用户可以自由修改其内容。
另外 在game.ini中加入DEBUG = 1;这句,会开启会开启帧率和内存使用量的显示。
------------------------------------------------------------------------------------
Q:我有个图 981x272的,用bgmove 横向移动,在PC上很正常,到P上就乱了?
A:只支持最大512x512的图。因此分成两个图同时移动吧。当然要自己改造一下sys_fairy.lua定义的bgmove函数或者干脆新造一个。
------------------------------------------------------------------------------------
Q:运行下面的代码,结果程序错乱了?
select(" 保存进度一 " .. savefile[1].name," 保存进度二 " .. savefile[2].name," 保存进度三 " .. savefile[3].name," 返回");
A:LUA的解释器不是很完善,尽量不要把一个语句写得这么长。改成下面这样就可以正常运行了:
temp = {};
temp[1] = " 读取进度一 " .. savefile[1].name;
temp[2] = " 读取进度二 " .. savefile[2].name;
temp[3] = " 读取进度三 " .. savefile[3].name;
select(temp[1],temp[2],temp[3]," 返回");
到底一个语句的长度限制是多少呢?不要问哥,哥也说不清...
------------------------------------------------------------------------------------


白枫
2010-01-12 19:37:14

很好,这个帖可以做成amp官方Q@A了


封魔夜君
2010-01-13 09:37:46

嗯,非常不错,看完后能减少很多移植时的错误.