HSP3 ゲームのプログラミング
前へ 目次へ 次へ 

(3) 複数キャラクタの移動

 キャラクタの移動には、そのキャラクタの座標や移動量を格納しておく変数を用意し、座標を変化させることで移動させた。キャラクタが複数になった場合は、それぞれのキャラクタについて座標や移動量を格納する変数を用意することになるが、同じ種類の変数を複数用意する必要があるので、配列変数にすると便利である。

サンプル(move31.hsp)
 一つのキャラクタ移動のプログラム(move13.hsp)を元に、複数のキャラクタ移動のプログラムを作成する。

 move31 move13
    kosu = 10
    dim x, kosu : dim y, kosu : dim gf, kosu
    dim dx, kosu : dim dy, kosu
    buffer 1               ;ウィンドウID 1番
    picload "move1.bmp"    ;画像ファイル読み込み
    screen 0               ;ウィンドウID 0番
    gmode 2, 32, 32        ;コピーモード設定
    buffer 1               ;ウィンドウID 1番
    picload "move1.bmp"    ;画像ファイル読み込み
    screen 0               ;ウィンドウID 0番
    gmode 2, 32, 32        ;コピーモード設定
    foreach x
        x(cnt) = rnd(640 - 64) : y(cnt) = rnd(480 - 64)
        dx(cnt) = 8 : dy(cnt) = 8
        gf(cnt) = 0        ;画像切り替え用
    loop
    x = 100 : y = 100
    dx = 8 : dy = 8
    gf = 0        ;画像切り替え用
    repeat
       redraw 0        ;仮描画
        color 255, 255, 255        ;白色。背景と同色。
        boxf            ;四角形を塗りつぶしで描画
        color 0, 0, 0   ;黒色
    repeat
        redraw 0        ;仮描画
        color 255, 255, 255        ;白色。背景と同色。
        boxf            ;四角形を塗りつぶしで描画
        color 0, 0, 0   ;黒色
       foreach x
            pos x(cnt), y(cnt) ;カレントポジション設定
            if gf(cnt) = 0 {
                gcopy 1, 0, 0 ;画像コピー
                gf(cnt) = 1
            } else {
                gcopy 1, 32, 0 ;画像コピー
                gf(cnt) = 0
            }
            x(cnt) = x(cnt) + dx(cnt) ;x座標加算
            y(cnt) = y(cnt) + dy(cnt) ;y座標加算
            if x(cnt) > ginfo_winx - 32 : dx(cnt) = -dx(cnt) ;右壁
            if x(cnt) <= 0 : dx(cnt) = -dx(cnt) ;左壁に衝突。
            if y(cnt) > ginfo_winy - 32 : dy(cnt) = -dy(cnt) ;下壁
            if y(cnt) <= 0 : dy(cnt) = -dy(cnt) ;上壁に衝突。
        loop
        pos x, y ;カレントポジション設定
        if gf = 0 {
            gcopy 1, 0, 0 ;画像コピー
            gf = 1
        } else {
            gcopy 1, 32, 0 ;画像コピー
            gf = 0
        }
        x = x + dx ;x座標加算
        y = y + dy ;y座標加算
        if x > ginfo_winx - 32 : dx = -dx ;右壁
        if x <= 0 : dx = -dx ;左壁に衝突。
        if y > ginfo_winy - 32 : dy = -dy ;下壁
        if y <= 0 : dy = -dy ;上壁に衝突。
        redraw 1     ;実描画
        await 100    ;無限ループの時のお約束
    loop
    stop
        redraw 1     ;実描画
        await 100    ;無限ループの時のお約束
    loop
    stop

実行move21を実行すると10個のキャラクタが移動する。

 初期座標の設定をx(cnt)=100:y(xnt)=100とするとすべてのキャラクタが同じ座標から移動を開始するので、結局一つしか移動していないように見える。それぞれの初期座標を変えるため、乱数で初期座標を設定している。x方向はウィンドウサイズ640、y方向はウィンドウサイズ480の範囲内に描画されるように乱数を発生させる。
 キャラクタをよく見ていると壁に少し埋まるものがある。これは移動量(dx,dy)を8としているので、初期座標に8を加算していくと壁衝突の座標を超えるためである。これを防ぐためには、初期座標が8の倍数になるようにする。

x(cnt) = rnd(80 - 8) * 8 : y(cnt) = rnd(60 - 8) * 8

 右と下壁の判定も">"を">="に変更する。

if x(cnt) >= ginfo_winx - 32 : dx(cnt) = -dx(cnt) ;右壁
if y(cnt) >= ginfo_winy - 32 : dy(cnt) = -dy(cnt) ;下壁

課題(move93.hsp)
 キャラクタごとに移動量を変化させよ。移動量は-10 〜 10の範囲とする。


(リスト)新しいウィンドウで開く



課題(move94.hsp)
 左右反転した画像を(move2.bmp)使って、右方向へ移動するときと左方向へ移動するときとで画像を切り替える処理を追加せよ。


(リスト)新しいウィンドウで開く


前へ 目次へ 次へ 
2007 © Hiroshi Masuda

 

 

inserted by FC2 system