タイマーでループ動作させることで、テキストパネルやLCDパネルに表示した文章が左に流れてループしていくスクリプトです。
サンプルプログラム/文字が流れるテキストパネルに解説を書くのが面倒な処理を増やしてより実用的に改善したものです。
改変なしで実用可能です。
複数行に対応した流れるテキストパネル
下記の設定でタイマーブロックを動作させると、1秒ごとに繰り返しプログラマブルブロックが作動し、パネルのPublic textに書かれた文章の各行が1文字ずつ左に移動し、右側から出てきます。
電源のほかに必要なブロックと設定
ブロックの設定 | |
---|---|
ブロック | 備考 |
プログラマブルブロック | エディタにこのスクリプトを保存しておく |
テキストパネル類 | Nameに他と被らない名前を付けておく |
Show text on screenをオンにしておく | |
Public textに任意の文章と空きスペース。詳細は下記 | |
タイマーブロック | 下記 |
タイマーの設定 | |
---|---|
項目 | 内容 |
Delay | 1秒など任意 |
ブロック | アクション |
プログラマブルブロック | Run(Argumentは使用するパネルの名前*1) |
同じタイマー自身 | Start |
Public textの文字列の例
Hello! Welcome! Welcome! Hello!
Public textの内容は、上記例のように、流れるスペースにするための空白を適当に増やして書いてください。
フォントサイズを大きくしたり文字数を多くすることでパネルの端から流れてくるようになります。
- 参照:LCDに関するTIPS
スクリプト
二連続のスラッシュ「//」から後ろは文字化けしますが、コメントなので削除しなくても動作に支障はありません。
public void Main(string argument) { var target = GridTerminalSystem.GetBlockWithName(argument) as IMyTextPanel; string text = target.GetPublicText();
string[] lines = text.Split('\n'); //改行で分割して配列に入れる text = ""; // textの中身は上で取り出し済みなので出力する文字列用に空にする
for (int i = 0; i < lines.Length; i++) { if(lines[i].Length > 0){ // 何も書いていない行でなければ string str1 = lines[i].Substring(0,1); // 1文字目をstr1に入れる string str2 = lines[i].Substring(1); // 2文字目以降をstr2に入れる text += str2 + str1; // 前後を入れ替えて繋ぐ }
if(i < lines.Length -1){ // 最終行未満なら text += "\n"; // 改行を入れる } }
target.WritePublicText(text, false); // パネル内容を更新 }
改造例:特定の行のみ流す
public void Main(string argument) { var target = GridTerminalSystem.GetBlockWithName(argument) as IMyTextPanel; string text = target.GetPublicText();
string[] lines = text.Split('\n'); text = "";
for (int i = 0; i < lines.Length; i++) { if(i == 1 || i == 3 || i == 5) { // 2行目または4行目または6行目なら if(lines[i].Length > 0){ string str1 = lines[i].Substring(0,1); string str2 = lines[i].Substring(1); text += str2 + str1; } }else { // 指定行以外なら text += lines[i]; //そのまま追加 }
if(i < lines.Length -1){ text += "\n"; } }
target.WritePublicText(text, false); }
特定の行以外のみ流す場合のif文例
上記の反転、2行目または4行目または6行目以外で動く
if(!(i == 1 || i == 3 || i == 5)) {
1行目または最終行以外が動く
if(!(i == 0 || i == lines.Length -1)) {
2行目までと最終2行以外が動く
if(!(i <= 1 || i >= lines.Length -2)) {
派生:流れるビーコン
電源のほかに必要なブロックの設定
ビーコンの場合、表示されるのがブロックの名前なので、そこが変化していくと名前で見つけることが面倒になります。なので、識別用文字と装飾を兼ねた「|」を両端に付けたビーコンすべてを対象に、||の間の文字列が流れるようにしています。
ブロックの設定 | |
---|---|
ブロック | 備考 |
プログラマブルブロック | このスクリプトを保存しておく |
Argumentは空白 | |
ビーコン | 名前については下記 |
タイマー | 下記 |
- ビーコンの名前は下記のように、両端を「|」で囲い、流れるスペースとして空白を適度に入れておきます。
|Beacon |
タイマーの設定 | |
---|---|
項目 | 内容 |
Delay | 1秒など任意の秒数 |
ブロック | アクション |
プログラマブルブロック | Run with default argument |
同じタイマー自身 | Start |
スクリプト
public void Main(string argument) { var targets = new List<IMyTerminalBlock> (); GridTerminalSystem.GetBlocksOfType<IMyBeacon>(targets);
foreach(IMyBeacon obj in targets){ string name = obj.CustomName; if ( name.StartsWith("|") && name.EndsWith("|")) { name = name.Replace("|",""); // 両端に付けた「|」を削除する。
string str1 = name.Substring(0,1);// 1文字目 string str2 = name.Substring(1);// 1文字目より後 name = "|"+str2+str1+"|";
obj.SetCustomName(name); } } }