HSP3 プログラミングの基礎V | |
(2) ウィンドウと画像表示 3
◎ ランダムな移動
データが範囲1〜範囲2の範囲内になるような値を返却する関数である。
limit(データ, 範囲1, 範囲2)
画像を左右に移動する。移動する方向は乱数で決める。
;初期設定 buffer 1 picload "gazou2.bmp" screen 0, 640, 480 gmode 2 randomize x = 100 : y = 100 ;初期座標 dx = 10 ;移動量 repeat ;描画処理 redraw 0 color 0, 0, 0 boxf pos x, y gcopy 1, 0, 0, 32, 32 redraw 1 ;移動方向 rr = rnd(10) ;乱数(0〜9)発生 if rr = 0 : dx = -10 if rr = 1 : dx = 10 x = x + dx ;座標計算 x = limit(x, 0, 640-32) ;範囲の制限 await 100 loop stop
画像がランダムに移動する。
乱数が0のとき左、1のとき右に移動するようにdxの値を変えている。乱数が2〜9のときはdxの値が変わらないので同じ方向へ進む。
limit関数で座標がウィンドウの外に出ないようにしている。limit(x, 0, 640-32)は、xが負のときは0、640-32より大きいときは640-32、それ以外(0〜640-32)のときはそのままの値を返却する。
移動のスピードは、移動量dxと時間待ちの値で決まる。
画像を上下左右に移動する。移動する方向は乱数で決める。
;初期設定 buffer 1 picload "gazou2.bmp" screen 0, 640, 480 gmode 2 randomize x = 100 : y = 100 dx = 10 : dy = 10 ;移動量 repeat ;描画処理 redraw 0 color 0, 0, 0 boxf pos x, y gcopy 1, 0, 0, 32, 32 redraw 1 ;移動方向 rr = rnd(10) if rr = 0 : dx = -10 if rr = 1 : dx = 10 if rr = 2 : dy = -10 ;移動量 if rr = 3 : dy = 10 ;移動量 x = x + dx y = y + dy x = limit(x, 0, 640-32) y = limit(y, 0, 480-32) await 100 loop stop
画像が上下左右に移動する。実際には斜めの移動である。
上下方向に移動できるように変数dyを追加する。
斜め方向だけでなく、水平、垂直方向にも移動するようにするには、dx=0, dy=0の設定を追加する。
水平、垂直方向にも移動するようにする。
;初期設定 <<省略>> ;移動方向 rr = rnd(10) if rr = 0 : dx = -10 if rr = 1 : dx = 10 if rr = 2 : dy = -10 if rr = 3 : dy = 10 if rr = 4 : dx = 0 ;移動量 if rr = 5 : dy = 0 ;移動量 x = x + dx y = y + dy x = limit(x, 0, 640-32) y = limit(y, 0, 480-32) await 100 loop stop
画像がランダムに移動する。
移動量dx, dyが両方とも0になるときがあるので、時々止まることがある。
◎ 複数の画像
10個の画像をランダムに移動させる。
;初期設定 kosu = 10 ;画像の個数 dim x, kosu ;個数分のX座標用配列 dim y, kosu ;個数分のY座標用配列 dim dx, kosu ;個数分のX移動量用配列 dim dy, kosu ;個数分のY移動量用配列 buffer 1 picload "gazou2.bmp" screen 0, 640, 480 gmode 2 randomize repeat kosu ;配列の個数分繰り返し x(cnt) = 100 : y(cnt) = 100 ;初期座標 dx(cnt) = 10 : dy(cnt) = 10 ;移動量 loop repeat ;描画処理 redraw 0 color 0, 0, 0 boxf repeat kosu ;配列の個数分繰り返し pos x(cnt), y(cnt) gcopy 1, 0, 0, 32, 32 redraw 1 ;←※1. ;移動方向 rr = rnd(10) ;乱数(0〜9)発生 if rr = 0 : dx(cnt) = -10 if rr = 1 : dx(cnt) = 10 if rr = 4 : dx(cnt) = 0 if rr = 2 : dy(cnt) = -10 if rr = 3 : dy(cnt) = 10 if rr = 5 : dy(cnt) = 0 x(cnt) = x(cnt) + dx(cnt) ;座標計算 y(cnt) = y(cnt) + dy(cnt) ; x(cnt) = limit(x(cnt), 0, 640-32) ;範囲の制限 y(cnt) = limit(y(cnt), 0, 480-32) loop ;※1のredraw命令を次の行に移動。 await 100 loop stop
10個の画像がランダムに移動する。
座標用のx, yと移動量用のdx, dyを配列にしただけである。
少し、画像がちらつく。原因は、※1のredraw命令が個数分繰り返し実行されるためである。この行を下から3行目await命令の前(上)に移動するとちらつきはなくなる。
2006 © Hiroshi Masuda |