ドキュメント

作成日時:2022/03/01(火) 20:05:02
更新日時:2022/04/02(土) 16:34:49

概要

このページではサポミクが実装した内蔵関数(builtin)の使い方と必要なGeckoコードを解説します。

その他の解説は次のリンクを参照してください。

必須なGeckoコード

実行命令数の上限の引き上げ

デフォルトでは一回の実行(yieldまで)で最大32個の命令しか実行できません。このコードを使うことで、最大32767個の命令を実行できるようになります。

020dc6d2 00007FFF

汎用関数

このコードを使うと、SunScriptでメモリの読み込み(readRAM)・書き込み(writeRAM)・コピー(memcpy)ができるようになります。

必ずssc-sup39/common.sunをインポートすること。

import "ssc-sup39/common.sun";

コード
C20DCF1C 00000053
9421FFF0 93A10008
48000239 2C040000
8123001C 40A20010
3D40FFFF 39000001
48000084 81430020
7D244850 9123001C
55291838 7D0A482E
7CEA4A14 2C080000
40A2FFD8 28040001
81470004 418200A0
8127000C 28090010
4182007C 41810028
28090001 41820080
28090008 41A20034
69290001 814A0000
7D290034 5528D97E
48000024 2C09FFF0
41820054 2C09FFF8
40A2FFE0 894A0000
7D4A0774 48000008
894A0000 8123001C
80E30018 7C093800
4C800020 80C30020
55271838 39290001
7CA63A14 7D06392E
91450004 9123001C
4E800020 A14A0000
4BFFFFCC A94A0000
4BFFFFC4 814A0000
4BFFFF34 39200000
4BFFFF80 28040001
8123001C 40810054
81430020 7D244850
9123001C 55291838
7D0A4A14 7D2A482E
2C090000 40820034
28040002 81280004
8148000C 41820018
81080014 2C080008
41820014 2C080010
41820048 91490000
48000008 99490000
8123001C 81430018
7C095000 4C800020
81030020 552A1838
38C00000 39290001
7CC8512E 7CE85214
3940FFFF 91470004
9123001C 4E800020
B1490000 4BFFFFC4
28040003 8123001C
38E0FFFF 7D244850
9123001C 40820034
80C30020 55281838
7D464214 7D06402E
2C080000 4082001C
810A0008 2C080000
40820010 810A0010
21080000 7CE73910
81030018 7C094000
40800024 80C30020
55281838 38800000
39290001 7CA64214
7C86412E 90E50004
9123001C 2C070000
4CA20020 80AA0014
808A000C 806A0004
3D808000 398C31F4
7D8903A6 4E800420
72656164 52414D00
77726974 6552414D
006D656D 63707900
7FC802A6 3FA08012
3BBDBA08 38BE0000
389E021C 7FE3FB78
7FA803A6 4E800021
38BE00E8 389E0224
7FE3FB78 7FA803A6
4E800021 38BE0184
389E022D 7FE3FB78
7FA803A6 4E800021
83A10008 38210010
8001001C 00000000

描画関連のGeckoコード

文字と長方形の描画しかしない場合は描画関数Liteを、多角形の描画や行列操作もする場合は描画関数を使います。この二つは共存できないので注意してください。どちらかのコードを使うと、HUDが描画される度にss/draw2d.sbが実行されます。

exec-timing

描画関数Lite

使う時はssc-sup39/draw-lite.sunをインポートします。

import "ssc-sup39/draw-lite.sun";

コード
077F0238 00000110
9421FED8 7C0802A6
BF810118 7C7F1B78
9001012C 7C9E2378
90C100B8 7CBD2B78
90E100BC 7D1C4378
912100C0 914100C4
40860024 D82100C8
D84100D0 D86100D8
D88100E0 D8A100E8
D8C100F0 D8E100F8
D9010100 39200600
390100BC B12100A0
39210130 912100A4
392100A8 912100A8
808D97F8 38E100B8
7FA6EB78 38A00000
38610008 6FDE8000
4A826AF5 3D204330
91210108 3D40817F
93C1010C 6FFF8000
C00A0344 38610070
C9810108 91210110
3D20817F 93E10114
FC4C0028 C0690340
C9810110 93A10064
FC2C0028 93A10060
4A8A43E9 38800000
38610070 4A8BD419
38C100A0 7F85E378
388000FF 38610008
4A826951 BB810118
38210128 80010004
7C0803A6 4E800020
00000000 59800004

040DCF18 49716451
0410DA80 496E58AD
04206770 495ECB41
077F3000 00000418
28040005 8123001C
9421FF98 7C0802A6
7D244850 BFC10060
7C7E1B78 9001006C
9123001C 40A20084
81430020 55291838
38610008 7FEA4A14
813F0004 3BFF0008
91210048 4A8A126D
38610008 38800000
4A8BA6DD 39010038
39200004 7D034378
7D2903A6 80FF0000
39080004 815F0004
2C070001 40A2001C
9141005C 39210058
C001005C FC00001E
7C004FAE 81410058
9148FFFC 3BFF0008
4200FFCC 38810048
4CC63182 4AA0EE05
813E001C 815E0018
7C095000 4080000C
39290001 913E001C
39610068 48000300
28040005 8123001C
9421FF68 7C0802A6
7D444850 81630020
BFA1008C 7C7F1B78
9001009C 9143001C
408100F0 55291838
54841838 7D6B4A14
7D245850 81090000
81490004 2C080001
40A200F0 91410080
3941007C C0010080
FC00001E 7C0057AE
8061007C 81090008
8149000C 2C080001
40A20100 91410080
39410074 C0010080
FC00001E 7C0057AE
80810074 80A90014
39490030 80C9001C
39810020 80E90024
3BC10060 8109002C
39210040 7D204B78
7C0A5840 41A000F4
8121005C C101003C
9121001C 81210058
C0E10038 91210018
81210054 C0C10034
91210014 81210050
C0A10030 91210010
8121004C C081002C
9121000C 81210048
C0610028 91210008
C0410024 C0210020
81410044 81210040
4CC63242 4BFFD05D
813F001C 815F0018
7C095000 4080000C
39290001 913F001C
39610098 480001C4
6D4A8000 91410064
3D404330 91410060
3D40817F C00A3410
39410078 C9810060
FC0C0028 FC000018
FC00001E 7C0057AE
80610078 4BFFFEF8
6D4A8000 9141006C
3D404330 91410068
3D40817F C00A3410
39410070 C9810068
FC0C0028 FC000018
FC00001E 7C0057AE
80810070 4BFFFEE8
83AA0000 2C1D0001
40A20020 7C0C0040
40A0FEF8 C00A0004
398C0004 D00CFFFC
394A0008 4BFFFEE4
7C09F040 40A0FEDC
83AA0004 39290004
93A9FFFC 4BFFFFE4
9421FFF0 7C0802A6
BFC10008 3FE0817F
3BFF3414 90010014
7CDE3378 4CC63182
4A825B95 813F0014
2C090000 41820048
7FC3F378 4A841F45
38800000 38600018
4A8B5731 38600001
38C0000F 38A00005
38800004 4A8B93ED
80010014 807F0014
83C10008 7C0803A6
83E1000C 38210010
4A923BF4 39610010
4800009C 9421FFF8
7C0802A6 9001000C
4CC63182 4A904E59
8001000C 3CA0817F
3C80817F 3C60817F
38A533DC 388433F1
38633414 7C0803A6
38210008 4A8E93AC
9421FFF0 7C0802A6
90010014 93E1000C
7C7F1B78 4A97FD61
3CA0817F 3C80817F
7FE3FB78 38A530C8
388433FC 4A928675
80010014 3CA0817F
3C80817F 7FE3FB78
83E1000C 38A53000
38843405 7C0803A6
38210010 4A92864C
83ABFFF4 83CBFFF8
800B0004 83EBFFFC
7C0803A6 7D615B78
4E800020 2F636F6D
6D6F6E2F 73732F64
72617732 642E7362
00647261 7732642E
73756E00 64726177
54657874 00647261
77526563 74000000
59800004 00000000

描画関数 (draw.sun)

使う時はssc-sup39/draw.sunをインポートします。

import "ssc-sup39/draw.sun";

コード
077F0238 00000110
9421FED8 7C0802A6
BF810118 7C7F1B78
9001012C 7C9E2378
90C100B8 7CBD2B78
90E100BC 7D1C4378
912100C0 914100C4
40860024 D82100C8
D84100D0 D86100D8
D88100E0 D8A100E8
D8C100F0 D8E100F8
D9010100 39200600
390100BC B12100A0
39210130 912100A4
392100A8 912100A8
808D97F8 38E100B8
7FA6EB78 38A00000
38610008 6FDE8000
4A826AF5 3D204330
91210108 3D40817F
93C1010C 6FFF8000
C00A0344 38610070
C9810108 91210110
3D20817F 93E10114
FC4C0028 C0690340
C9810110 93A10064
FC2C0028 93A10060
4A8A43E9 38800000
38610070 4A8BD419
38C100A0 7F85E378
388000FF 38610008
4A826951 BB810118
38210128 80010004
7C0803A6 4E800020
00000000 59800004

040DCF18 497169DD
0410DA80 496E5E39
04206770 495ECCAD
077F3000 00000A40
81430000 9421FFE8
2C0A0001 81230004
40A20014 91210010
C0210010 38210018
4E800020 6D298000
9121000C 3D204330
91210008 3D20817F
C0093A38 C9810008
FC2C0028 FC200818
4BFFFFD4 28040005
8123001C 9421FF68
7C0802A6 7D444850
81630020 BFA1008C
7C7F1B78 9001009C
9143001C 408100F0
55291838 54841838
7D6B4A14 7D245850
81090000 81490004
2C080001 40A200F0
91410080 3941007C
C0010080 FC00001E
7C0057AE 8061007C
81090008 8149000C
2C080001 40A20100
91410080 39410074
C0010080 FC00001E
7C0057AE 80810074
80A90014 39490030
80C9001C 39810020
80E90024 3BC10060
8109002C 39210040
7D204B78 7C0A5840
41A000F4 8121005C
C101003C 9121001C
81210058 C0E10038
91210018 81210054
C0C10034 91210014
81210050 C0A10030
91210010 8121004C
C081002C 9121000C
81210048 C0610028
91210008 C0410024
C0210020 81410044
81210040 4CC63242
4BFFD0D9 813F001C
815F0018 7C095000
4080000C 39290001
913F001C 39610098
4800084C 6D4A8000
91410064 3D404330
91410060 3D40817F
C00A3A38 39410078
C9810060 FC0C0028
FC000018 FC00001E
7C0057AE 80610078
4BFFFEF8 6D4A8000
9141006C 3D404330
91410068 3D40817F
C00A3A38 39410070
C9810068 FC0C0028
FC000018 FC00001E
7C0057AE 80810070
4BFFFEE8 83AA0000
2C1D0001 40A20020
7C0C0040 40A0FEF8
C00A0004 398C0004
D00CFFFC 394A0008
4BFFFEE4 7C09F040
40A0FEDC 83AA0004
39290004 93A9FFFC
4BFFFFE4 2C040000
8143001C 9421FFA0
7D800026 7C0802A6
7D245050 BF410040
7C7D1B78 90010064
DBE10058 9181003C
83830020 9123001C
418200EC 55291838
7F7C4A14 7D3C482E
2C090000 408200D8
83FB0004 7C9E2378
2E1F0000 40B20008
3BE10008 281E0001
4182010C 813B0008
3B400000 2C090000
40820008 835B000C
281E0003 408100CC
554A1838 7F9C5214
387CFFF0 4BFFFD3D
387CFFF8 FFE00890
4BFFFD31 FC400890
3D20817F C0693A3C
7FE3FB78 FC20F890
4A8A1409 281E0004
4182003C 387B0010
4BFFFD09 387CFFE8
D03F0000 4BFFFCFD
281E0007 D03F0014
4081001C 387B0018
4BFFFCE9 387B0020
D03F0010 4BFFFCDD
D03F0004 2C1A0000
41820014 7FE5FB78
7FE4FB78 7F43D378
4A8A0FD1 40B20010
38800000 38610008
4A8BA3DD 813D001C
815D0018 7C095000
4080000C 39290001
913D001C 8181003C
BB410040 39610060
7D808120 48000630
281E0002 40820020
2C1A0000 41820018
38A00030 7F44D378
7FE3FB78 4A80FE59
4BFFFFA4 7FE3FB78
4A8A0F09 4BFFFF98
28040001 8123001C
9421FFF0 7C0802A6
7D244850 93E1000C
7C7F1B78 90010014
9123001C 40820028
81430020 55291838
7D0A4A14 7D2A482E
2C090000 40820010
88680007 38800000
4A8B5629 813F001C
815F0018 7C095000
4080000C 39290001
913F001C 39610010
480005BC 9421FFF0
7C0802A6 BFC10008
3FE0817F 3BFF3A40
90010014 7CDE3378
4CC63182 4A825A29
813F0014 2C090000
4182003C 7FC3F378
4A841DD9 38600001
38C0000F 38A00005
38800004 4A8B928D
80010014 807F0014
83C10008 7C0803A6
83E1000C 38210010
4A923A94 39610010
48000548 9421FFF8
7C0802A6 9001000C
4A8B3ED1 38800001
38600009 4A8B3445
38E00000 38C00004
38A00001 38800009
38600000 4A8B3EF9
38600001 4A8B6AE1
38600000 4A8B4C85
39200002 39000000
38E00000 38C00000
38A00000 38800000
38600004 4A8B6B05
38C00004 38A000FF
388000FF 38600000
4A8B8D31 38800004
38600000 4A8B84FD
8001000C 38C0000F
38A00005 38800004
38600001 7C0803A6
38210008 4A8B91C4
28040002 8123001C
9421FFD8 7C0802A6
7D244850 BF410010
7C7E1B78 9001002C
9123001C 4081017C
81430020 55291838
7D2A4A14 81490010
2C0A0000 40820164
83E90014 2C1F0002
40810158 2C1F0100
40810008 3BE00100
28040003 3B600000
41820014 81490018
2C0A0000 40820008
A369001E 3FA00001
83890004 7FBDFBD6
8349000C 4BFFFED9
5789063E 2C090000
57BD043E 41A20088
38810008 38600004
93810008 4A8B6869
57E5043E 38800000
386000A0 4A8B52C5
3D208041 80A998AC
3D00817F 3D208041
3D40CC01 80C998B4
3D208041 C0083A3C
394A8000 80E998B0
7FE903A6 7F69DB78
7D282E30 7D3D4A14
5508103A 5529043E
7D66442E 7D87442E
D16A0000 D18A0000
D00A0000 4200FFDC
7D3DF9D6 7F7B4A14
577B043E 5749063E
2C090000 41A2007C
38810008 38600004
3BFF0001 93410008
4A8B67D5 57E5043E
38800000 386000B0
4A8B5231 3D208041
80C998AC 3D208041
80E998B4 3D40817F
3D208041 C00A3A3C
810998B0 3D20CC01
39298000 7FE903A6
7F6A3630 7F7DDA14
554A103A 577B043E
7D67542E 7D88542E
D1690000 D1890000
D0090000 4200FFDC
813E001C 815E0018
7C095000 4080000C
39290001 913E001C
39610028 480002D4
28040004 9421FF60
8123001C 7C0802A6
396100A0 900100A4
7D244850 48000289
BF610074 7C7F1B78
9123001C 40810178
28040005 81430020
55291838 7C9D2378
7D2A4A14 3B800000
83690004 3BC90008
4182000C 8389000C
3BC90010 7FC3F378
4BFFF8B1 387E0008
FFC00890 4BFFF8A5
387E0010 FFE00890
4BFFF899 387E0018
FFA00890 4BFFF88D
D021004C D3C10038
D3E1003C D3A10040
D3E10044 D3A10048
D3C10050 D0210054
D3C10058 D3E1005C
4BFFFCED 281D0006
40810010 813E0024
2C090000 41820018
38610008 4A8A0AF5
38800000 38610008
4A8B9F65 5769063E
2C090000 41A2005C
38810068 38600004
93610068 4A8B6659
38A00004 38800000
386000A0 4A8B50B5
3D00817F C0083A3C
3D20CC01 39000004
39410038 39298000
7D0903A6 C16A0000
394A0008 C18AFFFC
D1690000 D1890000
D0090000 4200FFE8
5789063E 2C090000
41A2005C 38810068
38600004 93810068
4A8B65F5 38A00005
38800000 386000B0
4A8B5051 3D00817F
C0083A3C 3D20CC01
39000005 39410038
39298000 7D0903A6
C16A0000 394A0008
C18AFFFC D1690000
D1890000 D0090000
4200FFE8 813F001C
815F0018 7C095000
4080000C 39290001
913F001C BB610074
396100A0 480000F0
9421FFF8 7C0802A6
9001000C 4CC63182
4A9048CD 8001000C
3CA0817F 3C80817F
3C60817F 38A539E8
388439FD 38633A40
7C0803A6 38210008
4A8E8E20 9421FFF0
7C0802A6 90010014
93E1000C 7C7F1B78
4A97F7D5 3CA0817F
3C80817F 7FE3FB78
38A5304C 38843A08
4A9280E9 3CA0817F
3C80817F 7FE3FB78
38A53530 38843A11
4A9280D1 3CA0817F
3C80817F 7FE3FB78
38A536F0 38843A1A
4A9280B9 3CA0817F
3C80817F 7FE3FB78
38A533B0 38843A23
4A9280A1 80010014
3CA0817F 3C80817F
7FE3FB78 83E1000C
38A53234 38843A30
7C0803A6 38210010
4A928078 DBABFFE8
DBCBFFF0 DBEBFFF8
4E800020 CBABFFE8
CBCBFFF0 CBEBFFF8
800B0004 7D615B78
7C0803A6 4E800020
834BFFE8 836BFFEC
838BFFF0 83ABFFF4
83CBFFF8 800B0004
83EBFFFC 7C0803A6
7D615B78 4E800020
2F636F6D 6D6F6E2F
73732F64 72617732
642E7362 00647261
7732642E 73756E00
64726177 54657874
00647261 774E676F
6E006472 61775265
63740073 65744C69
6E655769 64746800
7365744D 54580000
59800004 00000000

常時表示

このコードを使うと、ss/top2d.sbss/top3d.sbが常に画面描画後に実行されます(HUDの表示に関わらず)。

コード
0410DA88 496E6055
040ED288 497068B5
077F3A58 00000138
9421FF00 7C0802A6
93E100FC 3FE0817F
3BFF3B90 90010104
813F0014 2C090000
41820028 38830054
38610008 4CC63182
4A8430B1 38610008
4CC63182 4A841795
807F0014 4A923479
813F002C 2C090000
41820020 3D208041
38800000 8069B370
3863016C 4A8B9A99
807F002C 4A923451
80010104 83E100FC
38210100 7C0803A6
4A8B7248 9421FFF0
7C0802A6 BFC10008
3FE0817F 90010014
3BFF3B90 4CC63182
4A818115 3CA0817F
3C80817F 7C7E1B78
38A53B5C 38843B70
7FE3FB78 4A8E8BFD
3CA0817F 3C80817F
387F0018 38A53B76
38843B8A 4A8E8BE5
39610010 7FC3F378
4800000C 38610058
4BFFFF18 83CBFFF8
800B0004 83EBFFFC
7C0803A6 7D615B78
4E800020 2F636F6D
6D6F6E2F 73732F74
6F703264 2E736200
746F7032 64002F63
6F6D6D6F 6E2F7373
2F746F70 33642E73
6200746F 70336400

汎用関数 (common.sun)

readRAM - メモリ読み込み

readRAM(addr: int): int
readRAM(addr: int, type: TYPE_INT|TYPE_FLOAT|8|-8|16|-16): int|float
readRAM の使用例

intの読み込み

メモリアドレス8040A378から8040A37Bまでに格納される4 byteを80 E8 74 C4とすると、

readRAM($8040A378)

の結果は0x80E874C4(int)となり、

readRAM($8040A378, TYPE_INT)

の結果も同じく0x80E874C4(int)となる。

また、

readRAM($8040A378, 16)

の結果は0x80E8(符号なし)=33000となり、

readRAM($8040A378, -16)

の結果は0x80E8(符号付き)=-32536となる。

floatの読み込み

メモリアドレス80E874D4から80E874D7までに格納される4 byteを44 6D 80 00とすると、

readRAM($80E874D4, TYPE_FLOAT)

の結果は950(float)となる。

writeRAM - メモリ書き込み

writeRAM(addr: int, value: int|float)
writeRAM(addr: int, value: int, type=8|16)
writeRAM の使用例

32 bitの書き込み(型に注意!)

writeRAM($817D0000, 15153117) // int

を実行すると、メモリアドレス817D0000から817D0003までに格納される4 byteは00 E7 37 DDとなるが、

writeRAM($817D0000, 15153117.0) // float

を実行する場合、格納される4 byteは4B 67 37 DDとなる。

16 bitの書き込み

writeRAM($817D0000, -428, 16)

を実行すると、メモリアドレス817D0000から817D0001までに格納される2 byteはFE 54となる。

memcpy - メモリコピー

memcpy(dst: int, src: int, count: int)
memcpy の使用例

メモリアドレス817D0010から817D001Bまでに格納される12 byteを3F 99 99 9A 3F 33 33 33 40 79 99 9Aとする。

memcpy($80E874D4, $817D0010, 12)

を実行すると、80E874D4から80E874DFまでに格納される12 byteも3F 99 99 9A 3F 33 33 33 40 79 99 9Aとなる。

描画関数Lite (draw-lite.sun)

drawText - 文字の描画

drawText(
  x: int,
  y: int,
  fontSize: int,
  colorTop: int,
  colorBot: int,
  fmt: string,
  ...
)
drawText の使用例

情報表示

ptrMarioをマリオへのポインタとする。次のコードは、マリオのx、y、z座標、角度、H速度、V速度を表示する。

drawText(
  // (x, y) = (16, 200)
  16, 200,
  // フォントサイズ = 20(デフォルト)
  20,
  // 文字の色: #ffffff(不透明度ff)=白 単色
  $ffffffff, $ffffffff,
  // 文字のフォーマット
  // 注意:ひらがなとカタカナは使えるが、漢字は基本的には使えない
  "X %.3f\nY %.3f\nZ %.3f\nかくど %hu\nHそくど %.2f\nVそくど %.2f",
  // x (float): %.3f (小数点以下3桁まで)
  readRAM(ptrMario+0x10, TYPE_FLOAT),
  // y (float): %.3f (小数点以下3桁まで)
  readRAM(ptrMario+0x14, TYPE_FLOAT),
  // z (float): %.3f (小数点以下3桁まで)
  readRAM(ptrMario+0x18, TYPE_FLOAT),
  // 角度 (uint16/ushort): %hu (h=16bit, u=符号なし)
  readRAM(ptrMario+0x96, 16),
  // H速度 (float): %.2f (小数点以下2桁まで)
  readRAM(ptrMario+0xB0, TYPE_FLOAT),
  // V速度 (float): %.2f (小数点以下2桁まで)
  readRAM(ptrMario+0xA8, TYPE_FLOAT)
);

グラデーション

次のコードはミファーxシドを表示する。

ゾーラ姉弟最高だゾ

drawText(
  // (x, y) = (234, 460): 文字の左下端の座標
  234, 460,
  // フォントサイズ = 20
  20,
  // 文字の色: #de4977~#f6f6f6(不透明度100%)のグラデーション
  $de4977ff, $f6f6f6ff,
  // 表示する文字
  "ミファーxシド"
);

drawRect - 長方形の描画

drawRect(
  fill: int,
  x0: int,
  y0: int,
  x1: int,
  y1: int
)
drawRect の使用例

次のコードは、(202, 438), (202, 462), (392, 462), (392, 438)を頂点とした不透明度40%黒色の長方形を描画する。

drawRect(
  // 塗りつぶしの色: #000000(不透明度66)=不透明度40%の黒
  $00000066,
  // (x0, y0) = (232, 438)
  232, 438,
  // (x1, y1) = (362, 462)
  362, 462
);

描画関数 (draw.sun)

drawText - 文字の描画

drawText(
  x: int,
  y: int,
  fontSize: int,
  colorTop: int,
  colorBot: int,
  fmt: string,
  ...
)

※ draw-liteのdrawText関数と全く同じ

drawText の使用例

情報表示

ptrMarioをマリオへのポインタとする。次のコードは、マリオのx、y、z座標、角度、H速度、V速度を表示する。

drawText(
  // (x, y) = (16, 200)
  16, 200,
  // フォントサイズ = 20(デフォルト)
  20,
  // 文字の色: #ffffff(不透明度ff)=白 単色
  $ffffffff, $ffffffff,
  // 文字のフォーマット
  // 注意:ひらがなとカタカナは使えるが、漢字は基本的には使えない
  "X %.3f\nY %.3f\nZ %.3f\nかくど %hu\nHそくど %.2f\nVそくど %.2f",
  // x (float): %.3f (小数点以下3桁まで)
  readRAM(ptrMario+0x10, TYPE_FLOAT),
  // y (float): %.3f (小数点以下3桁まで)
  readRAM(ptrMario+0x14, TYPE_FLOAT),
  // z (float): %.3f (小数点以下3桁まで)
  readRAM(ptrMario+0x18, TYPE_FLOAT),
  // 角度 (uint16/ushort): %hu (h=16bit, u=符号なし)
  readRAM(ptrMario+0x96, 16),
  // H速度 (float): %.2f (小数点以下2桁まで)
  readRAM(ptrMario+0xB0, TYPE_FLOAT),
  // V速度 (float): %.2f (小数点以下2桁まで)
  readRAM(ptrMario+0xA8, TYPE_FLOAT)
);

グラデーション

次のコードはミファーxシドを表示する。

ゾーラ姉弟最高だゾ

drawText(
  // (x, y) = (234, 460): 文字の左下端の座標
  234, 460,
  // フォントサイズ = 20
  20,
  // 文字の色: #de4977~#f6f6f6(不透明度100%)のグラデーション
  $de4977ff, $f6f6f6ff,
  // 表示する文字
  "ミファーxシド"
);

drawRect - 長方形の描画

drawRect(
  fill: int|FILL_NONE,
  x0: float,
  y0: float,
  x1: float,
  y1: float,
)
drawRect(
  fill: int|FILL_NONE,
  stroke: int|STROKE_NONE,
  x0: float,
  y0: float,
  x1: float,
  y1: float,
  resetMtx: bool=true
)

※ draw-liteのdrawRect関数とほぼ同じだが、座標がfloat型になっていることに注意

drawRect の使用例

塗りつぶしあり、輪郭なし

次のコードは、(202, 438), (202, 462), (392, 462), (392, 438)を頂点とした不透明度40%黒色の長方形を描画する。

drawRect(
  // 塗りつぶしの色: #000000(不透明度66)=不透明度40%の黒
  $00000066,
  // 輪郭なし
  // STROKE_NONE, // 省略してもよい
  // (x0, y0) = (232, 438)
  232, 438,
  // (x1, y1) = (362, 462)
  362, 462
);

塗りつぶしなし、輪郭あり

次のコードは、(202, 438), (202, 462), (392, 462), (392, 438)を頂点とした黒色の長方形の輪郭(塗りつぶしなし)を描画する。

drawRect(
  // 塗りつぶしなし
  FILL_NONE,
  // 輪郭の色: #000000(不透明度ff)=黒
  $000000ff,
  // (x0, y0) = (232, 438)
  232, 438,
  // (x1, y1) = (362, 462)
  362, 462
);

塗りつぶしあり、輪郭あり

次のコードは、(202, 438), (202, 462), (392, 462), (392, 438)を頂点とした、塗りつぶしが不透明度50%赤色で輪郭が水色の長方形を描画する。

drawRect(
  // 塗りつぶしの色: #ff0000(不透明度7f)=不透明度50%の赤
  $ff00007f,
  // 輪郭の色: #00ffff(不透明度ff)=水色
  $00ffffff,
  // (x0, y0) = (232, 438)
  232.0, 438.0,
  // (x1, y1) = (362, 462)
  362.0, 462.0
);

setMTX - 行列操作

setMTX(dst)
setMTX(dst, src)
setMTX(dst, src, dx, dy)
setMTX(dst, src, SS, dx, dy)
setMTX(dst, src, xx, yy, dx, dy)
setMTX(dst, src, xx, xy, yx, yy, dx, dy)

すなわち、AAdx, dy, SS, xx, xy, yx, yyによって作成される行列とすると、*dst=*src×A\text{*dst} = \text{*src} \times Aとなる。ただし、dstMTX_LOADIMMである場合、メモリに格納する代わりに描画行列として使う。また、srcMTX_NEWである場合、*src\text{*src}はメモリから読み込む代わりに単位行列を使う。

AAの定義

実際は

(xxxy0dxyxyy0dy0010)\begin{pmatrix} \text{xx} & \text{xy} & 0 & \text{dx} \\ \text{yx} & \text{yy} & 0 & \text{dy} \\ 0 & 0 & 1 & 0 \\ \end{pmatrix}

のような3x4の行列が生成されるが、簡略化のために、以下は

(xxxydxyxyydy)\begin{pmatrix} \text{xx} & \text{xy} & \text{dx} \\ \text{yx} & \text{yy} & \text{dy} \\ \end{pmatrix}

のような2x3の行列で表す。

3x4の行列の意味

3次元の平行移動を表すために4x4の行列が使われるが、4x4といっても(射影行列を除いて)最後の行は必ず(0001)(0\,0\,0\,1)の形となるため、サンシャインでは

(xxxyxzdxyxyyyzdyzxzyzzdz0001)\begin{pmatrix} \text{xx} & \text{xy} & \text{xz} & \text{dx} \\ \text{yx} & \text{yy} & \text{yz} & \text{dy} \\ \text{zx} & \text{zy} & \text{zz} & \text{dz} \\ 0 & 0 & 0 & 1 \end{pmatrix}

のような4x4の行列は、最後の行を省略して

(xxxyxzdxyxyyyzdyzxzyzzdz)\begin{pmatrix} \text{xx} & \text{xy} & \text{xz} & \text{dx} \\ \text{yx} & \text{yy} & \text{yz} & \text{dy} \\ \text{zx} & \text{zy} & \text{zz} & \text{dz} \\ \end{pmatrix}

のような3x4の行列で表す。もちろん、3x4の行列で表しても、行列の掛け算は4x4の行列として行う。

余談だが、行列演算の際に、空間中の点(x,y,z)(x, y, z)の座標は

(xyz1)\begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix}

と4次元のベクトルで表される。

単位行列

setMTX(dst)
setMTX(dst, src)

(100010)\begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ \end{pmatrix}

平行移動行列

setMTX(dst, src, dx, dy)

(10dx01dy)\begin{pmatrix} 1 & 0 & \text{dx} \\ 0 & 1 & \text{dy} \\ \end{pmatrix}

拡大縮小行列・平行移動行列

setMTX(dst, src, SS, dx, dy)

(SS0dx0SSdy)\begin{pmatrix} \text{SS} & 0 & \text{dx} \\ 0 & \text{SS} & \text{dy} \\ \end{pmatrix}

setMTX(dst, src, xx, yy, dx, dy)

(xx0dx0yydy)\begin{pmatrix} \text{xx} & 0 & \text{dx} \\ 0 & \text{yy} & \text{dy} \\ \end{pmatrix}

一般的な行列(アフィン変換)

setMTX(dst, src, xx, xy, yx, yy, dx, dy)

(xxxydxyxyydy)\begin{pmatrix} \text{xx} & \text{xy} & \text{dx} \\ \text{yx} & \text{yy} & \text{dy} \\ \end{pmatrix}

setMTX の使用例
setMTX($817fd000, MTX_NEW, 15.15, 31.17);

を実行すると、817fd000から817fd02fまでの48 byteは次の行列を格納するようになる。

(10015.1501031.170010)\begin{pmatrix} 1 & 0 & 0 & 15.15 \\ 0 & 1 & 0 & 31.17 \\ 0 & 0 & 1 & 0 \\ \end{pmatrix}

更に

setMTX(MTX_LOADIMM, $817fd000, 4.26, 4.27, 4.28, 0.39, -3.08, 3.54);

を実行すると、描画行列は

(4.264.27012.074.280.39034.710010)\begin{pmatrix} 4.26 & 4.27 & 0 & 12.07 \\ 4.28 & 0.39 & 0 & 34.71 \\ 0 & 0 & 1 & 0 \\ \end{pmatrix}

となる。ここで

// resetMtx=falseで設定した描画行列を使う
drawRect($39c5bbff, STROKE_NONE, 11.0, 25.0, 16.0, 45.0, false);

を実行すると、(165.68, 91.54), (251.08, 99.34), (272.38, 120.74), (186.98, 112.94)を頂点としたミク色の長方形が描画される。

setLineWidth - 線の太さの設定

setLineWidth(lw: int)
setLineWidth の使用例

次のコードは、線の太さが10で赤色の長方形の輪郭と、線の太さが20で緑色の長方形の輪郭を描画する。

// 線の太さが10の長方形を描画
setLineWidth(10);
// 赤(輪郭のみ)
drawRect(FILL_NONE, $ff0000ff, 10, 10, 20, 20);

// 線の太さが20の長方形を描画
setLineWidth(20);
// 緑(輪郭のみ)
drawRect(FILL_NONE, $00ff00ff, 20, 20, 30, 30);

drawNgon - 正多角形の描画

drawNgon(fill: int|FILL_NONE, stroke: int|STROKE_NONE, n: int)
drawNgon(fill: int|FILL_NONE, stroke: int|STROKE_NONE, n: int, angle: float)

描画される正nn角形の頂点座標は

{(cosθk,sinθk)}k=0,1,,n1\left\{\left( \cos\theta_k,\, \sin\theta_k \right)\right\}_{k=0, 1, \ldots, n-1}

となる。ただし、

θk=360°nk+angle°\theta_k = \frac{360\degree}{n}k+\text{angle}\degree

とする。すなわち、原点を中心とした単位円を外接する正n角形が描画される。

drawNgon の使用例

任意サイズの正n角形の描画

次のコードは、外接円半径39、中心(34, 71)、x軸正方向から30°30\degreeだけ回転した正8角形を描画する。

setMTX(
  // 作成した行列を描画行列として使う
  MTX_LOADIMM,
  // 新しい行列を作成
  MTX_NEW,
  // r(半径) = 1*S(拡大率) = 39
  39.0,
  // x(中心のx座標) = 0+dx(x方向の平行移動量) = 34
  34.0,
  // y(中心のy座標) = 0+dy(y方向の平行移動量) = 71
  71.0
);
// fill=red stroke=white, n=8, angle=30(deg)
drawNgon($ff0000ff, $ffffffff, 8, 30.0);

円の近似

次のコードは正24角形を用いて半径39、中心(34, 71)の円を描画する。

// r=S=39, dx=34, dy=71
setMTX(MTX_LOADIMM, MTX_NEW, 39.0, 34.0, 71.0);
// fill=red stroke=white, n=24
drawNgon($ff0000ff, $ffffffff, 24);