プレイ日記
ただのサンプルです。 最近少し話題に出てきたSPFUNCも使ってます。 またしばらく書き込めなくなるかもなので、久しぶりに解説つきサンプル投稿をしてみようかと思いました。
15そうだね
プレイ済み
返信[1]
親投稿
プログラムはこんな感じです。 ……実は他の人の投稿に参考でアップしたプログラムを少しだけいじった感じの使い回しです…(^^; 内容的には、 ・一定周期での処理の実行 ・SPANIMのアニメーション ・SPFUNCでの後始末 辺りが参考になるんじゃないかと思います。 次から各行の解説をしていきます。
0そうだね
プレイ済み
返信[2]
親投稿
と、その前に内容の解説です。 実行すると一定周期でキャラ(コウモリ)が左から右に向かって飛びます。コウモリは画面外になると消えます。 一度にたくさんのキャラが出ることになるので空いているスプライト管理番号を使って登場させています。一度に512体(スプライト最大数)を超えるとエラーになると思いますが、内容的にそんなにたくさん出ないので問題ないです。 (周期や速度を変更してたくさん出るようにしたらエラー発生するかも) あくまでサンプルなので動かしたら見ていることしか出来ません…。ゲームを期待していた人はすいません。 とにかくたくさんのキャラをSPFUNCなる命令も使って出してみたいなーって人には参考になるかも? 程度の内容ではありますが、よろしくお願いします。
0そうだね
プレイ済み
返信[3]
親投稿
と言うことで、コメント行はスキップしますが、ほぼ全ての行の解説をします。 1: お約束の画面初期化命令です。僕のプログラムはほとんどこの命令から始まっていると思います。 3〜4: 背景用のBGを描画&アニメーションしています。 無制限横スクロールっぽい表現をする為にBGSCREEN命令で全画面より横1ブロックだけ大きなBGサイズにしてます。そして、そこにBGFILLで木の絵を敷き詰めています。 BGANIM命令ではBGを無限スクロールさせています。 "XY+"と指定する事で、BGの位置を初期値から相対的に移動させることが出来ます。そして、-60で60フレーム(1秒間)かけての線形補間移動で16ドット(1ブロック)分スクロールさせています。 スクロール後は、1フレーム(つまり瞬間)で(0,0)の座標に戻すことで無限スクロールにみえるように処理しています。
0そうだね
プレイ済み
返信[4]
親投稿
7: ここからメインループです。プログラム動作中は、ここからWENDの11行目までを永久(TRUE)ループします。 8: ここが一定周期でキャラを表示させる為の処理になります。 MAINCNTというシステム変数は、自動的に毎フレーム(VSYNC)+1されていくカウンタ用の変数です。今回はこの変数を使って時間を計測しています。 MODは割り算の余りを求める命令です。なので、MAINCNTを数字で割ったときに余りが0になるタイミングがちょうどその周期での実行タイミングになります。 今回は60*5(60フレームが1秒なので5秒)毎に登場させています。登場処理自体はGOSUB命令で@SPGOラベル先のプログラムに任せています。 (GOSUBなのでRETURNで戻ってくる)
0そうだね
プレイ済み
返信[5]
親投稿
9: この行がSPFUNCを使う場合のキーとなる命令です。 この呼び出しをすることで、SPFUNCされた全てのスプライトのSPFUNCで設定されたプログラムが呼び出されます。 例えばスプライトが3体出ていて、それら全てにSPFUNCしていた場合は、この行(命令)でそれぞれのスプライトに対してSPFUNCのプログラムの呼び出しが行われます。(3体だった場合は3回) SPFUNCされたスプライトが無い場合(まだ出てないときなど)は何も行われません。具体的なSPFUNCで呼び出されるプログラムは@SPGOのサブルーチンで設定されるので@SPFCになりますが、その時にまた説明します。 10: メインループには欠かせないVSYNC命令です。ほとんどお約束みたいな感じです。
0そうだね
プレイ済み
返信[6]
親投稿
11: WHILEに対応しているWENDですね。メインループの範囲です。 14: 8行目のGOSUBで呼び出されるサブルーチン用のラベルです。 15: SPSETでコウモリの定義番号(1036)のスプライトを表示しています。 この時に、OUTを使う事でスプライト管理番号は指定しません。この記述の場合、自動的に空いている(SPSETされてない)スプライト管理番号に割り当ててもらえます。そして、割り当てた管理番号はOUT先の変数Nに返ってきます。 以降、このNを使えば、今回表示したスプライトに対する処理を行う事が出来ます。確認用に?(PRINT)命令でSPSETしたこのNの値を表示したので、どのスプライト管理番号が割り当てられたかがわかると思います。
0そうだね
プレイ済み
返信[7]
親投稿
16: ここも一つのポイントとなるSPFUNC命令です。 SPFUNCで今回割り当てたスプライト(N)に対して、@SPFCラベルを設定しています。こうすることで先ほど出てきたCALL SPRITEが呼び出された時に、このスプライトに対して@SPFCサブルーチンを呼び出すことが出来るようになります。 今回何故SPFUNCを割り当てたかというとキャラの移動が終わった際に、そのキャラを消去する為です。消去しないと、どんどんとスプライト管理番号を使ってしまい、いずれ枯渇(512を超える)してエラーになってしまいます。 他にも処理を加えれば、出現中のキャラに対して様々なアクションを起こすことも出来ますが、今回はこの消去用の後始末処理のためだけに利用してます。
0そうだね
プレイ済み
返信[8]
親投稿
337333 337333
投稿元ユーザーにより削除されました。
返信[9]
親投稿
17〜20: 表示したスプライトに対して位置やアニメーションを設定しています。 17行目のRND命令で、出現キャラのY座標とスピード(S)をランダムに決めています。18行目では、その求めた位置にキャラを移動しています。この時にちょっとスピードに合わせてZ軸(奥行き)も設定していますが、単なる遊びです。 その後は、SPANIM命令でキャラクタの切り替えアニメと移動を行っています。 移動は"XY"指定でのSPANIMになります。ここで時間と位置を指定して1回だけ(つまりループしないように)移動アニメーションを実行しています。
0そうだね
プレイ済み
返信[10]
親投稿
キャラクタの切り替えは"I+"指定で行っています。"I+"はキャラクタ定義番号の相対していなので、6フレーム毎に0,1,2,3と切り替わるようにしてループ(0指定)させています。 相対指定なので0の場合は、1036, 1で1037と始めにSPSETで指定した1036番を基準としたアニメーションになります。 21: このサブルーチンの終わりのRETURNです。RETURNがないと戻れないので忘れないようにしましょう。 24: ここがSPFUNCで指定したサブルーチンのラベルです。CALL SPRITEで呼び出されるのはこのサブルーチンになります。
0そうだね
プレイ済み
返信[11]
親投稿
25: ここもSPFUNCを使った場合の一つのポイントになります。 前にCALL SPRITEによって全てのスプライトのSPFUNCされた命令(今回の場合はこのサブルーチン)が呼び出されると書きましたが「全て」と言うことは、SPFUNCが設定されているスプライトが1体ならば1回、5体とか複数あれば複数回、そのスプライトに対してこのサブルーチンが呼び出されます。と言うことで「呼び出されたスプライトを区別」する必要が出てきます。 この区別のために使うのが、CALLIDXというシステム変数です。これはSPFUNC(やBGFUNC)を利用したときに意味を持ち、この変数には呼び出されたスプライトの定義番号が入っています。 と言うことで以降、SPFUNC用のサブルーチンの中では、このCALLIDXの定義番号のスプライトに対しての処理を書くことになります。
0そうだね
プレイ済み
返信[12]
親投稿
で、直接CALLIDXを変数としてプログラムを書いても良いんですが、ちょっと変数名が長いので、手っ取り早くNという変数に移して、以降Nで処理しています。まあこれは好みです。とくに1回しか出てこないならCALLIDXのままでも良いような気がします。 16〜18: 出現中のスプライトが移動中かを判断して、停止していたらスプライトを消去する処理です。 SPCHK命令はSPANIMで動かしたアニメーションの状況を調べることが出来る命令です。返値としてはアニメーション中のフラグのようなものを返します。 もしSPANIMしているものが1つだったら単純に0(停止)してるかどうかのチェックで十分なのですが、今回は移動とキャラクタ切り替えの2つを同時に実行しています。なので移動が終わってもキャラクタの切り替えは終わらない(無限ループなので)ので、単純な0チェックでは判断できません。
0そうだね
プレイ済み
返信[13]
親投稿
と言うことで、SPCHKの戻り値に対して、ビット演算(AND)をつかって#CHKXY(XY移動)の部分だけ取り出して、それが0(停止)かどうかをチェックしています。このようにANDをつかうと部分的な状態を調べられるのですが、ビット演算に詳しくないと?な部分もあると思いますので、とりあえずは形で覚えてしまうか、ビット演算の勉強をしてみるといいと思います。 で、これが0の時は移動していない(画面外到着)ので、SPCLRでスプライトを消去しています。ここで登場時と同じように?(PRINT)で確認用に値を表示しているので、消去したスプライト管理番号がわかります。 29: @SPFCでのサブルーチンの終了です。 この場合は、CALL SPRITE命令によって一斉に呼び出されているので、9行目で呼び出されるスプライトの数と速度はその時出現しているスプライト数に依存します。
0そうだね
プレイ済み
返信[14]
親投稿
と言うことで、これで解説終わりです! なんとなく雰囲気が掴めればいいなぁ、と思って作ったサンプルだったのですが、色々試してみないとわからない部分もあると思いますし、質問等があれば答えますが、冒頭で書いたように、ちょっとしばらくまた来れなくなるかもしれないので、質問など答えられるのは今日明日、ぐらいまでになっちゃうと思います。 それ以降の質問があったときは気づいたときに早めに返事できたらと思っていますが、今のうちならすぐに回答できます。 という感じで、久しぶりの解説で僕もちょっと勝手がわからなくなる部分などもありましたが、よろしくお願いします&ありがとうございました! それでは、ではでは…。
0そうだね
プレイ済み
返信[15]
親投稿
ごごちー gogochii
とても参考になります!
0そうだね
プレイ済み
返信[16]
親投稿
>ごごちーさん ありがとうございます! もしわからない箇所があったときは遠慮なく聞いてくださいね〜。なかなか過不足無く書くのも難しいので抜けてる点もあると思いますし…。
0そうだね
プレイ済み
返信[17]
親投稿
質問です。DATAでマップ作る事って他の人のプログラム見てもない気がするんですが、DATAでマップ作るときってどんな時に役に立つんですか?
0そうだね
プレイ済み
返信[18]
親投稿
>くもきさん ごめんなさい。今回の投稿内容と話題が違うので別のトピックで新規投稿で質問してもらえますか? そしたらそこに書きます。よろしくお願いします。
0そうだね
プレイ済み
返信[19]
親投稿
申し訳ないんですが、トピックと関係がない投稿は、折をみて削除させてもらうかもしれません。よろしくお願いします。
0そうだね
プレイ済み
返信[20]
親投稿
ちょっと勘違いがあったので修正…。 BGANIMの箇所ですが、元の位置に戻すために1,0,0としていますが、それは要らなかったです。相対指定なので基準が命令実行時点での位置なので戻さなくても勝手に戻っていたという…。 なので、 BGANIM 0,"XY+",-60,16,0,0 で問題ないはずです。 失礼しました!
0そうだね
プレイ済み
返信[21]
親投稿
え!?BGでもアニメーション出来たんですか!?
0そうだね
プレイ済み
返信[22]
親投稿
>くもきさん BGもスプライトとほぼ同様のアニメーション命令がありますよー。SPANIMに対して、BGANIMになります。 使い方はかなりSPANIMと同じなので、片方を理解していれば使いやすいと思いますよ。
0そうだね
プレイ済み
返信[23]
親投稿
ごごちー gogochii
コメント遅れてしまいすみません! 解説までしていただきありがとうございます! 困った時にはここで再度復習していきたいと思います。
0そうだね
プレイ済み