12) 時代に逆らって
 おぢーさんの掲示板(備忘録)に書きこんだのですが「AmiSolは、スクリーン上にオブジェクトを配置していません。」という内容に「目から鱗」と評価頂きましたので、今回はその辺りのお話をお送りしたいと思います。
たまには、NS Basicに縛られないで、プログラムのお話をしてみましょう。

AmiSolの画面は、このようになっていますね。

   

この中で、スクリーンオブジェクトを除くと、配置してあるオブジェクトは「サウンドON/OFF」「Undo」「Restart」の3つだけになり、メインの盤上ではオブジェクトを配置してありません。
盤は、DrawBitmapを使って、描画していますが、初期状態でコマを並べるのはムダですので、次の2つのビットマップを用意して使っています。

     

Palm自体、ビットマップの描画が速いようなので、この方法を使うのが良いようです。ちなみに、コマは1つずつ描画していますので、その違いがわかると思います。

 では、どうやってコマの座標を取っているのか、ということですが、これはタップの座標を拾っています。つまり、Formのeventだけで済ませているわけですね。
まず、初期状態では、ビットマップを(12,16)の位置に描画しています。DrawBitmap 1016,12,16 ですね。
こうすることで、始点が(12,16)になりますね。次に盤の構成ですが、1つのセルの空白部分は19×19ピクセルの正方形になっていますが、空白セルの右と下の線を入れて20×20ピクセルの正方形と見なせます。なぜ右と下だけの片側だけ入れるか、ということですが、隣り合ったセルどうしで重複してカウントしないためです(当然か)

   

スクリーンをタップすると、Formのeventsで、タップイベントを判定しますね。具体的には、GetEventTypeのNsbPenDownの判定ですね。そして、GetPenを使って、タップした座標を得る、という手順になるでしょう。
          Dim X1 as Integer
          Dim Y1 as Integer

          If GetEventType()=NsbPenDown Then
                  GetPen X1,Y1,NsbPenDown
          
          End if
などが一般的でしょうか。こうして、タップした座標(X1,Y1)が得られ、座標はForm上ですから、左上が(0,0)で、右下が(159,159)の160×160ピクセルの範囲になります。
さて、これをマス目の位置に変換しなければなりません。そこで、次のような式を考えます。
        x = (X1-13)/20 + 3
        y = (Y1-17)/20 + 3
(X1-13) は、盤の左上座標(12,16)に枠分の1ピクセルを足した13を、タップした座標X1から減算し、それを20で割ると、ちょうど盤の左上青いセルをタップしたときのX座標が0になるわけですね。Y方向も同様ですが、よろしいでしょうか?

   

そして、それぞれ3を足していますから、図の青いセルが、枠座標としては (3,3) になるわけです。
どうして(0,0)もしくは(1,1)じゃないの?と言うことですが、AmiSolの盤データと関係してきます。

AmiSolのルールでは、次の図の赤いコマは、青いセルに移動できますね。

   

AmiSolでは、コマのデータをSol(i,j)という配列に格納していますが、Sol(i,j)には、=0:コマなし =1:コマありとしています。
この移動ルールを配列で表してみると、赤いセルを(X,Y)とした時、

   Sol( X ,Y)=1 赤いコマのセル
   Sol(X+1,Y)=1 隣りのコマのセル
   Sol(X+2,Y)=0 青いセル

この条件のときに、移動可能、と言うことになります。右ならば、-1,-2を、上ならばY方向を-1,-2という具合にすれば良いわけです。
逆に、あるセルSol(Xi,Yi)にあるコマが、左に移動できない、という条件は、Sol(Xi+2,Yi)が 0でない状態ですね。
さて、上の図の盤では、Sol(7,7)の配列で十分かと思われますが、実際はSol(11,11)の、11×11の配列を使っています。

Sol(11,11)を下の図のように配置すると、Sol(1,1)がちょうど赤いセルになりますので、青いセルが、Sol(3,3)となりますね。
(BASIC的には、(0,0)かもしれませんが、NS Basicの配列の添字で 0 は使えませんので、(1,1)が基点になります。)

   

初期状態では、コマのある位置がSol(i,j)=1,中央の黄色いセルはSol(i,j)=0、それ以外は、全てSol(i,j)=9になっています。
こうすると、右端のコマ、例えば緑色のコマ、が右に移動しようとしても、ピンクのセルは、Sol(i,j)<>0になっていますから、移動できません。
通常なら、座標をはみ出たか否かの判定とかするかもしれませんが、これだと、判定文が移動可能チェックルーチンと共通ですから、動作が少なくて済みますから、各座標に3を足しているわけです。

このように、タップした座標を拾って、適度に配列用のデータなどに加工する方法は、比較的わかりやすく、余分なオブジェクトを使わない分、コードがすっきりして、もしかしたら、サイズも小さくなるでしょう。
NS Basicは、基本的に色々なオブジェクトを貼り付けて、イベントコードを記述するイベントドリブン型のプログラム言語ですから、Visual BASICを使っているようだ、と比較してしまうかもしれません。(本家さまにも「Palm OS用のVisual Basic IDEを使っているようだ!」などとありますね。)
しかし、比較的高速なビットマップ描画や、単純なスクリーン構成、タップ座標が取れる、という特徴を生かすと、オブジェクトを多用しない昔風のプログラムも作成できるという特徴があります。

今回は、時代に逆行した内容をお送りしました。ガジェットなどが、コントロール配列で使えれば、それほど苦労はしないでしょうが、もし、それができても、私は使わないかもしれませんね(笑)
尚、言葉足らずのところは、ご容赦下さい。