Archiverse Internet Archive
投稿のみ 投稿と返信
前のページ(最近)
132 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52154
次のページ(過去)
返信[23]
親投稿
おちゃめ ochame_nako
ベクトルの外積を使った方法はポピュラーな方法の1つです。 これはボールの角度とブロックの角度を求めてその大小を比較するのと同じことですが、ATANで2つの角度を求めるのではなくベクトルA=(Ax,Ay)、ベクトルB=(Bx,By)の外積A×Bは|A||B|sinθ(θはAから見たBの相対角度を示す)となりますが、これはAx*By-Ay*Bxとなります。 つまり、Ax*By-Ay*Bxを求めれば相対角度が分かるということです。 縦横判定はどちら側にボールがあるのかだけ分かれば良いのでAx*By-Ay*Bxの正負だけ分かれば問題ありません。 つまり単純な減算と乗算だけで済むというわけです。 これがATANを使った方法であれば単純に差分を取ればOKということはなく場合分けも必要となるためベクトルの外積を使った相対角度による判定はかなり有用な方法だと思います。
0そうだね
プレイ済み
返信[22]
親投稿
おちゃめ ochame_nako
ブロック崩しにおいてボールがパドルに当たった時の挙動ではなくボールがブロックに当たった時の挙動であるならば特殊なことをしない限りは縦壁ではX方向の移動を反転、横壁ではY方向の移動を反転だけで問題ありません。(わざわざ角度を求める必要はない) 難しいのはブロックの縦側に当たったのか横側に当たったのかの判定だと思います。 当たり判定の方法には角度を元にした判定方法、ベクトルの外積を使った判定方法など様々なものがあります。「正確に求めたい」「簡単に求めたい」「速く求めたい」などの用途によって使い分けると良いかもしれません。
0そうだね
プレイ済み
返信[15]
親投稿
おちゃめ ochame_nako
今回は初心者によくありがちな「SPANIMを使ってアニメーションさせる方法が分からない」とか「SPANIMをちゃんと記述しているはずなのにアニメーションしてくれない(SPANIM実行中に再度SPANIMを実行しているため)」という問題を解消するためにSPANIM2命令を作ってみました。 SPANIM2命令を使えば簡単にアニメ処理ができるため初心者にはオススメしたいところですが、さらに高度な処理を行いたいと思ったら標準のSPANIMを使いこなせるようにすると良いと思います。 もしくは、今回のSPANIM2命令のようにSPANIMを元に自分が使いやすい形にした自作命令を作っても良いかと思います。
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そうだね
プレイ済み
返信[13]
親投稿
おちゃめ ochame_nako
ちなみに斜め方向の場合はキャラパターンを「前後」ではなく「左右」にしたいという場合は5~8行のボタン入力判定の左右の判定の方を前後より後に記述すれば良いです。(簡単に言えば5、6行と7、8行を入れ替えるだけ) なぜこれでOKかというと斜め移動というのは縦と横の2つの条件式を両方満たしているからです。 右上の移動だと右移動の条件式と上移動の条件式の両方を満たすことで表示時のCの値は後者の値となるためです。 このSPANIM2命令内でどんなことをやっているのかを解析したい初心者向けに書いておくとまずは表示スプライトの定義番号を基点としたSPANIM形式のデータ配列の生成、SPANIMの連続呼び出し防止としてアニメ中ならばキャンセル処理、SPVARを使いSPCHR関数で取得された定義番号を元に正しい1コマ目となるように設定などがあります。
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そうだね
プレイ済み
返信[11]
親投稿
おちゃめ ochame_nako
初心者のために分かりにくい部分の解説をしておきます。 BUTTON() AND 15というのは十字ボタン全体の情報を取得しています。「十字ボタンを押しているか否か」を判定したい場合はこの値が「0」か「0以外か」で簡単に分かります。(8方向ではなく4方向移動もこれを使えば簡単にできる) 変数PBには1フレーム前の十字ボタンのボタン情報が入っています。 これによって前回と異なるボタンを押したらキャラパターンを切り替えるという処理を行っています。(Cの値が変化した場合を判定しても同等のことができるけど8方向移動の場合は十字ボタンで処理した方が簡単にできる)
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そうだね
プレイ済み
返信[9]
親投稿
おちゃめ ochame_nako
この判定を十字ボタン4つ分行えば8方向移動しながらアニメーションも簡単にできます。 方向を変えるとキャラのパターンを変える必要がありますが、これはSPANIM2の前にSPCHRで指定すれば良いです。 しかし、SPCHRを使うとアニメが停止するため「違う向きで表示する」という場合のみ実行しなくてはならずIF文を羅列する必要があります。 そこでキャラパターンに変数Cを使ってC=0の時は右向き、C=1の時は前向き、C=2の時は左向き、C=3の時は後ろ向きのようにして少しだけプログラムをコンパクトにしてみます。 この際に気になるのは8方向移動する場合にはキャラの向きが4パターンしかないということですが、それは斜め方向に移動する場合には左右向きか前後向きで代用するしかありません。 今回は斜め移動中は前後向きで代用することにします。
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そうだね
プレイ済み
返信[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そうだね
プレイ済み
返信[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そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
しかし、アニメーション回数は無限ループ(ずっと繰り返し)となっているため現状ではボタンを離してもアニメーションは継続します。 十字ボタンを押してない時(キャラの動きが停止中)はアニメの動きも止めたいというのであれば次の3つの方法があります。 (1)アニメ回数を0(ずっと繰り返し)ではなく1回にする (2)SPSTOPで停止する (3)SPCHRでキャラ定義番号の変更をする
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そうだね
プレイ済み
返信[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そうだね
プレイ済み
返信[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そうだね
プレイ済み
返信[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そうだね
プレイ済み
プレイ日記
おちゃめ ochame_nako
初心者でも簡単にアニメーション表示が可能になるSPANIM2命令を作りました。これを使って初心者向けにアニメーションしながら8方向に移動するためのプログラムの解説をしています。標準のSPANIM命令を使って困った人がいたらぜひ使ってみてください。 公開キー【 RS5E83ZJ 】
20そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
引数に入れた値が数値か文字列かでプログラムを完全に分けるのではなくある程度共用したいという場合には数値でも文字列でも入る変数が必要になる場合があります。 それは私の自作関数INITを使えば数値でも文字列でも入る万能変数を作れるのでそれを活用すれば良いです。 INIT関数は上記のようにDEFの引数は代入した時点で型が決まるというのと配列が参照型であるというのを用いて作った関数です。 INIT関数 https://miiverse.nintendo.net/posts/AYMHAAACAAADVHkoSL6eyA これらを使えば引数が数値だろうと文字列だろうと自由な命令や関数を作ることが可能になります。
0そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
このX2関数のように数値でも文字でも2倍するということは可能なので問題はないですが、数値と文字列では同じ処理が難しい場合もあるでしょう。 その場合には数値を入れたら数値用の処理、文字列を入れたら文字列用の処理をすれば問題ありません。 これには引数が数値か文字列かを判断する必要がありますが、私の自作関数SUFFIXを使えば簡単に実数型か整数型か文字列型かが判断可能になります。(これは私が見つけた文字列と数値の比較演算は3を返すという裏技を有効活用している) SUFFIX関数 https://miiverse.nintendo.net/posts/AYMHAAADAAB2V0fSfxRUkA
0そうだね
プレイ済み