マクロでスコアから文字色装飾

こちらの記事はMinecraft Command Advent Calendar 2023への参加記事になっています
hi こんにちは
連載していたシェーダー記事も一段落し、せっかくなので今回はコマンドについての紹介をしていきたいと思います
この記事では主に文字色の装飾について紹介していこうと考えています
記事の後半では、前回使用したデータパックの1つScoreToColorについての紹介をしていきたいと思います
ScoreToColorDP:https://github.com/midorikuma/DP_Libraries

文字色の装飾

マインクラフト上に表示されるアイテムの説明や看板、本に表示される文字など、
コマンドで言うとtellrawやtitleで表示される特別なテキストは、全てRaw JSONテキストフォーマットにて装飾されています
例えば以下のtitleコマンドを使用すると、赤く着色された文字が表示されます

/title @s title {"text":"test","color":"red"}

このように文字色は"color"から設定することができます
ただし、ここでは"色の名称"とは別に"#から始まる文字列"で色を指定することも可能です

/title @s title {"text":"test","color":"#FF0000"}

この文字列は"カラーコード"と呼ばれています
この記事では、最終的にこのカラーコードをスコアから反映し、コマンドで文字色を動的に変えられるようにしたいと思います。

カラーコード

先ほどのカラーコードについて詳しく見ていきます
#FF0000
ここの値はA~Fを10~15に見立てた16進数の表記になっており、色の情報が2桁×3つ分、RGB(Red,Green,Blue)の順に並んでいます
分割すると
R:FF, G:00, B:00
となり
さらにこれを16進数表記から10進数に直すと
R:255, G:0, B:0
となります
FF0000 → R:FF, G:00, B:00 → R:255, G:0, B:0
16進数では00~FF、10進数では0~255が値の範囲となっています
例えばRGB全てが0の場合は黒色
R:0, G:0, B:0
逆に255の場合は白色になります
R:255, G:255, B:255

この10進数のRGB値をスコアから設定し、
先程とは逆の手順を踏みカラーコードを生成することで動的に色を変更したいと思います
例えばRGB全てが0の黒色の場合は
R:0, G:0, B:0 → R:00, G:00, B:00 → #000000
逆に255の白色の場合は
R:255, G:255, B:255 → R:FF, G:FF, B:FF → #FFFFFF
とすることができます
まとめると10進数のRGB値を16進数表記に変え、統合させたものがカラーコードとなります

スコアとマクロ

先ほど紹介したカラーコード生成までの流れを、スコアの計算とマクロの実行を通して行っていきたいと思います


スコア計算

まずはR,G,Bそれぞれで値を計算できるようにスコアを用意し、0から255の値を入れます
次にスコア上の10進数のRGB値を16進数表記に変えるために計算を行います

scoreboard players operation ##tmp TextColor /= ###16 TextColor

スコアを16で除算(/=)することで2桁目(十の位)

scoreboard players operation ##tmp TextColor %= ###16 TextColor

スコアを16で剰余演算(%=)することで1桁目(一の位)の値を求める事ができます

例えば10進数表記で33という値がスコアに入っていた場合には
十の位:33/16=2
一の位:33%16=1
となり、16進数表記では21となります。


マクロ実行

ただしこのままでは、例えば15を変換した際には、15→Fにはならず、15→15の表記のままとなってしまいます
これを解決するためにマクロを使用します
予めdataコマンドで0~9,A~Fの文字が入ったストレージを用意しておき

data modify storage stoc hexvalue set value ["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"]

変換後の数値に合わせて、0~9ならそのまま0~9が、10~15の場合はA~Fの文字が取得できるようにします

$data modify storage stoc tmp set string storage stoc hexvalue[$(tmp)]

△tmpは範囲0~15の10進数スコア値
これで10→A、11→B…15→Fというように10進数のスコアを16進数表記に変換することが可能となりました
最後にこれらをまとめ上げてカラーコードを生成するため、再度マクロを使用します
先程変換した16進数表記をRGBの順に並べカラーコードを生成し、文字を表示するコマンドへ組み込みます

$data modify storage stoc color set value "#$(R0)$(R1)$(G0)$(G1)$(B0)$(B1)"

△16進数表記を繋ぎ合わせてカラーコードを生成
これで、10進数のRGB値が入った3つのスコアから、文字色を装飾することができるようになりました

スコアの値から色を設定する

これまで紹介した手順を通して文字色を設定できるデータパックScoreToColorを用意しました
ScoreToColorDP:https://github.com/midorikuma/DP_Libraries
このScoreToColorDPではRGBHSVDecimalの3つの方法で色を設定することができます


・RGB
Red:赤色、Green:緑色、Blue:青色
の頭文字を取ってRGBと略されています
赤色、緑色、青色の配分量を指定して、色を設定できます
R:0-255, G:0-255, B:0-255 が値の範囲です
TitleShaderDPではスコア TextColorR, TextColorG, TextColorB から値を設定し、
ファンクションstoc:rgbから文字の色へRGB値を反映できます

/scoreboard players set @s TextColorR 255
/scoreboard players set @s TextColorG 0
/scoreboard players set @s TextColorB 0
/function stoc:rgb {command:'stoc:texts/testtitle'}

△RGB値から赤色の文字をタイトル表示


・HSV
Hue:色相、Saturation:彩度、Value(Brightness):明度
の頭文字を取ってHSVと略されています
色相は色の種類(赤~紫)、彩度は色の鮮やかさ(脱色~原色)、明度は明るさ(暗~明)となります
H:0-360, S:0-255, V:0-255 が値の範囲です
TitleShaderDPではスコア TextColorH, TextColorS, TextColorV から値を設定し、
ファンクションstoc:hsvからHSV値を反映した色を設定できます

/scoreboard players set @s TextColorH 0
/scoreboard players set @s TextColorS 255
/scoreboard players set @s TextColorV 255
/function stoc:hsv {command:'stoc:texts/testtitle'}

△HSV値から赤色の文字をタイトル表示


・Decimal
単一のスコア値からRGB値へ変換し文字色を指定することができます
これは16進数であるカラーコードを、2桁✕3つに分割せず
そのまま6桁✕1つの16進数を10進数へ変換したスコア値を使用したものとなっています
0-16777215 が値の範囲です
TitleShaderDPではスコア TextColorDecimal から値を設定し、
ファンクションstoc:decimalから10進数値(Decimal)を反映した色を設定できます

/scoreboard players set @s TextColorDecimal 16711680
/function stoc:decimal {command:'stoc:texts/testtitle'}

△10進数値から赤色の文字をタイトル表示

リソパシェーダーでの活用

先程のコマンドではデフォルトで用意されたstoc:texts/testtitleというファンクションを実行するよう設定していましたが
ScoreToColorDPではファンクション指定の代わりにコマンドを直接書くことも出来るようになっています

/function stoc:rgb {command:'title @s title {"text":"test","color":"\',\'"}'}

色を設定したい部分に"color":\',\'と記述することでカラーコードが反映されます
上記のコマンドを使用することで、mcfunctionファイルを用意せずにコマンドを直接実行することも可能です

前回の記事で紹介したデータパックTitleShaderDP内ではこの方法を利用して
特殊なシェーダー表示用フォントの色がスコアから設定されるようになっています
つまり、スコア→文字色→シェーダーを通して値を受け渡すことができるようになった訳です
これにより実現可能となった演出の例を最後にいくつか挙げて記事の締めにしたいと思います。

おわり

コメントを残す