投稿
ただのサンプルです。 以前、質問に対する回答としてのせたやつですが、キャラクターの移動やジャンプをさせてみたい初心者は多そうなので、見つけやすいように再度投稿しました。 ソースは次に載せます。
23そうだね
プレイ済み
返信[1]
親投稿
ソースです。1画面ですし公開キーは載せる予定はないのでご了承くださいー。 コメントつけてないので、質問などは(あったら)答えます。
2そうだね
プレイ済み
返信[2]
親投稿
とりあえずちょっとだけプログラムの補足。気が向いたら増やしていくかもしれないけど、まず変数の説明のみ。 GD:地面の位置にするY座標値 X,Y:キャラクタの座標 AY:キャラクタのY加速度(ジャンプ用) ND:前回の移動方向によるキャラクタ定義番号(トップ) D:現在の移動方向によるキャラクタ定義番号 ※NDとDは0の時はキャラクタ定義番号ではなくアニメなし K:ボタン状態(入力) DX:ダッシュの速度(ダッシュじゃない時は0) てな感じです。
1そうだね
プレイ済み
返信[3]
親投稿
共感が思ったより多いんで、ちょっと解説をプラス(^^; まあほんとは質問された方が答えやすいんだけど、質問がないって事は、この辺りはだいぶマスターされてきてるのかなって感じるところですね。 まずループに入るまでの説明。 1:ほとんどお約束の画面を初期化するための命令ですね。 2〜3:背景(BG)部分を描画しています。BGFILLはBGの範囲をキャラで埋める命令です。レイヤー0番(第1引数)に対して上部分を空。下部分を草で埋めてます。埋める範囲は第2引数からでX位置, Y位置, Xサイズ, Yサイズでの指定になりますが、BG画面は初期では25×15の画面サイズをもっているので、その部分を埋めるようにしています。
0そうだね
プレイ済み
返信[4]
親投稿
5:使用するに各変数を初期化してます。 実は本当はD=0でDも初期化しておいた方がいいです。抜けてましたが致命的ではないのでそのままです。 6:キャラクタを表示しています。 管理番号は0から指定出来ますが、このサンプルではなんとなく1を使ってしまいました。管理番号1に対して定義番号500の正面を向いたキャラを割り当ててます。 この時点ではキャラは画面の左上に表示されるのですが、最後のVSYNCの前のSPOFSで位置を指定しているので結果的に始めの位置に登場することになります。なのでこの段階では位置の指定は省略しています。 あとプログラムを追うとわかりますが、この正面を向いたキャラを指定しているのはここだけなので一度でもボタンで動かすとキャラが表面を向くことはありませんー。
0そうだね
プレイ済み
返信[5]
親投稿
ひまじん w.g.morugan
これどこかおかしいですか? 動かす時にぶどうがでできます。
0そうだね
プレイ済み
返信[6]
親投稿
ぱっと見ですが、SPANIMのところが抜けてますね。たぶん文字が着色されて画面だと見づらくなってしまったんでしょうね。 その部分は、 SPANIM 1,"I",4,D,4,D+1,4,D+2,4,D+3,0 になってます。なので"I"が抜けている感じです。 たぶんそこを直せば大丈夫だと思うのですが、もし変だったら言ってください。ではでは。
0そうだね
プレイ済み
返信[7]
親投稿
解説も続きます! ここからメインループの中身です。 8:ここにループさせるために用意しておくラベルです。定番ですね。 9:現在の定義番号をNDに待避して新しい定義番号の為の変数Dを用意します。これは定義番号が変わったときだけアニメーションを切り替えるための準備です。 11:ボタンの内容を変数Kに取得しています。この時の引数は省略しているので0になり、ボタンが押している限りはその値が入ります。ボタンの内容を変数に入れるのは定番ですね。 :(コロン)はマルチステートメントといって同じ行に複数の命令を書くときに挟みます。なのでこの行はもう一つ、命令を書いています。 マルチステートメントは便利ですが、あまり1画面に詰め込みすぎるとプログラムは見にくくなるので推奨しません。あくまで見やすさを考えて配分を考えるのがいいと思います。
0そうだね
プレイ済み
返信[8]
親投稿
11行目の続きです。 (K AND 32)はボタン入力の結果に対してビット演算のANDをしています。ビット演算については知らない人には説明が大変なので省略しますが、この結果、32(Bボタン)が押されている場合は、32、そうで無い場合は0になります。 ただしこれをさらに((K AND 32)>0)としているので、この式により、Bボタンが押されていたら1,そうでなければ0になります。 最後にその結果をさらに2倍した値をDXに入れているので結果、DXの値はBボタンが押されていたら2,押されていなければ0になることになり、この値を移動の際にダッシュする場合に使っています。 今回は1画面に収めるためにこういう書き方をしてしまいましたが、素直に、 IF K AND 32 THEN DX=2 ELSE DX=0 としてしまっても問題ないです。てか、今回でもそれでも入ったかも…
0そうだね
プレイ済み
返信[9]
親投稿
てかなんだかんだで投稿って流れて言っちゃうのであまり目にする人は居ないかもなぁ…。なので続きはまた気が向いたときにでも…(ないかも)
0そうだね
プレイ済み
返信[10]
親投稿
ひまじん w.g.morugan
一応、"I"は書いているのですが文字がうすくなってしまいます……… なぜですか?
0そうだね
プレイ済み
返信[11]
親投稿
おかしいですね。たしかに見えないです。 もしかしたら前に実行した他のプログラムが影響している可能性もあるので、今のプログラムをセーブしてから一度プチコンを終了させて、再度起動してみてもらえますか? さすがにプチコンを終了させれば完全に初期化は出来ると思うので。
1そうだね
プレイ済み
返信[12]
親投稿
何となく続き。 13:K(ボタン入力)をANDで判定して4(左)だった時の処理を書いてます。 D(定義番号トップ)を方向に合わせて変えて、X方向を減算(ダッシュ状態も加味)して左に移動させているのですが、この時にXが0未満にならないようにちょっと小細工しています。それは、 MAX(X-(2+DX), 0)の部分ですが、このMAXという命令は2つの値の最大値を返す関数なのですが、0と比較しているので結果は必ず0以上の値になります。ということで求めたXが0以上ならそのままの値になり、0より小さくなってしまったら0になる事で、画面の外にはみ出ないようになっている、というわけです。 14:右方向に対して13行目と同様の処理をしています。ただこちらは値が増えるのでMIN関数を使うことで画面の外にはみ出ないように調整しています。
0そうだね
プレイ済み
返信[13]
親投稿
MAXやMINを使っている箇所は通常なら、 IF X < 0 THEN X = 0 IF Y > 400-16 THEN X=400-16 でも問題ないです。今回は1画面に収めたかった事もあって、こういう書き方をしてしまいました。またこれを応用すると、 X = MAX(MIN(X, 400-16),0) と書くことで上記の2つのIF文を同時に実行したかのような結果を得ることも出来ます。※ワンポイント?
0そうだね
プレイ済み
返信[14]
親投稿
15:Aボタン(16)が押されていたときにジャンプをさせるための処理です。この時に、前に求めたKで判定するとAボタンを押しっぱなしにした時にずっとジャンプを繰り返してしまうので、押した瞬間だけにしたくてBUTTON(2)の呼び出しをしています。 またジャンプは地面に足が着いている時にしかしたくないので、Y座標が地面(GD)に着いているかも同時(&&)に条件としています。ジャンプ出来るときはY座標への加速度であるAYに-8を設定して上方向への力を加えています。この数字をマイナスに増やすとジャンプ力が高くなり減らすと低くなります。
0そうだね
プレイ済み
返信[15]
親投稿
17:Y座標に加速度(AY)を足して縦方向への移動を決定しています。その後、AYに1(重力想定)を加算しています。この値を増やすと重力が強くなり、減らすと低くなります。 またY座標に加算した結果、地面の位置より低くなってしまう場合(Y>GY)は加速度(AY)を初期化してY座標の位置も地面の位置に補正しています。
0そうだね
プレイ済み
返信[16]
親投稿
19行目〜25行目はアニメーションに関する部分です。 19:D(新しい定義番号)とND(前の定義番号)を比較して変わっていたら20〜25行目を実行します。この部分がないと毎回呼び出されるのでアニメーションを指示していても毎回リセットされることになるので変化が無い場合はスキップするようにしてあります。 20:とりあえずアニメーションと止めます。方向の変化には停止も含まれるので一旦止めてから以降の判定で移動していたら再度アニメーションを開始するようにしています。 21:不等号がない条件文ですが、この場合は0以外、という意味になり、定義番号が0(停止時に入る)以外の時は22,23行目のアニメーション関係の処理を実行するようにしています。
0そうだね
プレイ済み
返信[17]
親投稿
22:よく質問があるSPANIMを使ってのアニメーションです。この命令は色んな記述が出来るので初心者は使い方がわかりにくいようです。とりあえず命令表は必読ですね。 この部分は、管理番号(1)に対して、"I"(定義番号変更)のアニメーションを指示しています。そのアニメーション内容は次からの4,D,4,D+1,4,D+2,4,D+3の部分で、(時間,定義番号)の繰り返しになっています。この場合は4つ分あるので4パターンの切り替えになりますね。また最後に0としているのでループで繰り返されることになります。この部分が1だと1回しか再生されません。 23:定義番号1のアニメーションを開始しています。実はこの命令がないと20番で一度アニメーションを止めてしまっているので止まったままになってしまいます。もし自分で止めていなければ、この命令がなくてもアニメーションは開始されます。
0そうだね
プレイ済み
返信[18]
親投稿
24,25:IF文の終わりのENDIFです。IFを1行で書く場合は不要ですが、この例のように複数行にする場合は、IFの終わりがわからないのでこのように終わりがわかるようにする必要があります。 また気づいた人も居ると思いますが、この間のところでは行頭にスペースが入っていますよね。これはインデントと言ってIFやFORなどを使った際に、その範囲をわかりやすくするためのものです。これがあるとないとでは見やすさが全然違うので、みなさんも是非入れるようにして欲しいですね。 また適度に改行(空行)を入れるのも見やすくするコツなのでオススメです。
0そうだね
プレイ済み
返信[19]
親投稿
さてラストスパートです! 27:定義番号1のスプライトの表示位置を変更しています。上の行で求めたX,Yを用いて表示位置を決めています。一応Z方向も計算で出してみたいのでジャンプすると飛び出るのですが、これはあまり意味が無いですねー…。遊んでみただけです(^^; 28:おきまりのVSYNCです。引数を省略しているので1になり、1/60秒の同期を取るためのウエイトになります。 ループで画面を更新する際は、これを入れないと速度が安定しなかったり動作が不安定になる事が多いようなので、おまじないのように入れておきましょう。 29:そして@LOOPの場所へループ! これでこの間が繰り返されてキャラクターが動くようになりますね。これがないとこの時点で終わってしまうので必要です。
0そうだね
プレイ済み
返信[20]
親投稿
何とか説明が終わりました! もしこれ以上の細かい説明が欲しい方はコメントくれれば答えます〜。ちょっと駆け足な部分がありますしね。 書いていて思ったのですが、管理番号と定義番号は混合しやすいかもですね。 管理番号とは自分で管理するスプライトの番号になります。定義番号は、そのスプライトの内容(グラフィックや反転情報など)を定義してある番号です。定義番号の内容も自分で変えることが出来ますがデフォルトで用意されているので、始めはそれを使うことが多いんじゃないかなって思います。 ということで、とりあえずここまで! ご静聴ありがとうございました!
0そうだね
プレイ済み
返信[21]
親投稿
KU kerorinU
でんぺんさんのお陰でスプライトを移動させるPRGを製作することができました。有り難う御座います。フォローさせていただきます。
0そうだね
プレイ済み
返信[22]
親投稿
今更ですがフォローありがとうございます! 返事忘れていてすいません…。RPG良いですね! 頑張ってください!
0そうだね
プレイ済み