投稿
元1行プログラム、サンプル解説つき講座です。(オマケ編) 久々にちょっとだけオマケの番外編です。
14そうだね
プレイ済み
返信[1]
親投稿
最近はたいしてなにもしてないのにフォローしてくれる人が増えてて恐縮です…。なのでというわけではないのですが(少しある?)前に1行プログラムで投稿したプログラムを1行じゃなく改行を入れて整理したプログラムとして、ちょっと解説してみようかなと思いました。まあたいした参考にはならないですが…。 ただこれを1行に無理やり詰め込んでいたというネタみたいなものです(^^;
0そうだね
プレイ済み
返信[2]
親投稿
ということで早速。 1:画面の初期化命令です。定番です。とりあえず入れちゃいますね。 2:自分の車である赤い車のスプライトを管理番号0番に割り当てて登場させています。この命令の初期座標は0,0(右上)なので、1行に入れるには余計な命令は入れたくないのでその場所をそのままスタート位置にしてます。 [命令解説] SPSET 管理番号,定義番号 スプライトを表示するための命令です。あらかじめSPDEFやデフォルトで定義されている定義番号を使いキャラクタを指定して、それを自分で管理する為の管理番号に割り当てます。割り当て以降は、管理番号でスプライトを指定します。 2:対戦相手の緑の車を管理番号1で登場させています。さすがに自分と同じ場所だとまずいので、その後にSPOFS命令で座標を0,16に変更して下の位置にしています。
0そうだね
プレイ済み
返信[3]
親投稿
すいません! 上記間違えました。3行目でした。 [命令解説] SPOFS 管理番号,X座標,Y座標 スプライトの位置を指定する為の命令です。SPSETの際に割り当てた管理番号を使って、そのスプライトの位置をX座標,Y座標で指定します。 ※ちなみに命令解説は今回の使い方のみの解説で、その命令の全ての機能を解説しているわけえはないので詳しくは命令表などを見てください。
0そうだね
プレイ済み
返信[4]
親投稿
5:定義番号1で割り当てた対戦相手の車にアニメーションを設定して動かしています。"XY"なので座標変化のアニメーションの指定になり、その早さは400フレームでX座標が380, Y座標が16の位置に移動するようにしています。この時に400の数字がマイナスになっていますが、このようにマイナスにすることで、その位置まで線形補間での移動にすることが出来ます。これをマイナスにしないと400フレーム後にいきなり座標がその場所に変化する(ワープする)感じになってしまいます。 途中ですが、ちょっと急用なので続きはまた後で書きます!
0そうだね
プレイ済み
返信[5]
親投稿
戻りました! ということで続きです。 [命令解説] SPANIM 管理番号,"アニメ対象", 時間1,項目1[,項目2] [,時間2,項目1[,項目2]...] [, ループ ] スプライトをアニメーションさせるための命令です。アニメ対象を指定することで様々な効果が出せます。またアニメ対象によって項目数が変わるので引数は可変になります。 時間を複数指定する事で連続して変化させたりループを指定する事で繰り返すことも出来ます。 この命令が便利なのは命令を実行すると以降、プログラムでなにもしなくてもアニメーションが継続します(終わるまで)
1そうだね
プレイ済み
返信[6]
親投稿
7:自分の車の位置変数を初期化しています。スプライトから直接位置を取得する方法もあるので迷ったのですが、今回は変数を使った方がコードが短くなりそうなので変数を使いました。 8:WHILE(繰り返し)開始地点です。繰り返し条件として、Xが380未満かつ(&&)対戦相手の車のアニメーションが継続している間、としています。&&はかつという意味で複数の条件を同時に満たしているかを調べたいときに間に繋ぎのようにいれます。 対戦相手の車はSPANIM命令によって移動させているので、SPCHK命令によってその結果を取得する事が出来ます。移動命令がX座標が380になるまでと指定されているので、移動中はこの命令の結果は0にならず、アニメーションが終わったら0になります。これによって自分(変数X)がゴールの位置(380)に到着するか、もしくは相手がゴールの位置に到着(アニメーション完了)するまでになり
0そうだね
プレイ済み
返信[7]
親投稿
どちらかがゴールに着かない限りはWHILEのループが継続されうる事になります。 [命令解説] SPCHK(定義番号) SPANIM命令で実行させたスプライトの状態をチェックする命令です。命令継続中の場合、該当のビットが1になります。ビットについては分かりにくいと思うので省略しますが、なにも継続してないときは0になるので0以上の時はなんらかのアニメーション中、ということになります。 9:自分の車のX座標に対して、なんらかのボタン入力があったら4を加算しています。これは意味合い的には、 IF BUTTON(2) THEN X=X+4 と同一なのですが、1行にする場合にIFがあると都合が悪いのでこんな書き方になっています。 内容的には、BUTTON(2)>0の結果がどうなるかを調べるとわかるのですが、この結果は、ボタンが押されると1(真), 押されてないと0(偽)になるという
0そうだね
プレイ済み
返信[8]
親投稿
特徴があります。なので、その結果に対して×4とすることで、ボタンが押されていたら4、押されてなければ0になり、それを直接X=X+と足しているので説明したような動作になる感じです。 慣れてないとこの辺の話は難しいのでスルーするか、もしくは質問をもらえればもう少し細かく説明したいと思います。 [命令解説]BUTTON(判定タイプ) ボタンが押されていたら該当のビットがONの数値、押されていなければ0が返ります。判定タイプの2はボタンが押された瞬間という意味なので、ボタンを押しっぱなしにしても一度に実行されるのは1回になります。(なので今回は連打しないと進まなくなる) 10:自分の車(定義番号0)の位置を更新しています。これによって自分の車のスプライトの位置が変化します。
0そうだね
プレイ済み
返信[9]
親投稿
11:VSYNC命令によるウエイトを入れています。このようにメインループに対してこの命令をいれるのはほとんどお約束のパターンで、これによってループのタイミングが1/60秒に同期されます。 [命令解説]VSYNC フレーム時間(省略時は1) 画面更新周期との同期をとります。1/60秒周期なので60にすれば約1秒ですが、普通は省略して1として更新するのでいいと思います。 12:WHILEによるループのエンドポイントです。WHILEの条件を満たす間はこの間がずっとループされる感じです。 ということで、車がゴールするまでの間は上記のWHILEループを繰り返し実行しています。 以降は、どちらかの車がゴールに到着したときにループから抜けて実行される命令です。
0そうだね
プレイ済み
返信[10]
親投稿
14: 変数SにSPCHK命令(上記説明参照)による敵車のアニメーション状態を取得しています。この時点で取得しているのは、この後でアニメーションを強制的に止めてしまうので、ここで取得しておかないと常にアニメーションしてないと判定されてしまうからです。 15: SPANIMによる敵車のアニメーションを止めています。敵がゴールしている場合は既に止まってることになりますが、どちらにして求める必要があるのでこのタイミングで止めておきます。 [命令解説] SPSTOP 定義番号 SPANIMで再生したアニメーションを停止します。 ※この命令で停止させると以降、SPSTART命令を実行しない限りSPANIM命令を使ってもアニメーションが開始されないので注意してください。
0そうだね
プレイ済み
返信[11]
親投稿
17:テキストの表示位置を設定しています。以降のPRINT命令ではこの位置に表示される事になります。 [命令解説] LOCATE X位置, Y位置 PRINT(or ?)命令で文字を表示する際の位置を指定します。 18:14行目で保存しておいた敵車のアニメ状態(S)をアニメ中かどうかチェックしています。アニメ中(THEN)なら19行目, アニメが終わっていた(ELSE)ら21行目が実行される事になります。 19:敵車がアニメ中(ということはまだゴールしていない)なので「アナタノカチ!」と表示します。?はPRINTの省略語です。 僕は比較的PRINTはちゃんとPRINTと書くようにしているのですが、今回は1行プログラムだったので短く書ける?を使いました。 [命令解説] PRINT(省略形として?) 式 式の結果を出力します。式には変数・文字列・計算式等
0そうだね
プレイ済み
返信[12]
親投稿
色々ありますが詳しくは命令表などを参照してください。 20:ELSEなのでこの後(次の行)は条件に一致しなかったときに実行される事になります。 21:19行の反対なので敵のアニメが終わっていた(=敵車が先にゴールした)と言うことで「アナタのマケ…」と表示しています。 22:18行からのIFの終了ポイントです。IFを複数行で書く場合は、ENDIFできちんと終わりを明示します。
0そうだね
プレイ済み
返信[13]
親投稿
という感じで解説終わりです! てか思ったよりも長くて時間がかかってしまった…。元は1行でも解説は1行とはいかないですね…。 今回はオマケの番外編なので得るものは少ない解説になってしまったかもしれませんが、とりあえずSPANIMとSPCHKの関係性ぐらいは役に立つのかな…?って感じですかねぇ…。 ちなみにこのゲーム(?)一つのボタンを連打していても勝てないかもしれないですが、複数のボタンを連打すればあっさり勝てますよ(^^; 解説でも書きましたが質問等があったら答えますので遠慮せず聞いてください。ということで、ありがとうございました!
0そうだね
プレイ済み