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