kwanz 发表于 2012-4-10 21:38:35

[进口教程]线程的创建, 终止和结构(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没有按下

1025044556 发表于 2012-4-10 21:40:26

额有什么用

为主的祥助 发表于 2012-4-10 21:41:50

ni你这个代码框怎么搞的 好像很好 我是直接复制到

紫夕£夏夜 发表于 2012-4-10 21:42:08

哇,辛苦了,感谢啊   

R=a= 发表于 2012-4-10 22:16:47

過來支持一下{:soso__13096517108827562063_1:}

kami 发表于 2012-4-10 22:29:21

前排站位支持

R=a= 发表于 2012-4-10 22:42:34

= =給你發現了。。
页: [1]
查看完整版本: [进口教程]线程的创建, 终止和结构(GTAModding)