スプライトを決まった経路で移動させる2015/01/17SmileBASICでは、ゲーム作成に便利なスプライト用命令をいろいろ持っていますが、その中でも特徴的なのが9日目の記事でも使ったSPANIM命令です。SPANIM命令では「座標変更」を指定することもでき、これを使うと、あらかじめ決めたコースの上をスプライトを移動させていくことができます。今回は前回の「落下する動き」「弾む動き」をスプライトにさせるプログラムを作ってみました。前回は円が画面の中で弾む動きをさせるためにY座標をプログラムで計算させていましたが、今回は(1)落下の座標計算をより簡略化し、(2)計算結果を配列に記録し、SPANIM命令で再生するようにしてみます。落下する動きの計算を簡単にすると、以下のようなダイレクトモードでも動かせる程度の短いプログラムになります。これを入力してみると、スプライトが画面上端から画面下端まで落ちる動きをします。1:NEXT:NEXTここで行っている処理は、スプライトを下方向へ「最初は1ピクセルずつ、5回動かす」「次は2ピクセルずつ、5回動かす」...「9ピクセルずつ、5回動かす」というものです。これだけでも落下するような表現になります。前回、落下する動作とは「移動速度が時間経過に従って直線的に増えていく」ような動作であると説明しました。Y[I],V[I]という計算により、VをGずつ増やし、そのVをYに加算することで落下動作を計算していました。先ほど示したプログラムは、「5回ごと」に「移動幅が1ピクセル」増えますので、「G=1/5ピクセル」としたのと同じことになります。する距離」が異なるいろいろな落下を表現できます。上で示したプログラムでは、移動幅1ピクセル~9ピクセル、同じピクセル数での移動回数5回です。画面縦240ピクセル-スプライト縦16ピクセル=224ピクセルにほぼ等しくなるようしたのです。移動回数を5回ではなく4回にすると、より早く落下する動作になります。この場合は「G=1/4ピクセル」としたことになります。下図に、移動幅と移動回数から移動距離を求める早見図を載せておきます。移動幅をマイナスから始めると、スプライトはいったん投げ上げられてから戻ってくる、すなわちジャンプするような動きになります。下のプログラムのように、-9ピクセル~9ピクセルとすると、画面いっぱいの大ジャンプになります。移動幅の初期値と終了値をもっと小さくして、例えば-5ピクセル~5ピクセルとすると、より小さなジャンプになります。1:NEXT:NEXTそれでは、ループの中でSPOFS命令で毎回座標を指定するのではなく、先に一連の座標を配列に記録してからSPANIM命令で再生してスプライトをアニメーションさせてみます。この方法のメリットは、座標をあらかじめ計算済みなので、動かすたびに計算し直す必要がないことです。SPANIMの座標変更機能は、(1)座標の列をパラメータで直接指定する(2)座標の列を配列で渡す(3)座標の列を格納したDATA命令の直前のラベルを指定するという3つの方法がありますが、今回は(2)を使います。管理番号,”XY”,配列,ループです。管理番号,”XY+”,配列,ループです。“XY”で指定した場合は、スプライトは指定された座標へ移動しますが、”XY+”で指定した場合は、スプライトは「SPANIM命令が実行された時点の座標+指定された座標」へ移動します。SPOFSで移動の出発点を指定すると、そこから出発してスプライトを動かすことができます。配列は1次元配列で、フレーム数,X座標,Y座標の3つを連続して格納します。現在のプチコン3号では、配列の中にこの3つを33組以上格納するとエラーになるようです。SPANIMには「補間機能」があり、これを使うと少ないパラメータで長時間の動きを表現できます。補間機能は、1フレームごとに「移動距離/フレーム数」だけ移動させることができる機能です。今回の落下の動きは「最初は1ピクセルずつ、5回動かす」で始まりますが、これは「5ピクセルを5フレームで動かす」という指定の仕方ができます。左側が1フレームごとの動作を指定した場合、右側が補間機能を指定した場合です。補間機能を使う場合は、フレーム数を負の値で指定します。左側は時間軸に沿って、1フレームごとにY座標を1ずつ5回増やしています。右側では、グレーになっている部分の指定は不要で、フレーム数が「-5」Y座標が「5」という指定をしています。これで左側と同じ指定をしたことになります。このあとの5フレームは2ピクセルずつ動いて、Y座標が15まで増えますので、この次の指定はフレーム数が「-5」Y座標が「15」という指定をすればよいのです。今回は「落下運動の座標を配列に入れて、SPANIMに渡し、スプライトに落下運動をさせる」プログラムを作りました。ANIM,YX=X+DX*KY=Y+I*KNEXTNEWX=XNEWY=YENDこのプログラムを動かすと、下図のように星のスプライトが上から落ちて2回弾んで止まるという動作を繰り返します。プログラムの中にループがありますが、このループはアニメーションを繰り返し再生させているだけです。0,”XY+”,A,1だけで実現しています。SPOFSで移動の開始ポイントを指定しています。次にSPANIMでスプライトの移動開始です。配列Aに座標のデータが入っています。ループ指定は1ですので、1回移動したら終了です。0,”C”,4,&HFFFFFFFF,4,&HFF808080,0は、スプライトの色を4フレームごとに明るくしたり暗くしたりして、チカチカ瞬くように見せています。1:WENDは、スプライトの移動が終わるまでループして待つ処理です。今回は詳しく説明しませんが、SPCHKはSPANIMで指定した動作の状態を調べる命令です。パラメータはスプライトの管理番号で、結果はSPANIMで指定できる様々な動作について「1(実行中)」「0(完了)」がビットパターンで得られます。1」で座標変更動作の状態を調べています。NEWX,NEWYの中で行っています。・NEWX、NEWY:最後の座標(ANIMの中には格納しない)となっています。・VMIN=1・VMAX=9・VTIME=5に相当します。計算結果はPUSHで配列の末尾に追加しています。PUSH命令は12日目にスタックの説明のところで解説しましたが、今回は単に配列の最後にデータを追加するために使っているだけです。最後の座標をANIMに入れずにNEWX、NEWYで返しているのは、SP_FALLを繰り返し呼んだ場合に、動きをスムーズにつなげるためです。X,Yとなっていますが、1つ目の呼び出しが最初の落下動作、2つ目と3つ目の呼び出しが弾む動作です。直前の呼び出しの最後の座標X,Yを、直後の呼び出しの際に座標の初期値として渡しています。A,Yで座標を配列の末尾に追加しています。関連プチコン講座boochow楽しくやろう。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。上に表示された文字を入力してください。元マイコン少年が、調べたことや作ったものを気まぐれに紹介するブログです。(9)メタ情報ログイン投稿フィードコメントフィードWordPress.org楽しくやろう。元マイコン少年が、調べたことや作ったものを気まぐれに紹介するブログです。(9)メタ情報ログイン投稿フィードコメントフィードWordPress.org。