返回型函数 (TeaScript)

来自SMBX 中文百科
TeaScript/Function/Return
跳转到导航 跳转到搜索

此页面主要介绍返回型函数的使用。

如需要查看“自定义函数”,请前往:函数(语法)

如需要查看“函数”相关的知识,请返回:函数

返回型函数,是指该函数内部执行完程序之后,会返回当前函数产生的最后的值。

call Example("Hello World")

script Example(a as string)
    call ShowMSG(strparam(a))
end script
dim a as string = Example("Hello World")

script Example(a as string, return string)
    if strparam(a) = "Hello World"
        return "Hello, too."
    Else
        return "What?"
    end if
end script

call showmsg(a)

在上述两个实例中,第一个是纯过程函数,不带任何返回值,第二个是内部定义返回return的值的函数。

内置函数

在 TeaScript 定义好的函数中,像是ItrCreateItrNextNCreateRGBA等内建的函数都可被变量赋值,返回不同的数值,例如NCreate返回创建npc(NCreate(...)).permidRGBA返回一个16位有符号整数型数值。

数学表达式

该条目在此页面也有部分讲述,下面都是基于游戏内的数值。

因为 TeaScript 系统十分的魔幻,可能在变量里和脚本内定义的数值会有精度上的区别,比如给变量直接赋值pi,会变成 3.14159274101257,给变量直接赋值e,会变成 2.71828174591064;但是直接使用call ShowMsg(pi)call ShowMsg(e),会分别输出 3.1415926535898 和 2.718281828459。

常量名 描述 数值(取自游戏内的值,倾斜为给用户变量赋值)
Pi 圆周率的值 3.1415926535898

3.14159274101257

e 自然对数底数的值 2.718281828459

2.71828174591064

Rnd 随机数的值,取值为0~1。

随机值种子随时间的变化而变化。

0 ~ 1

取小数位15位。

abs

返回绝对值。

dim a as double = abs(-5)

'输出:
'a = 5

exp

返回常数e的乘方。

dim a as double = exp(1)
dim b as double = exp(5)

' 输出:
' a = 2.71828174591064
' b = 148.413159102577

log

返回以e为底的该数的对数。

dim a as double = log(10)
dim b as double = log(e)

' 输出:
' a = 2.30258512496948
' b = 1

sgn

数学中的符号函数,如果参数值为正数,返回1;参数值为0,返回0;参数值为负数,返回-1。

dim a as double = sgn(6)
dim b as double = sgn(0)
dim c as double = sgn(-9)

' 输出:
' a = 1
' b = 0
' c = -1

int

返回这个数向下取整后的数。

dim a as double = int(4.6)
dim b as double = int(-4.6)
dim c as double = int(4.4)
dim d as double = int(-4.1)

' 输出:
' a = 4
' b = -5
' c = 4
' d = -5

fix

返回这个数的整数部分。该函数会将后面的小数部分忽略掉。

dim a as double = fix(4.6)
dim b as double = fix(-4.6)
dim c as double = fix(4.4)
dim d as double = fix(-4.4)

' 输出:
' a = 4
' b = -4
' c = 4
' d = -4

sqr

返回这个数的开平方数。

dim a as double = sqr(2)
dim b as double = sqr(144)

' 输出:
' a = 1.41421353816986
' b = 12

注:因为 TeaScript 不支持复数(sqr(-1) = ±i)概念,因此尝试执行sqr(-1)会导致游戏程序卡死!

sin

返回正弦值。

dim a as double = sin(pi)

' 输出:
' a = -6.98296672221876E-15

cos

返回余弦值。

dim a as double = cos(pi)

' 输出:
' a = -1

tan

返回正切值。

dim a as double = tan(pi/4)

' 输出:
' a = 1.00000004371139

atn

返回反正切值。

dim a as double = atn(1)

' 输出:
' a = 0.785398185253143

注:三角相关函数全部使用弧度制。

round

round(x, y)

返回该数字x四舍五入后的特定小数位y的值。

dim a as double = round(20.486222,2)

' 输出:
' a = 20.49

反正切2函数

GetAngle

getangle(x, y)

返回三角形之间形成的角度(从0到1)。类似于atan2[1]函数。

' 这里假定用户创建了一个 array 数组 "GAValue",并定义了下标数。
array(GAValue(1)) = getangle(0,0)
array(GAValue(2)) = getangle(1,0)
array(GAValue(3)) = getangle(1,1)
array(GAValue(4)) = getangle(0,1)
array(GAValue(5)) = getangle(-1,0)
array(GAValue(6)) = getangle(-1,-1)
array(GAValue(7)) = getangle(0,-1)

' 输出:
' GAValue = [-1, 0, 0.125, 0.25, 0.5, 0.625, 0.75]

颜色值

RGBA

rgba(r, g, b, a)

用于表达颜色的整数值,这个函数返回的必定是一个有符号的整数型[2]的值,计算公式为:r * 65536 + g * 256 + b * + a * 16777216

因此,如果颜色的int值为-1,那此物体将会完全不透明。

例子如下。

dim a as integer = rgba(255,255,255,255)
dim b as integer = rgba(255,0,0,0)
dim c as integer = rgba(0,255,0,255)

' 输出
' a = -1(完全不透明)
' b = 16777680(红色的最大值,但是完全透明)
' c = -16711936(只渲染蓝色)
npc(a).forecolor = rgba(255,255,255,255)

' 输出
' NPC a 的前景色完全渲染。

需要注意的是,某些对象里面的 .forecolor_x 是有符号字节型,如果对该值赋值为大于128的话,那么程序会立马将该值减去256,直到-1(.forecolor_a = 255等价于.forecolor_a = -1)。

字符处理

Len

len(text)

返回字符串长度。 如果参数为一段数值,也可以作为字符串。

dim a as double = len("Hello SMBX World!")
dim b as double = len(1234567890)

' 输出:
' a = 17
' b = 10

Left

left(text, len)

返回从左边裁切的字符串。 该函数会从text的第0个下标位置不断向右选择裁切位置len,然后返回该值。

dim a as string = "Hello SMBX World!"
dim b as string = left(a, 10)

' 输出:
' b = "Hello SMBX"

Right

right(text, len)

返回从右边裁切的字符串。 函数组成与text类似,不同的是裁剪从末尾开始。

dim a as string = "Hello SMBX World!"
dim b as string = right(a, 10)

' 输出:
' b = "MBX World!"

Mid

mid(text, start, len)

返回一段文本从start裁剪字符数len的一段字符串。 文本裁剪将从给定点下标位置start开始,裁剪长度为len

dim a as string = "Hello SMBX World!"
dim b as string = mid(a, 3, 9)

' 输出:
' b = "llo SMBX "

Asc

asc(char)

返回字符的 ASCII 值。

dim a as integer = asc(E)

' 输出:
' a = 50

所有 ASCII 字符对应的数值可以访问下文。

Chr

chr(code)

返回这个数值所对应的 ASCII 字符,范围为 0~127,大于这个范围会强制输出“?”。

dim a as string = chr(68)

' 输出:
' a = "D"

Ascw

ascw(char)

返回字符的 Unicode 值。

dim a as long = ascw("你")
dim b as long = ascw("好")

' 输出:
' a = 20320
' b = 22909

Unicode 值对应字符请前往搜索引擎,或使用转换工具查找。

这里列举几个:

https://symbl.cc/cn/unicode-table/

https://www.jyshare.com/front-end/3602/

Chrw

chrw(code)

返回这个数值所对应的 Unicode 字符,范围为 0~65535。

dim a as string = chrw(163)
dim b as string = chrw(1044)

' 输出:
' a = "£"
' b = "Д"

数值为整数型,如果网站提供的是16进制的数(例如3FAE),请使用计算器转换成10进制再填上去。

Cstr

cstr(number)

返回这个数字的字符串形式,且参数number只能为数字。

dim a as string = cstr(10125)

' 输出:
' a = "10125"

Cdbl

cdbl(text)

返回这个字符串的数字形式。

dim a as double = cdbl("10125")

' 输出:
' a = 10125

当然,返回值对应的变量如果是字符串类型,该函数也照样奏效。 注:该函数会将参数text从做到右解析,如果末尾或中间出现了其他非阿拉伯数字,或是出现了第二个小数点等情况,则后面全部裁切忽略;如果开头为非阿拉伯数字,则这个返回值会变成0并结束。处理上述情况后,将这个返回值转换成双精度浮点数。

call showmsg(cdbl("123.456.7|89"))
call showmsg(cdbl("123a456be789"))
call showmsg(cdbl("a123456789"))

' 输出:
' 123.456
' 123
' 0

UCase

ucase(text)

将字符串当中的所有小写字母转换成大写字母。

dim a as string = uCase("Hello SMBX!")

' 输出:
' a = "HELLO SMBX!"

LCase

lcase(text)

将字符串当中的所有大写字母转换成小写字母。

dim a as string = lCase("Hello SMBX!")

' 输出:
' a = "hello smbx!"

Instr

instr(start, text, search)

该函数会从字符位置start开始查找子字符串search在源字符串text中的位置。

dim a as double = instr(1,"Hello SMBX, SMBX is FUN!","SMBX")
dim b as double = instr(9,"Hello SMBX, SMBX is FUN!","SMBX")

' 输出:
' a = 7
' b = 12

格式

Format

Format(FCC, Value)

将对应的值输出为特定格式的值。

FCC 可以使用的格式代码如下:

  • %d - 整数格式(等价于fix(a)
  • %nz - 该数定义为n位字符串,从末尾开始到n位,如果前方位为空位,则补充0。
  • %.nf - 浮点数格式(等价于fix(a),小数后保留n位,如果末尾后一小数位大于等于5,则前一位+1。)
  • %h - 16进制格式

其他格式代码由于限制可能无法使用或不起作用。

dim a as string = format("%8z",508)
dim b as string = format("%d",52.33)
dim c as string = format("%3.2f",5.259)
dim d as string = format("%h",33102)

' 输出:
' a = "00000508"
' b = "52"
' c = "5.26"
' d = "814E"

数组

ubound

ubound(array)

返回数组的长度。

call redim(0, arrayTest, 10)
dim a as double = ubound(arrayTest)

' 输出:
' a = 10

技术性

ScriptID

返回脚本的ID值。[需要验证 1]

val(a) = scriptid(name)

不可用

Replace

replace(text, find, replacewith, start, count, compare)

此功能原意是返回一个字符串,其中源字符串的某些部分被新部分替换。你可以在源字符串中定义要搜索的部分,以及替换的最大次数;此函数在新版本不可用。

参数名 介绍
text 源字符串内容。
find 需要搜索并替换的源字符串中的部分。
replacewith 要替换的新的字符串的部分。
start 搜索的开始点。
count 替换次数,设为-1则无限制。
compare 可以是0或1,设置0为区分大小写。

尽管不可用,但你仍可以尝试自己定义这个函数。

引用

Super Mario Bros. X Scripting Help 文档及功能猎手版。

https://wohlsoft.ru/pgewiki/TeaScript_Syntax

  1. atan2是一个函数,在C语言里返回的是指方位角,C 语言中atan2的函数原型为 math.h 库中的 double atan2(double y, double x) ,返回以弧度表示的 y/x 的反正切。y 和 x 的值的符号决定了正确的象限。也可以理解为计算复数 x+yi 的辐角,计算时atan2 比 atan 稳定。(来源百度百科)
  2. 即 Int16,表达数值范围为-2147483648 ~ 2147483647
  1. 此脚本需进一步验证。