なでしこを明後日の方向に

日本語プログラム言語なでしこを応援しています

なでしこでゲーム作る話  #3 イメージ部品をどう使う

画像を表示するにはイメージ部品を使うわけですが、他のプログラム言語の例を見ると「ダブルバッファリング」と「キャッシュ」を使うのがよさそうです。
これをなでしこで書いてみます。

プレイヤーに見せる「表イメージ」。
同じサイズの裏イメージ。
同じサイズのレイヤーを数枚(ここでは0~2の3枚)。
キャッシュという無駄に大きなイメージを用意します。
透過色については後で説明します。

!変数宣言必要
!レイヤー枚数=3
!画面サイズ=「0,0,600,400」
!透過色=0
黒色=$000001

//-------------部品の宣言ここから----------
表イメージとはイメージ
そのサイズ画面サイズ

裏イメージとはイメージ
そのサイズ画面サイズ
その可視オフ
裏イメージ画面クリア

レイヤーとは配列
(レイヤー枚数)回
  レイヤー[回数-1]イメージして作成
  レイヤー[回数-1]サイズ画面サイズ
  レイヤー[回数-1]可視オフ
  レイヤー[回数-1]透過色画面クリア

キャッシュとはイメージ
そのW=1000
そのH=5000//適当に大きく
その可視オフ
キャッシュ透過色画面クリア
//-------------部品の宣言ここまで----------

次は転送部分です。
プログラムからはレイヤー[0]~レイヤー[2]に描画します。
その後、●描画転送 でレイヤーを順番に裏イメージに画像合成します。
レイヤーを合成してできた裏イメージを表イメージに画像コピーしてプレイヤーに見せます。
その後レイヤーと裏イメージを画面クリアし、次の描画に備えます。
これゲームループに組み込んで毎フレーム呼びます。

//毎フレーム呼ぶ
●描画転送
 (レイヤー枚数)回
   レイヤー[回数-1]0,0透過色点描画//左上が透過色
   レイヤー[回数-1]裏イメージ0,0画像合成
 裏イメージ表イメージ,0,0画像コピー//上書き
 
 裏イメージ画面クリア
 (レイヤー枚数)回
   レイヤー[回数-1]透過色画面クリア

//キャラをレイヤーに描画する
●テスト
 x1とは変数。x2とは変数。y1とは変数。y2とは変数。
 線太さ1。線色黒色
 3回
  回数条件分岐
    1ならば、塗色赤色
    2ならば、塗色青色
    3ならば、塗色緑色
  x1=乱数(50)
  x2=x1+50
  y1=0
  y2=50
  レイヤー[回数-1]x1,y1からx2,y2円
 

//ゲームループ
1ループ
  テスト
  描画転送
  0.2秒待つ

レイヤーについて

レイヤー[0]が一番奥に描画され、レイヤー[1]、レイヤー[2]に画像合成で上書きされます。
レイヤー[0]に背景を、レイヤー[1]にキャラを、レイヤー[2]にポップアップ説明などを入れるといいんじゃないでしょうか。

例ではレイヤーに直接描画していますが、キャラなどはキャッシュから「画像部分コピー」してくるのがいいでしょう。 もちろんキャッシュには画像をあらかじめ読み込みしておきます。

透過色と黒色について

画像合成の命令の説明を読むと「左上の色を透過色として扱う」とありますが、罠があります。(なでしこver1.572時点)
透過色を0(黒)以外にすると合成後に変な色になります。
透過色が0以外の場合

!透過色=0 と黒色=1 としているのは0を透過色として、もともと0が黒だったのを似た色(=1)に置き換えています。
また、素材画像を作ってもらうときは「透過色は0でお願いします」と添えておくとよいと思います。

その他補足事項

左上の点に透過色以外が来た時のことも考えなくてはなりません。
上の例では左上に点描画してごまかしています。
画像マスクを使った例がサンプルにありますが、それも透過色が0じゃないと変な色になるので気を付けましょう。 サンプルにきちんと手を加えればどんな透過色でも大丈夫になります。

画像合成のほうが処理が早いので、無理に画像マスクを使うよりいいとおもいます。