14) 危険な香りのテクニック 〜大量の画像〜
 さて、トランプやマージャン、花札など、多くの画像が必要なプログラムがありますね。
例えば、トランプなら、13x4=52枚、それに、ジョーカーとトランプの裏を合わせて54枚の画像が必要になる計算ですが、どうやってプログラムに組み込みましょうか?

54枚を順に組み込んでいるうちに、嫌になりましたので、ない頭を使って考えました。

    

カードのデザインを、このようにしました。そして、このカードは、上と下を次のように切り分けました。

    

こうすると、ハートやスペードなどの記号の画像4つと、数字のカード13枚の合計17枚で数字のカードが揃いますね。
で、ここで満足していては、あまりここのネタになりませんね。そう、悪魔がささやいたのです、CreateWindowが使えるんじゃない?

そう、CreateWindowを使えば、画面の任意の位置に枠を作って、その枠内だけに描画されましたね。
なので、記号カードの4枚を1つに集めたこんなカードを作ってみました。

    

そして、CreateWindowを使って、必要な部分だけ表示させるように試みました。

    

コードは、例えば、

    CreateWindow("CARD",X,Y,dX,dY)
    SetCurrentWindow "CARD"
    DrawBitmap CardNo,Xi,0

となります。横方向だけなので、DrawBitmapの Y軸は 0でいいですね。
問題は、窓の名前です「CARD」と名付けましたが、2枚目以降のカードに同じ名前にしてもいいのかなぁ?という点でした。
試しに、同じ名前のWindowを作って、同じようにしてみたところ、無事に動作しました。
あれれ?では、同じ名前で新しいWindowを定義した時点で、昔の定義は無効になるのかなぁ?と思いましたので、DestroyWindowでカレントのWindowを消してみました。

あれれ?全部消えちゃった?それも、別名のWindowも全部・・・
(と思ったら、これは総本家さまの掲示板にも掲載されていましたが、CreateWindowコマンド自体余り使われないようです。)
ただ、FillRectangleなどでカレントのWindowに描画することは出来ますので、描画したカードを消去することはできるようです。

気になるのは、同一名の付いた複数のWindowの存在です。
多分、新しいWindowを作るたびに、少しずつスタックが消費されていくのでしょうが、でも、同一名の新しいWindowsを作ることが出来て、そして、作った時点で古いWindowの方へはアクセスできなくなりますので、消費はされないのかなぁ?それともゴミが残るのかなぁ?という疑問がたくさん出てきました。

CreateWindowを上手く使うと、スクロールだけでなく、大きな画像の一部分を取り出すことが出来、トランプなどの多くの画像を取り扱うプログラムに使えそうですが、多くの画像を貼り付けるときは、ちょっと危険な香りがしますね。
ということで、今のところ、トランプでも20枚程度の画像を貼る上下分割画像(?)の方法が安全ではないかと思います。
また、もしこれを読んでトランプゲームが作りたくなった方、ご連絡下されば、カード一式の入ったソース一式を差し上げます。

今回は、ちょっと小ネタでしたが、いかがでしたか。危険な面を含んだこの方法、ご意見・ご感想などをお待ちしています。