HSP3 プログラミングの基礎V
前へ 目次へ 次へ 

(2) ウィンドウと画像表示 3

◎ ランダムな移動

limit(データ, 範囲1, 範囲2)
 データが範囲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 

 

 

inserted by FC2 system