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

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

なでしこでゲーム作る話  #5 配列にグループを入れて使う

波紋と称して、大量の円が広がっていく様子を描画しようと思います。

f:id:tkizzz:20181216130530j:plain
波紋が広がったり消えたり

入れ物の用意

■波紋
 ・X{=0}
 ・Y{=0}
 ・TIME{=0}
 ・有効{=0}

波紋配列とは配列
波紋初期化
●波紋初期化
 rとは変数
 r0から100まで繰り返す
   波紋配列[r]波紋グループコピー

配列の変数を一つ用意して、要素にグループコピーしたものを用意します。
なでしこのマニュアルにある、「部品を動的に生成する」と同じです。
マニュアルでは「として作成」で例がでていますが、「グループコピー」でも動くみたいです。

とりあえず波紋配列[0]から波紋配列[100]まで用意しました。

毎フレーム更新

//毎フレーム呼ぶ
//中心がX,Y、半径がTIMEの円を描く
//100フレームで消える
●波紋更新
 xとは変数
 yとは変数
 tとは変数
 rとは変数
 線太さ1
 塗スタイル「透明」
 r0から100まで繰り返す
   もし(波紋配列[r]有効==0)ならば続ける
   x = 波紋配列[r]X
   y = 波紋配列[r]Y
   t = 波紋配列[r]TIME
   裏イメージ(x-t),(y-t)から(x+t),(y+t)円
   波紋配列[r]TIME1直接足す
   もし波紋配列[r]TIME>=100ならば
     波紋配列[r]波紋グループコピー //初期化

●波紋更新 という関数を用意します。
これを1フレームごと、今回は0.04秒ごとに1回呼び出します
呼び出されるたびに行うのは……
・有効==1なグループだけに対して以下を行う
・中心がX,Y、半径TIME(時間で増加)の円を描く
・TIMEを1増やす
・TIMEが100になったら消滅(初期化)
となります。

これだけでは有効が1の波紋がありません。
中心x,yを指定して●波紋作成(x,y)したときに有効=1を入れることにします。

//未使用の波紋配列[r]を探して中心を設定
●波紋作成(x,y)
 rとは変数
 r0から100まで繰り返す
   もし(波紋配列[r]有効==1)ならば続ける
   波紋配列[r]X=x
   波紋配列[r]Y=y
   波紋配列[r]TIME=0
   波紋配列[r]有効=1
   抜ける

配列の[0]から順にみていって、有効==1でないグループを探します。
中心点X,Yに値をコピーして、有効を1にします。
これを仮に8フレームごと、0.04秒*8=0.32秒ごとに呼びます

ゲームループに組み込む

//ゲームループ
1ループ
  もし回数%8==0ならば、波紋作成(乱数(300),乱数(300))
  波紋更新()
  裏イメージ表イメージ0,0画像コピー
  裏イメージ画面クリア
  0.04秒待つ

8フレームごとに波紋作成(x,y)
1フレームごとに波紋更新()
バックバッファから転送
0.04秒待つ
これをループさせるとこうなります。
f:id:tkizzz:20181216130530j:plain

完成品

!変数宣言必要
表イメージとはイメージ
そのサイズ「0,0,600,400」

裏イメージとはイメージ
そのサイズ「0,0,600,400」
その可視オフ


■波紋
 ・X{=0}
 ・Y{=0}
 ・TIME{=0}
 ・有効{=0}

波紋配列とは配列
波紋初期化
●波紋初期化
 rとは変数
 r0から100まで繰り返す
   波紋配列[r]波紋グループコピー  //配列にグループを入れる

//未使用の波紋配列[r]を探して中心を設定
●波紋作成(x,y)
 rとは変数
 r0から100まで繰り返す
   もし(波紋配列[r]有効==1)ならば続ける
   波紋配列[r]X=x
   波紋配列[r]Y=y
   波紋配列[r]TIME=0
   波紋配列[r]有効=1
   抜ける

//毎フレーム呼ぶ
//中心がX,Y、半径がTIMEの円を描く
//100フレームで消える
●波紋更新
 xとは変数
 yとは変数
 tとは変数
 rとは変数
 線太さ1
 塗スタイル「透明」
 r0から100まで繰り返す
   もし(波紋配列[r]有効==0)ならば続ける
   x = 波紋配列[r]X
   y = 波紋配列[r]Y
   t = 波紋配列[r]TIME
   裏イメージ(x-t),(y-t)から(x+t),(y+t)円
   波紋配列[r]TIME1直接足す
   もし波紋配列[r]TIME>=100ならば
     波紋配列[r]波紋グループコピー //初期化
 
//ゲームループ
1ループ
  もし回数%8==0ならば、波紋作成(乱数(300),乱数(300))
  波紋更新()
  裏イメージ表イメージ0,0画像コピー
  裏イメージ画面クリア
  0.04秒待つ

今回は8フレーム毎に乱数のx,y座標に波紋をつくりましたが、クリックしたところを中心にするなどするとゲームのエフェクト作りに役立つと思います。