[进口教程]线程的创建, 终止和结构(GTAModding)
本帖最后由 kwanz 于 2012-4-10 21:58 编辑原帖地址 http://www.gtamodding.com/index.php?title=Create_a_thread线程的创建, 终止和结构
原帖作者/ 群星 @GTAModding 翻译/ kwanz @虚拟世界
未经许可 谢绝转载
创建一个简单线程是理解编程的首要步骤之一。本文将讲述用SB创建最简单的线程的基本步骤,对3/VC/SA适用。
创建线程
首先,运用Opcode 004F(或create_thread命令)创建你的线程。查找
create_thread
在前面插入
004F: create_thread @mythread
或
create_thread @mythread
mythread是任意给的标签,用于帮助游戏定位到线程,你可以取任何名称。
插入代码内容
然后你需要往线程中插入内容。查找
//-------------Mission 0---------------
这是代码MAIN分节结束,第一个任务开始的地方。把代码插入到此处。最简单的线程写法如下:
:mythread
// 写上代码
004E: end_thread
或
:mythread
// 写上代码
end_thread
放代码的地方可以写上一些简单的Opcode,或者是更长的线程,就像创建行人或车辆的示例中给出的那样。
线程名
为线程命名是可选的。用Opcode 03A4给线程命名,名称最长为8个字符。必要时,你可以在程序其他地方调用Opcode 0459来结束线程。
:mythread
03A4: name_thread 'MYTHREAD'
或
:mythread
thread 'MYTHREAD'
:mythread_start
// 执行代码
004E: end_thread
或
:mythread_start
// Insert your contents here
end_thread
循环结构
上面给出了线程正常结束的例子。如果你想要线程一直运行,你需要写成循环的形式。大多数情况下,执行循环需要在循环体内调用Opcode 0001(或wait命令),以防死机——当然有例外,但是用了更安全。最简单的循环形式如下:
:mythread
0001: wait 0 ms
// 执行代码
0002: jump @mythread
或
:mythread
while true
wait 0
// 执行代码
end
线程会无限重复执行,所以写循环体需要特别小心。
条件结构
条件opcode并不执行判断条件,而是判断条件是否满足。如果条件满足,则返回true,否则返回false。在SB中,条件opcode使用的判断条件用空格缩进标出。条件语句是以IF打头的,判断以下的表达式是否为真。
:mythread
0001: wait 0 ms
00D6: if
// 条件语句示例
00E1: player 0 pressed_key 13
004D: jump_if_false @check_failed
// 如条件成立(按下某键)则增加$2000
0109: player $PLAYER_CHAR money += 2000
0002: jump @threadend
:check_failed
// 如条件不成立(未按下)则减少$10
0109: player $PLAYER_CHAR money += -10
:threadend
0002: jump @mythread
或
:mythread
while true
wait 0
if
// 条件语句示例
00E1: player 0 pressed_key 13
then
// 如条件成立(按下某键)则增加$2000
0109: player $PLAYER_CHAR money += 2000
else
// 如条件不成立(未按下)则减少$10
0109: player $PLAYER_CHAR money += -10
end
end
这段代码的含义是若条件满足(切换镜头键按下),则判断为true并执行第一段命令(增加$2000),否则,判断为false并执行另一段命令(减少$10)。
对于多重条件判断的IF语句,你需要在if后添加and或者or。
if and表示所有条件同时成立。
:MyThread
0001: wait 0 ms
00D6: if and
00E1: player 0 pressed_key 4// 条件1
00E1: player 0 pressed_key 19// 条件2
004D: jump_if_false @CheckEnd
// 命令。。。
:CheckEnd
0002: jump @MyThread
这段代码的含义是若条件同时满足(键4和19同时按下),则继续执行命令。否则,代码将跳过后面的命令直接跳转到标签CheckEnd处。
if or表示需要满足条件之一。
:MyThread
0001: wait 0 ms
00D6: if or
00E1: player 0 pressed_key 4// 条件1
00E1: player 0 pressed_key 19// 条件2
004D: jump_if_false @CheckEnd
// 命令。。。
:CheckEnd
0002: jump @MyThread
这段代码的含义是若任一条件满足(键4或19按下),则继续执行命令。否则,代码将跳过后面的命令直接跳转到标签CheckEnd处。
正常的opcode以数码0打头,但条件判断opcode以8打头,表示判断条件是否不满足。
00E1: player 0 pressed_key 4 // 键4按下
80E1: not player 0 pressed_key 4 // 键4没有按下 额有什么用 ni你这个代码框怎么搞的 好像很好 我是直接复制到 哇,辛苦了,感谢啊 過來支持一下{:soso__13096517108827562063_1:} 前排站位支持 = =給你發現了。。
页:
[1]