サンプルプログラム/文字が流れるテキストパネル改

Last-modified: 2017-01-17 (火) 22:13:27

タイマーでループ動作させることで、テキストパネルやLCDパネルに表示した文章が左に流れてループしていくスクリプトです。

サンプルプログラム/文字が流れるテキストパネル解説を書くのが面倒な処理を増やしてより実用的に改善したものです。

改変なしで実用可能です。

script_lcd_2.jpg


複数行に対応した流れるテキストパネル

下記の設定でタイマーブロックを動作させると、1秒ごとに繰り返しプログラマブルブロックが作動し、パネルのPublic textに書かれた文章の各行が1文字ずつ左に移動し、右側から出てきます。

電源のほかに必要なブロックと設定

ブロックの設定
ブロック備考
プログラマブルブロックエディタにこのスクリプトを保存しておく
テキストパネルNameに他と被らない名前を付けておく
Show text on screenをオンにしておく
Public textに任意の文章と空きスペース。詳細は下記
タイマーブロック下記
 
タイマーの設定
項目内容
Delay1秒など任意
ブロックアクション
プログラマブルブロックRun(Argumentは使用するパネルの名前*1
同じタイマー自身Start

Public textの文字列の例

Hello!        Welcome!
Welcome!      Hello!

Public textの内容は、上記例のように、流れるスペースにするための空白を適当に増やして書いてください。

フォントサイズを大きくしたり文字数を多くすることでパネルの端から流れてくるようになります。

スクリプト

二連続のスラッシュ「//」から後ろは文字化けしますが、コメントなので削除しなくても動作に支障はありません。

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        |
 
タイマーの設定
項目内容
Delay1秒など任意の秒数
ブロックアクション
プログラマブルブロック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);
       }
   }
}

資料

C#関連

コメント


*1 ブロックの種類名ではなく、ターミナルメニューの「Name」に設定した名前