トピック
受付中

SPROTの回転軸について

SPROTの回転軸って変えられないんですか? また、変えられないならどこが軸になるんですか? 回答お願いしますm(_ _)m
2そうだね
プレイ済み
返信[1]
親投稿
だにえる haru2016nen
SPHOME参照。 SPDEFで定義するときにも設定出来るけど。
1そうだね
プレイ済み
返信[2]
親投稿
SPHOMEという命令で変えることが出来ます。
0そうだね
プレイ済み
返信[3]
親投稿
回答ありがとうございます! 回答の通りやってみたところ、調整方法がよく分かりません。 相対度数とヘルプにあったのですが、相対度数が分からず苦戦しています。 画像の通りイチゴを回転させてみたのですが、イチゴの中心に合わせられません… 相対度数って何ですか?また、どうすれば調整できますか?
0そうだね
プレイ済み
返信[4]
親投稿
相対←→絶対 簡単に言うと何かを基準にした座標や角度のことです。 SPHOMEは左上が基準で、イチゴは16*16なので、 SPHOME 0,8,8 ぐらいで真ん中になると思います。
0そうだね
プレイ済み
返信[5]
親投稿
回答ありがとうございます! 成る程、基準からの距離ってことですね!了解です♭グッ また、SPHOME 1,8,8でピッタリでした!ありがとうございます! タッチ操作で質問があるのですが、質問してもいいですか?
0そうだね
プレイ済み
返信[6]
親投稿
どうぞ。
0そうだね
プレイ済み
返信[7]
親投稿
ありがとうございます! では遠慮なく。 画像にイチゴのSPがありますよね? このイチゴを、下画面でタッチした方向に角度を変えるにはどうしたらいいんでしょうか?
0そうだね
プレイ済み
返信[8]
親投稿
だにえる haru2016nen
TOUCH OUT T,X,Y IF T THEN SPROT 0,ATAN(Y,X) ENDIF こんな感じかな。(未検証)
0そうだね
プレイ済み
返信[9]
親投稿
spofs 1 out ix,iy touch out tt,tx,ty if tt then sprot 1,atan(tx-ix,ty-iy) endif だと思います
0そうだね
プレイ済み
返信[10]
親投稿
回答ありがとうございます! どちらも試したのですが上手くいきません… デバッグした後のプログラム画像ってありますか?あれば参考にさせて頂きたいのですが…
0そうだね
プレイ済み
返信[11]
親投稿
こんな感じです。
0そうだね
プレイ済み
返信[12]
親投稿
say sayer.exe
r=atan(y-中心,x-中心) sprot n,deg(r) こうかな?
0そうだね
プレイ済み
返信[13]
親投稿
回答ありがとうございます! こんな形にまとまりました!(画像参照) 教えてくれた方々ありがとうございました! また分からないことがあったらお願いしますm(_ _)m
0そうだね
プレイ済み
返信[14]
親投稿
画像つけ忘れ
0そうだね
プレイ済み
返信[15]
親投稿
おちゃめ ochame_nako
こういちさんの方法で問題はないのですが特殊なやり方(プログラムを短くする手法を取っている)であるため普通のやり方も書いておきます。 まず、タッチした場所から角度を割り出すにはATAN(Y,X)とします。 この場合のX,Yは基準点からの差分となるため回転の基準点の座標が160,120ならばATAN(120-Y,160-X)となります。この角度がどの部分の角度かは図の通りX軸の正方向を基準に時計回りの角度となります。 しかし、スプライトの回転の基準点はY軸の負の方向です。つまり、90度の違いがあるわけです。そのため求めた角度に90度足したものがSPROTの指定角度となります。 SPROT 0,DEG(ATAN(120-Y,160-X))+90というわけです。
2そうだね
プレイ済み
返信[16]
親投稿
補足ありがとうございます! 補足内で気になったこと ・SPの回転軸のYの負の方向ってどっち? ・+90はDEGに-を付けるだけでもいいの? 答えられたら回答お願いしますm(_ _)m
0そうだね
プレイ済み
返信[17]
親投稿
あと気になったのは、if命令で IF T THEN のように変数名を書いていますが、条件は何になるんですか?
0そうだね
プレイ済み
返信[18]
親投稿
おちゃめ ochame_nako
軸の正負というのは分かりにくい言い方だったのでもっと分かりやすい言い方にすれば ATANは時計の3時方向を起点にして時計回りの角度、SPROTは時計の12時の方向を起点にして時計回りの角度となります。 ATANで角度を求める際にはATAN(Y,X)となりますが、これをATAN(X,Y)としてX軸とY軸を入れ替えた場合にはATANの角度計算の起点が6時方向となります。2つの時計を用意して6時と3時が重なるようにするには1つの時計を裏返す必要があります。つまり、X軸とY軸を入れ替えるというのは起点が6時方向になるだけではなく求まる角度が反時計回りの角度になるということです。
1そうだね
プレイ済み
返信[19]
親投稿
おちゃめ ochame_nako
SPROT  12時起点 時計回り XとYを入れ替えたATAN  6時起点 反時計回り 回転の向きが逆なのは角度の頭にマイナスを付ければ良いですが、それだけではなく12時起点と6時起点の整合性を取る必要があります。 これには180度足せば良いのですが、そんなことをしなくてもタッチ座標の差分を取る際に基準点座標とタッチ点座標を入れ替えてやれば良いのです。(本来はTX-IXとTY-IYなのだけどIX-TXとIY-TYをすることで180度回転と同じになっている) これによって、何も追加せずに180度回転したのと同じ効果を得られます。
0そうだね
プレイ済み
返信[20]
親投稿
おちゃめ ochame_nako
IF T THEN についてですが、IFというのは条件式がtrue(成立)かfalse(不成立)かでTHEN以下を実行するか否かが決まるというのはご存じだと思います。 しかし、プチコン3号においてはtrueというのは0以外の値、falseというのは0を示します。 要するにIF 3 THEN ~のように0以外の値を記述するとTHEN以下を実行し、IF 0 THEN ~のように0を記述するとTHEN以下は実行しないということです。
0そうだね
プレイ済み
返信[21]
親投稿
おちゃめ ochame_nako
このことを踏まえてIF T THENを見てみると「Tの値が0の時はTHEN以下を実行せずTの値が0でない時は実行する」ということが分かります。 今回の場合だと変数Tはタッチ時間を示しており負数になることはないため「画面をタッチしているならばTHEN以下を実行する」という意味のIF文になっています。 これはIF T>0 THEN と記述したのと同じ意味になるのですが、「T>0」の部分の値(論理式の値)がプチコン3号では条件を満たす時には1になり、満たさない時には0になっているのです。 IF文がどんな時にTHEN以下を実行するのかを知っておくと色々な判定をするときに役立つと思います。
0そうだね
プレイ済み
返信[22]
親投稿
1つめ プチコンの座標の座標で0の方向、つまりy軸の負の方向が基準というのは時計で言うところの12時のとき0度ということです。 2つめ 正確には「XとYを入れ替えてーをつける」です。 ATAN()はXとYを入れ替えると12時の角度が0度になりますが、反時計回りになります。なので、ーを付けて、逆に回転するようにしました。 3つめ IF文が判定しているのは、「IF直後の数値が0かどうか」です。 IF直後の数値が0でないならTHENの後の文を実行してくれます。 つまりIF T THEN~は、「Tが0でないならTHENの後の文を実行する。」という意味になります。 ちなみに今まで使っていた「A==B」は、「AとBが等しいなら1を返す」という意味です。 試しに PRINT 1==1 とか打ってみると1と表示されるはずです。
0そうだね
プレイ済み
返信[23]
親投稿
回答ありがとうございます! とりあえずif文の条件は分かりました! しかし、まだ回転方法は理解しきれてないので、塾から帰ってきたらじっくり読ませて頂きます。
0そうだね
プレイ済み
返信[24]
親投稿
塾が忙しかったので返信遅れましたorz +180度の代わりに~のところがよく分からなかったですね… 他は多分理解出来てます!
0そうだね
プレイ済み
返信[25]
親投稿
実際に -DEG(ATAN(IX-TX,IY-TY)) の部分を -DEG(ATAN(TX-IX,TY-IY)) に変えて実行してみたり XとYを入れ換えて実行してみたりすれば言いたいことは分かると思います。(雑)
0そうだね
プレイ済み
返信[26]
親投稿
おちゃめ ochame_nako
ATAN(TY-120,TX-160)をATAN(120-TY,160-TX)のように引く順番を入れ替えるように記述した場合に180度プラスしたような効果をなぜ得られるかというと下図のようになっているためです。 ただし、差分とATANという2つの要素が絡むためもしかすると理解するのが難しいかもしれません。 その場合は単純な数直線で考えてみたらよいと思います。 例えば7-3=4というのは基準点3に対して+4の位置であり、3-7=-4というのは基準点7に対して-4の位置であることが分かります。 数字の大きい方が東、小さい方が西と考えると起点から終点に向かう場合7-3(座標3から座標7に移動)では東に4km進み、3-7(座標7から座標3に移動)では東に-4km(=西に4km)進むということで起点と終点を入れ替えることで進む向きが反対方向になるのが分かるでしょう。
0そうだね
プレイ済み
返信[27]
親投稿
数学の座標を基準にしてのお話。(書いたら長くなった) ATANは数学関数なので、上が+Y、下が-Y、右が+X、左が-Xの座標。 数学の角度は時計の3時方向から12時方向に向かって増えていく(反時計回りで、値はラジアン) プチコンの座標は上が-Y、下が+Y、右が+X、左が-Xの座標。 SPROTでの角度は時計の12時方向から3時に向かって増えていく(時計回りで、値は度) プチコンでラジアンから度に変換するのは DEG 関数 数学の座標とプチコンの座標でY軸が上と下でプラスとマイナスが逆なのと、 数学の角度とSPROTの角度の向きが逆なので、角度や座標にマイナスが入ったりしてるので、ちょっとややこしいのです。 ※おちゃめさんのは全てプチコン座標で書いてあるので数学とは上下が逆になってます
0そうだね
プレイ済み
返信[28]
親投稿
プチコンの座標は Yの向きが逆なので、 プチコンの 6時の位置は数学関数では 12時として扱われて、 プチコンの 5時の位置は数学関数では 1時として扱われます ATANは数学座標を渡すなら 3時から12時に向かって角度の値は反時計回りで増えるけど プチコン座標を渡すなら 3時から6時に向かって角度の値は時計回りで増えます ※プチコンの4時は数学では2時なので30度と返ります。プチコンの6時は数学では12時なので90度と返ります。 SPROTも、ATANにプチコン座標を渡したのも、時計回りになって、 ATANが 3時基準、SPROTが 12時基準なので、ATANの結果に(ラジアンなので度に変換して)90度を足した値を SPROTに渡せばそのとおりになるのです。 ※おちゃめさんの画像付き説明のところ
0そうだね
プレイ済み
返信[29]
親投稿
中学高校数学でも座標でXとYを入れ替えるってほとんどしないのでわかりづらいけど、 XとYを入れ替えた場合、3時の位置から12時の位置に向かって動く場合、12時から3時に動くようになります。 3時の位置から6時まで動く場合、12時から 9時まで動きます。 (2時が X=0.8, Y=0.5としたら X=0.5, Y=0.8は 1時、 11時が X=-0.5, Y=0,8としたら X=0.8, Y=-0.5 は4時) Xをマイナスすると Y軸で反転、 Yをマイナスにすると X軸で反転、 XとYを入れ替えると、グラフX=Y の軸(数学では右上斜めの軸)で反転した位置になります プチコンの座標は Yの向きが逆で、XとYを入れ替えた場合、グラフX=Yの軸(右下斜め)で反転します プチコンの 6時の位置は、XY反転で 3時として扱われて、 プチコンの 5時の位置は、XY反転で 4時として扱われます
0そうだね
プレイ済み
返信[30]
親投稿
ATANにプチコン座標を渡すと3時基準で時計回りに角度が増えるけど、 プチコン座標のXとYを入れ替えてATANに渡すと、6時基準で反時計回りに角度が増えます 角度にマイナスを付ければ反時計回りが時計回りとして扱えるので、 XY入れ替えたATANの角度の値にマイナスを付ければ 6時基準で時計回りになります タッチした位置をATANに渡すと3時基準で時計回りに角度が増えて タッチした位置をXY入れ替えてATANに渡した角度をマイナス扱いにすると、6時基準で時計回りに角度が増えます SPROTは 12時基準で時計回りの角度指定で、 XY入れ替えたATANの角度のマイナスの値は 6時基準で時計回りに角度の値が増える SPROTの12時基準と180度の差になるので、 XY入れ替えたATANの値(をラジアンから度に変換した値)に 180度を加算した値をSPROTに渡すと、期待通り動きます。
0そうだね
プレイ済み
返信[31]
親投稿
角度というのは、中心があって、何時を基準として時計回り・反時計回りにどれだけ進んだかの値です。 数学では、時計の真ん中を中心として、3時の位置(中心から右方向)を基準として反時計回りに角度を数えます。 時計の真ん中を中心として、中心から右方向を基準として、1時の角度は、中心の右方向(3時)から +60度です。 1時の場所を中心として、1時から右方向を基準として、時計の真ん中の角度は、1時の右方向から -120度です (180度先の7時の角度を求めるのと同じ) 中心と求める位置と基準があって角度が求まりますが、中心と求める位置の場所を逆にするとちょうど180度の差があります。 画面を中心にタッチ位置の角度を求めていましたが、 タッチ位置を中心に画面中心の角度を求めると180度の差があるので、180度の計算をしなくてよいというのが、 おちゃめさんの言っている180度のしくみです。
0そうだね
プレイ済み
返信[32]
親投稿
いちおう、数学の上が+Yの座標系が先にあって、プチコン(やコンピュータ系)の下が+Yの座標系が後になって作られているので、 座標系を理解するには本当は先に中学の数学で習うグラフの知識があった方が良いです。 (おちゃめさんの図もちゃんとY軸は下向きに矢印が向いているので、下方向にYが増えるという図になってます) SPROTが12時基点時計回りだったり、XとY入れ替えるとこんな動きするので短縮すればプチコンではこう書けたりとか、 かなりプチコン独特や、Y座標が下向きのコンピュータ系の書き方がいろいろあって悩むところなのです。 そして、「タッチした方向に回転させる」という簡単そうに見えることでも、ちゃんと理解しようとするとこれだけの細かい知識や考え方が必要だったりするので、 いろんなプログラムをできるようになるのは、ほんとうにコツコツと細かい事を知って行く必要があるのです。
0そうだね
プレイ済み
返信[33]
親投稿
回答ありがとうございます! あまりの長文に驚きましたw またじっくり読ませて頂きます。
0そうだね
プレイ済み
返信[34]
親投稿
返信遅れてすみません! リアルが忙しくて中々じっくり読めなかったのですが、明日読めると思います。
0そうだね
プレイ済み