プレイ日記
おちゃめ ochame_nako
初心者でも簡単にアニメーション表示が可能になるSPANIM2命令を作りました。これを使って初心者向けにアニメーションしながら8方向に移動するためのプログラムの解説をしています。標準のSPANIM命令を使って困った人がいたらぜひ使ってみてください。 公開キー【 RS5E83ZJ 】
20そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
SPANIM2の書式は SPANIM2 管理番号,キャラパターン数、アニメ速度(フレーム数),アニメ回数 となっています。(回数0の時は停止処理を行うまでずっとアニメを繰り返します) 例えばSPSET 0,516(魔法使いの子の右向き)としておいて4パターンのアニメを10フレーム間隔(1周期40フレーム)で1回ほどこの歩行アニメを行いたいという場合にはSPANIM2 0,4,10,1でOKです。 標準のSPANIM命令を使い普通に書けばSPANIM 0,"I",10,516,10,517,10,518,10,519,1なのでかなり楽になっているのが分かると思います。 "I"だけのアニメーション(スプライトの定義番号だけを変えたアニメーション)のみ対応ですが非常に便利ですよ。
1そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
実際にSPANIMを使って移動するキャラに対するアニメーション処理をしたことがある人ならば分かると思いますが、「SPANIMの書式が難しい」というのとは別の問題も少なくないです。 例えば下記のように記述しても最初の1コマ目だけ表示されてアニメーション表示は行ってくれません。 SPSET 0,516 X=200:Y=120 WHILE 1  B=BUTTON()  IF B AND #RIGHT THEN X=X+1:ばSPANIM 0,"I",10,516,10,517,10,518,10,519,0  SPOFS 0,X,Y  VSYNC WEND これは、SPANIMは実行するたびに最初の1コマ目から順番にアニメーションするためです。 したがって、SPANIMを繰り返し実行していると1コマ目だけ表示するため結果として静止状態になるわけです。
0そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
では、どうするかというと1つの解決方法としてはボタンを押した瞬間だけアニメーションさせるというものがあります。 SPSET 0,516 X=200:Y=120 WHILE 1  B=BUTTON():B2=BUTTON(2)  IF B AND #RIGHT THEN X=X+1  IF B2 AND #RIGHT THEN SPANIM 0,"I",10,516,10,517,10,518,10,519,0  VSYNC WEND これは知っているとそれほど難しいことではないですが、初心者が自力でこれを見つけ出すのはかなり難しいかもしれません。 それに見るからに面倒くさいですね。
0そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
しかし、今回のSPANIM2ならばこんなに簡単に書けます。 SPSET 0,516 X=200:Y=120 WHILE 1  B=BUTTON()  IF B AND #RIGHT THEN X=X+1:SPANIM2 0,4,10,0  VSYNC WEND 両者を比較してみると「SPANIM2」ならば初心者でも簡単にアニメーション処理を使ったプログラムが書けそうな気がしませんか?
0そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
しかし、アニメーション回数は無限ループ(ずっと繰り返し)となっているため現状ではボタンを離してもアニメーションは継続します。 十字ボタンを押してない時(キャラの動きが停止中)はアニメの動きも止めたいというのであれば次の3つの方法があります。 (1)アニメ回数を0(ずっと繰り返し)ではなく1回にする (2)SPSTOPで停止する (3)SPCHRでキャラ定義番号の変更をする
0そうだね
プレイ済み
返信[6]
親投稿
おちゃめ ochame_nako
(1)の方法だとこのようになります。 SPSET 0,516 X=200:Y=120 WHILE 1  B=BUTTON()  IF B AND #RIGHT THEN X=X+1:SPANIM2 0,4,10,1  VSYNC WEND アニメ回数を1回というのは簡単で分かりやすいし最小移動単位がマス目単位と決まっているようなRPGのフィールド画面等では有用ですが、離した瞬間にすぐには停止ができないためアクションゲームでは向いているかは微妙だし、デフォルトのアニメパターンだと停止した時(4コマ中の4コマ目)のパターンは足が開いた状態となっているため「静止した状態(足を閉じた状態)」で停止はできません。
0そうだね
プレイ済み
返信[7]
親投稿
おちゃめ ochame_nako
(2)の方法だとこのようになります。 SPSET 0,516 X=200:Y=120 WHILE 1  B=BUTTON()  IF B AND #RIGHT THEN X=X+1:SPSTRT:SPANIM2 0,4,10,0  IF (B AND #RIGHT)==0 THEN SPSTOP  VSYNC WEND SPSTOPを使うとSPSTARTで再開できますが、こちらはすぐに停止ができる反面でどんなポーズで止まるかはボタンを離すタイミング次第です。(あとSPSTOPは"I"以外のSPANIMの効果もすべて停止するので注意)
0そうだね
プレイ済み
返信[8]
親投稿
おちゃめ ochame_nako
というわけで、「ボタンを離したらすぐに止めたい」とか「止まっている時のポーズはこれがいい」というのがあれば(3)のSPCHRを使うのがオススメです。 SPSET 0,516 X=200:Y=120 WHILE 1  B=BUTTON()  IF B AND #RIGHT THEN X=X+1:SPANIM2 0,4,10,0  IF (B AND #RIGHT)==0 THEN SPCHR 0,516  VSYNC WEND これは、SPCHRを使うとSPANIMの"I"の効果が自動的に終了するためです。 もちろん、(3)の方法が正しいというのではなく自分が作りたいものに適合していれば(1)や(2)の方法で何ら問題はありません。
0そうだね
プレイ済み
返信[9]
親投稿
おちゃめ ochame_nako
この判定を十字ボタン4つ分行えば8方向移動しながらアニメーションも簡単にできます。 方向を変えるとキャラのパターンを変える必要がありますが、これはSPANIM2の前にSPCHRで指定すれば良いです。 しかし、SPCHRを使うとアニメが停止するため「違う向きで表示する」という場合のみ実行しなくてはならずIF文を羅列する必要があります。 そこでキャラパターンに変数Cを使ってC=0の時は右向き、C=1の時は前向き、C=2の時は左向き、C=3の時は後ろ向きのようにして少しだけプログラムをコンパクトにしてみます。 この際に気になるのは8方向移動する場合にはキャラの向きが4パターンしかないということですが、それは斜め方向に移動する場合には左右向きか前後向きで代用するしかありません。 今回は斜め移動中は前後向きで代用することにします。
0そうだね
プレイ済み
返信[10]
親投稿
おちゃめ ochame_nako
SPSET 0,516 X=200:Y=120 WHILE 1  PB=B:B=BUTTON()AND 15  IF B AND #LEFT THEN X=X-1:C=2  IF B AND #RIGHT THEN X=X+1:C=0  IF B AND #UP THEN Y=Y-1:C=3  IF B AND #RIGHT THEN Y=Y+1:C=1  IF B!=PB THEN SPCHR 0,516+C*4:SPANIM2 0,4,10,0  IF !B THEN SPCHR 0,516+C*4  VSYNC WEND たったこれだけで8方向移動しながらアニメーション表示ができます。 このリストはSPANIM2の動作用サンプルとして上記の公開キーでダウンロードしたプログラムに入っているため実行して確かめてみてください。
0そうだね
プレイ済み
返信[11]
親投稿
おちゃめ ochame_nako
初心者のために分かりにくい部分の解説をしておきます。 BUTTON() AND 15というのは十字ボタン全体の情報を取得しています。「十字ボタンを押しているか否か」を判定したい場合はこの値が「0」か「0以外か」で簡単に分かります。(8方向ではなく4方向移動もこれを使えば簡単にできる) 変数PBには1フレーム前の十字ボタンのボタン情報が入っています。 これによって前回と異なるボタンを押したらキャラパターンを切り替えるという処理を行っています。(Cの値が変化した場合を判定しても同等のことができるけど8方向移動の場合は十字ボタンで処理した方が簡単にできる)
0そうだね
プレイ済み
返信[12]
親投稿
おちゃめ ochame_nako
一見これはBUTTON(2)で代用ができそうですが、BUTTON(2)AND 15の値が0以外の時にパターン切り替えを行うようにすると斜め移動中に十字ボタンを離さずに左(もしくは右)を押した場合には向きと方向が一致しないという不具合が発生してしまいます。 これを解消するには離した瞬間を取得するBUTTON(3)も必要になります。そんなことをしなくても、前回と異なる十字ボタンを押しているかどうかだけで判定が可能になるため上記のプログラムの方が初心者には分かりやすいと思います。 あと!Bの「!」は論理反転(論理否定)を示していて「Bの値が0の時は1」「Bの値が0以外の時は0」になります。 IF B THEN ~ならばBの値が0以外の時にTHEN以下を実行しますが、IF !B THEN ~ならばBの値が0の時にTHEN以下を実行するということです。
0そうだね
プレイ済み
返信[13]
親投稿
おちゃめ ochame_nako
ちなみに斜め方向の場合はキャラパターンを「前後」ではなく「左右」にしたいという場合は5~8行のボタン入力判定の左右の判定の方を前後より後に記述すれば良いです。(簡単に言えば5、6行と7、8行を入れ替えるだけ) なぜこれでOKかというと斜め移動というのは縦と横の2つの条件式を両方満たしているからです。 右上の移動だと右移動の条件式と上移動の条件式の両方を満たすことで表示時のCの値は後者の値となるためです。 このSPANIM2命令内でどんなことをやっているのかを解析したい初心者向けに書いておくとまずは表示スプライトの定義番号を基点としたSPANIM形式のデータ配列の生成、SPANIMの連続呼び出し防止としてアニメ中ならばキャンセル処理、SPVARを使いSPCHR関数で取得された定義番号を元に正しい1コマ目となるように設定などがあります。
0そうだね
プレイ済み
返信[14]
親投稿
おちゃめ ochame_nako
あとパターン数に「4」という数字を入れると「4コマのパターン」となり「1コマ目から順番にアニメーションしますが、「4.1」という数字にすれば「4コマ中の(0を基点とした)1番目、つまり2コマ目から開始」となります。(つまり、1、2、3、4ではなく2、3、4、1という順番で表示される) この開始コマ数は0~9の範囲で指定が可能です。 止まった状態から動き出すとき最初の1コマ目が足を閉じた状態であるため初期値は0(1コマ目)から開始となっていますが、停止状態の時も足を閉じた状態であるため開始がスムーズに見えないという人はSPANIM2 0,4,10,0をSPANIM2 0,4.1,10,0に変えてみると良いかも知れません。 0~9の範囲でしか使えないもののこの表示開始コマの設定は非常に便利なので有効活用してみてください。
1そうだね
プレイ済み
返信[15]
親投稿
おちゃめ ochame_nako
今回は初心者によくありがちな「SPANIMを使ってアニメーションさせる方法が分からない」とか「SPANIMをちゃんと記述しているはずなのにアニメーションしてくれない(SPANIM実行中に再度SPANIMを実行しているため)」という問題を解消するためにSPANIM2命令を作ってみました。 SPANIM2命令を使えば簡単にアニメ処理ができるため初心者にはオススメしたいところですが、さらに高度な処理を行いたいと思ったら標準のSPANIMを使いこなせるようにすると良いと思います。 もしくは、今回のSPANIM2命令のようにSPANIMを元に自分が使いやすい形にした自作命令を作っても良いかと思います。
0そうだね
プレイ済み
返信[16]
親投稿
Hypnosaure Hypnosaurus
Could you tell me what is this "game", please?
0そうだね
未プレイ
返信[17]
親投稿
Hypnosaure Hypnosaurus
Oh! It's OK, I've found an answer with mister google... You're lucky to have this, here I can't! Maybe in the future...
0そうだね
未プレイ
返信[18]
親投稿
おちゃめ ochame_nako
8方向移動サンプルプログラムの一部にミスがありました。 4つ目のIF文となる IF B AND #RIGHT THEN Y=Y+1:C=1 において#RIGHTではなく#DOWNです。 ただのタイプミスなので公開キーによってダウンロードしたリストは全く問題ないので安心してください。 それ以外にも何か問題があれば言ってください。 SPANIM2命令は十分なテストを行っており普通に使う限り不具合は見られませんが、それでも何らかの不具合がもしも見つかれば報告お願いします。 
0そうだね
プレイ済み
返信[19]
親投稿
ツララ LongIceSword
個人的にはどっちかっていうと初心者の人向けって言うより、中級者の人向けな気がしますね。 最初から便利過ぎる物に触れちゃうと、不便な物はよっぽどどうにもならない場面に遭遇しない限り使おうとは思わないのが人間の性ってもんですし。 個人的には数値の整数化や少数部分の取り出し方の簡潔な書き方と、少数の使い方がとても参考になりましたです。便利!
1そうだね
プレイ済み
返信[20]
親投稿
おちゃめ ochame_nako
ツララさんへ 個人的には「(初心者であろうと)便利なものは使えば良い派」です。完成させることが何より重要なのでその後でより詳しく知りたい時になったら自分で勉強すれば良いだけと考えています。 とはいえ、SPANIMの書式が面倒なのでできるだけ簡潔に記述したいという中級者の方が使える場面は多いかもしれませんね。
0そうだね
プレイ済み
返信[21]
親投稿
おちゃめ ochame_nako
(続き) プチコン3号の自作命令は引数が省略できないですが、引数が原則整数値の場合はこんな感じで小数部分を使えば擬似的に引数を省略できる命令を作ることが可能になります。 ただし、1.10と1.1は区別できないため1桁の数値限定ですが3bit分のオプション設定が可能です。 なぜ、(P-Q)*10を整数化する場合はシフト演算ではなくROUNDを使っているかというと小数値は丸め誤差があるため10倍した際に期待される値にはならないためです。 例えば ((8.2-8)*10)>>0 は「2」という値になりそうですが、実際は「1」になります。(8.2-8は0.2よりも小さい値になる) これが ((4.2-4)*10)>>0 ならば「2」という値になります。(4.2-4は0.2より大きい値になる)
0そうだね
プレイ済み
返信[22]
親投稿
ツララ LongIceSword
こう言っちゃなんですけど 完成させるのを本題に置くなら「使えない物は使わない」のが最善手なんじゃないです? もしくは「使えない物を使える様にしてくれる」のを待つか。 完成をどのレベルに置くかで変わって来ると思いますけど、SPANIMを使わないと完成出来ないレベルのものを目指してるなら、既にもう初心者じゃあないですよね。 と思ったので個人的にはああいった感想になりました。 というかSPANIMを使いこなせるようになることは、初心者の人にとっては既にある意味作品を完成させるのと同じくらいの達成感あると思うんですけど、それをスポイルしちゃってますよね。
0そうだね
プレイ済み
返信[23]
親投稿
おちゃめ ochame_nako
ツララさんへ 「使えないものは使わない」というのは1つの選択肢であることには間違いないですが、自分が作りたいものを作れる便利なものがあるならばそれを利用するのも選択肢の1つであると私は思います。 例えば、セーブデータをまとめてセーブする方法が分からなければMIKIさんのVFILERを使うのも選択肢としては十分にありでしょう。 ポリゴンを使ったゲームを作りたいならばP3Dエンジンなどのポリゴン表示ライブラリを使えばいいですね。 ポリゴン表示をしてみたいならば1から勉強して自分でライブラリを作れるくらいになれるのがベターには違いないですがそれを初心者にはベターな方法かといったら違うような気がします。
0そうだね
プレイ済み
返信[24]
親投稿
おちゃめ ochame_nako
(続き) そもそも、初心者は○○以上のことを手を出すなというのは個人的にはあまり好きなやり方ではなく初心者であろうと自分がやりたいことをやるべきだと私は思っています。 確かにやろうと思っていることがすべて自力でできるようになってから手を出すのが最も失敗がないのですが、できるかどうかなんてやってみないと分かりません。 個人的には初心者はどんどんいろいろなことに挑戦して欲しいと思います。 その上でできない部分があれば質問してできるようになるとか便利なライブラリ等があればそれを使って実現するというのも選択肢としては有用だと思います。
0そうだね
プレイ済み