[トップ][編集][ノート][編集履歴][一覧][最近の更新][->English]

HSPコンテスト:ショートプログラム:作ってみる編:トラピスを書く


動かないトラピス

はじめから動くものを作ろうとしても絶対にうまくいかないので、まずは動かないものを作ります。

        line 100, 100, 100, 0
        boxf 99, 99, 101, 101
stop

バーを横から見た状態だと思いねぇ。

        line 100, 100, 100, 0
        boxf 99, 99, 101, 101
        line 120, 110, 120, 10
        boxf 119, 109, 121, 111
        line 100, 100, 120, 110
stop

斜めから見た状態だと思いねぇ。

斜めから見た方がかっこいいですが、コード量が倍以上になってるし、めんどくさいので、当面は横から見た状態で行きます。

ループに入れる

トラピスを揺らすにはループをまわして、そのたびに少しずつずらしながら描画しなければいけません。 まずはHSPコンテスト:ショートプログラム:数学・物理編:運動を参考にして、シンプルなループを作ってみます。

*l_loop
        await 33; まずウェイト
        redraw 1: redraw 0; 画面を更新、かつ次のループまで更新を抑制。
        
        color 255, 255, 255: boxf; 背景を描画。

        color 0, 0, 0
        line 100, 100, 100, 0
        boxf 99, 99, 101, 101

goto *l_loop

まだ動いていませんが、ループの中で描画しているので、動かすための準備はできました。

斜めにしてみる

HSPコンテスト:ショートプログラム:数学・物理編:sin/cosを参考にして、斜めになったトラピスを書いてみます。

        dim sinTable, 65
        cosS = 1<<24
        repeat 65
                sinTable.cnt = sinS>>16
                sinS + cosS*4/163
                cosS - sinS*4/163
        loop
#module 
#deffunc sincos int
        mref i
        dup result, sin@
        repeat 2
                rad = i&0xFF
                sign = 1
                if rad>=128: sign = -1: rad - 128
                if rad>=64: rad = 128-rad
                result = sintable@.rad*sign
                dup result, cos@: i+ 64
        loop
return
#global

        angle = 20; ★適当な角度
*l_loop
        await 33; まずウェイト
        redraw 1: redraw 0; 画面を更新、かつ次のループまで更新を抑制。
        
        color 255, 255, 255: boxf; 背景を描画。

        color 0, 0, 0

        sincos angle; sin/cos を計算
        line sin+100, cos, 100, 0
        boxf sin+99, cos-1, sin+101, cos+1

goto *l_loop

★の部分を書き換えるとトラピスの角度が変わります。

揺らしてみる

HSPコンテスト:ショートプログラム:数学・物理編:振動を参考にしてトラピスを揺らしてみます。

トラピスが右にあるとき(angleがプラス)のときは左に加速(speedを減らす)して、 左にあるとき(angleがマイナス)のときは右に加速(speedを増加)します。

; ここに sincos モジュールをインクルード

#const Scale 256; ★小数点以下の切捨てがいやなので、計算は256倍して行う。
        angle = -20*Scale
        speed = 0;★スピード
*l_loop
        await 33; まずウェイト
        redraw 1: redraw 0; 画面を更新、かつ次のループまで更新を抑制。
        
        color 255, 255, 255: boxf; 背景を描画。

        color 0, 0, 0

        sincos angle/Scale; sin/cos を計算、angle は Scale 倍されているので元に戻す。
        line sin+100, cos, 100, 0
        boxf sin+99, cos-1, sin+101, cos+1

        angle += speed/100
        speed -= angle; スピードから角度を引く。

goto *l_loop

揺れるトラピスが完成しました。