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

(1) キャラクタ(文字)の移動

 文字や画像のアニメーション手法について学習する。

サンプル(move11.hsp)
 文字「○」をウィンドウの左から右へ移動させる。

    x = 0 : y = 100    ;初期座標設定(開始位置)
    dx = 5 : dy = 0    ;移動量の設定
    repeat
        color 255, 255, 255     ;※1 白色。背景と同じ色。
        boxf                    ;※1 ウィンドウと同じサイズの四角形を塗りつぶしで描画する。
        color 0, 0, 0   ;※2 黒色
        pos x, y        ;※2 カレントポジションを座標(x, y)に設定する。
        mes "○"        ;※2 ○を表示する。
        x = x + dx      ;※3 x座標加算
        y = y + dy      ;※3 y座標加算
        if x > ginfo_winx : break   ;※4 無限ループ終了
        await 100       ;無限ループの時のお約束
    loop
    stop

実行「○」がウィンドウの左から右へ移動するように見える。

 処理の手順は、(※1)画面消去、(※2)指定座標に文字を表示、(※3)座標の計算、である。
 「消しては書いて」を繰り返すことでアニメーションを実現している。実際のテレビや映画でも基本的に同じ手法で映像を表示している。
 ※4のシステム変数ginfo_winxはウィンドウ横幅のサイズ(ドット)である。座標xの値がウィンドウ横幅のサイズを超えたら、break命令で無限ループを抜け出す。無限ループを抜け出した後は、stop命令が実行される。

試してみよう
 移動量dxを10に増やす。 → 移動スピードが速くなる。(リスト)新しいウィンドウで開く
 移動量dyを10に増やす。 → 斜め右下方向に移動する。(リスト)新しいウィンドウで開く
 await命令の値を200に増やす。 → 移動スピードが遅くなる。(リスト)新しいウィンドウで開く


サンプル(move12.hsp)
 文字「○」をウィンドウの左から右へ移動させる。左右の壁(枠)ではね返るようにする。

    x = 0 : y = 100    ;初期座標設定(開始位置)
    dx = 5 : dy = 0    ;移動量の設定
    repeat
        color 255, 255, 255     ;※1 白色。背景と同じ色。
        boxf                    ;※1 ウィンドウと同じサイズの四角形を塗りつぶしで描画する。
        color 0, 0, 0   ;※2 黒色
        pos x, y        ;※2 カレントポジションを座標(x, y)に設定する。
        mes "○"        ;※2 ○を表示する。
        x = x + dx      ;※3 x座標加算
        y = y + dy      ;※3 y座標加算
        if x > ginfo_winx : dx = -dx    ;右壁超えた。移動量正負反転。
        if x < 0 : dx = -dx              ;左壁超えた。移動量正負反転。
        await 100       ;無限ループの時のお約束
    loop
    stop

実行「○」がウィンドウの左右に移動するように見える。

 壁を越えたとき、移動量の正負を反転すると移動方向が逆になる。
 右の壁で、はね返るとき、一旦、文字「○」が消える。「○」はpos命令で指定した座標(x, y)に表示されるが、この座標(x, y)は文字の左上の座標(図参照)なので右壁に消えたようになる。条件式を「x > (ginfo_winx - 8)」に変更すると壁ではね返るように見える(-8の値は調整が必要である)。
 左壁も同じように、少し壁にめり込んではね返るように見える。変数xの値が0になったときには移動量dxの正負は反転しないで、-5になったときに正負が反転する。この状態を解消するには条件式を「x <= 0」に変更し、変数xが0のときに移動量が反転するようにする。


課題(move91.hsp)
 文字「○」を斜めに移動させる。上下左右の壁ではね返るようにする。

・初期座標は、(x, y) = (100, 100)とする。
・移動量は、dx = 8、dy = 8とする。

ヒント
・ウィンドウ縦幅のサイズは、システム変数ginfo_winyで参照できる。
・はね返るときの移動量の正負については図を参照すること。上壁と右壁は考えよ。


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


目次へ 次へ 
2007 © Hiroshi Masuda

 

 

inserted by FC2 system