本帖最后由 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
复制代码
或
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没有按下
复制代码 |