More ... | 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
揺れるトラピスが完成しました。 |