kwanz 发表于 2012-5-9 21:18:16

[GTAF进口]SCM编程常见问题解答

本帖最后由 kwanz 于 2012-5-9 21:35 编辑

原帖地址 http://www.gtaforums.com/index.php?showtopic=404316SCM编程常见问题解答
原帖作者/ Dutchy3010 @GTAF 翻译/ kwanz @虚拟世界
未经许可 谢绝转载
概况类
我想学编程,我要做什么?
首先要理解你不可能在24小时内学会编程,你必须要付出时间和努力。有几份教程可以帮助你学习编程,最好的教程当属编程圣经(上篇 EN CH /下篇 EN CH)

我想编写自己的任务,如何做到?
如果你真的想编程实现,不借助其他MOD(比如DYOM Design Your Own Mission),那么看看这篇教程吧。

谁能帮我编程做东西?
首先,论坛上专门有一贴求物件。你可以在这里找。但是不要抱过高希望,因为你请求的东西多半没人会做,因为scm编程是要花时间的。如果你真心希望做出什么东西,我建议你自己学习编程。

CLEO是什么?
CLEO包含了几部分物件:
·自定义脚本外挂:用这些脚本玩家不需要开新存档
·新的opcode
·*.CLEO插件
关于CLEO的更多信息
CLEO教程 EN CH

我想同时使用两份scm程序!
总的来说,这不简单。你可以用MPACK任务包分别使用它们。但是多CLEO同时使用是可以的,只要他们不冲突。

我需要什么软件来编辑main.scm?
主要有Sanny Builder和Mission Builder。

我可以把scm编程用于IV修改吗?
不,语言是完全不同的。但是你对scm的了解可以派上用场,因为三代的opcode和四代的函数有很多相似之处。理解任务脚本是如何组合起来的,各种opcode可以做什么,参数的作用,也就理解了在四代中如何编程。

Sanny Builder错误
我在SB中遇到错误 not enough actual parameters!
你调的opcode给的参数太少了。参考opcode示例比较一下。还有检查一下语句中是否需要逗号,这也是一个常见的错误。比如说:
0100:   actor $PLAYER_ACTOR in_sphere 1793.068, -1904.254, 12.3989 radius 4.0 4.0 4.0 sphere 1 in_car
结果出错了,因为不需要逗号。

编译错误 Label 'loop' redeclared.
意思是说你用的跳转标签重名了。

编译错误 Incorrect number of conditions, 9 max.
最可能的情况是你在一个判断里只有一个条件,但是却用了if or。比如说:
:MODEL_LOAD
if or
8248: not model #NRG500 available
else_jump @MODEL_LOAD

我出了个别的错误怎么办?
查看SB的解释,在报错的时候点help。
动态图演示

游戏运行中错误
游戏卡住了,我啥也动不了!
一个常见的错误是你在程序中少写了wait语句。任何循环都至少要包含一个wait。建议用窗口模式运行SA,然后你就能用Ctrl-Alt-Delete结束它。
另一个方法是用SA关闭器,在需要的时候按F7结束游戏。

求助!游戏当了!
悲剧,答案并不好说,不过你可以做些事情。首先,看看是什么时候当的。游戏启动的时候,还是满足什么条件的时候?按这样的方法逐步排除程序中的代码,查错会简单得多。当你确定出错的位置以后,你需要修复出错的opcode。先在前面打上//,再进行测试。如果游戏不挂了,说明出错的代码找到了。然后就改吧。另外有一个CLEO插件SCMLOG.cleo,可以记录opcode调用,看看游戏临终前调用的最后一个opcode就行了。
如果你还是发现不了问题,你可以把问题发到论坛上。注意求助应该这样做:
1. 标题写明问题。
2. 描述错误状况。
3. 贴上代码,标出错误的地方,不然别人哪有耐心看完。
4. 在帖子里添加scmlog.log。
5. 提供所有相关的信息。

游戏中用我的程序,毫无反应!
信息太少了。可能的原因包括忘了编译,代码因故卡在死循环里等等。

编程
我找不到想用的opcode。
用opcode搜索功能(Tools > IDE Tools > Opcode search或Ctrl+Alt+2),或者在SB里打上一个词,然后按F1。

Player_Char和Player_Actor的区别是什么?
$PLAYER_CHAR是玩家在内存核心中的名字,用于作用于玩家的opcode,如0109: player $PLAYER_CHAR money += 1000000
$PLAYER_ACTOR是玩家当前操作的角色,用于作用于人物的opcode,比如00A1: put_actor $PLAYER_ACTOR at 345.5621 306.2212 998.4484

编辑SA和VC的main.scm有区别吗?
是的,SA中添加了很多东西,比如外部程序,一些opcode和结构。

我怎么找到物件的ID?
你可以用Mapviewer或MapEditor。
如果你知道模型的名称,你可以在SB中按CTRL+ALT+H查找物品。你也可以看看这个网站。

为什么我的FXT文字没有显示?
可能是你的名称太长,或者你在名称和字符串中间多了一个空格,或者末尾多了一个空格。

用GXT editor编辑american.gxt
我用的是Hammer的SAgxtEditor。最新版本是1.3,在外面找不到的。不过thegtaplace上还有。
所有的gxt条目名称默认为数字。插入条目的话需要注入ini。Hammer发过一份,不过原始地址已经没了。点这里下载
点搜索图标(放大镜),选择String List Match,弹出窗口,点Open,选择文件类型为 所有文件,然后打开american.ini,确定。不过这还不算完。你可以手动注入,比如说在main.scm里面找到IE10。在gxtEditor里点搜索,查找IE10,你会找到插入条目和显示文字。

注意有两种搜索方式
Find Name 表示搜索scm或exe中有此名称的条目,比如fem_ok
Find Value 表示搜索文字内容

重要:如果你修改了文字,先在别的条目上点一下,然后再保存。

另外这里有一份AleX AciD做的把amercian.gxt转换为完整的文本文件
不知道哪里有得下
我传了一份
所有支持的游戏用到的gxt文本都可以在SB目录\help\GXT Strings里找到

如何获得游戏中的坐标?
你可以用这个或SB里的坐标工具。

如何修改CLEO按键?
看这篇文章 EN CH

死机相关
by James227uk

启动gta_sa.exe时崩溃。
exe版本不兼容。用这个
密码请往原帖查看。

游戏在载入图崩溃。
游戏载入时某个脚本程序不能工作。尝试删除最新添加的CLEO。如果还有问题,删除所有CLEO后重试。如果还有问题就不是CLEO的 问题了。你可能修改了别的文件导致死机。如果不死机的话,把CLEO一个个放回去,死机的那个就是出问题的。

按某键死机。
某CLEO有问题,在处理按键的那一段有错。找作者去,可以PM他。

进入某地区时死机。
可能有两个原因。可能是CLEO有错,也可能是CLEO冲突。尝试把CLEO删剩一个,看有没有问题。没有问题就是冲突,有问题的话找作者去。

欢迎指正
感谢PatrickW, Seemann, ZAZ, goin-god, james227uk, ceedj

小鉛筆 发表于 2012-5-9 21:27:49

翻譯這麼一大段教程,KWANZ辛苦了{:soso__17071571728416505002_4:}
話說如果改這個是不是有可能可以做一個新的主線任務,那不是很爽?不過貌似是大工程吧0.0

Sid 发表于 2012-5-9 21:36:52

本帖最后由 Sid 于 2012-5-9 21:45 编辑

沒有純理論講解,而是換成問答模式,很不錯{:soso_e144:}

为主的祥助 发表于 2012-5-9 23:22:22

以前看英文
今天终于看上了中文

izzy 发表于 2012-5-18 19:20:24

確實wait 0 都很重要,比如
if
   Player.Defined($PLAYER_CHAR) 的前面必須加wait 0 不然當機幾率賊大:L
页: [1]
查看完整版本: [GTAF进口]SCM编程常见问题解答