アークタンジェントの罠!モバイル対応したスティックで向きを算出する方法(自由回転)

アークタンジェントの罠!モバイル対応したスティックで向きを算出する方法(自由回転)
ok-scratch
モバイル対応したスティックで、自由回転するスプライトの向きを算出したいときは、atan(アークタンジェント)という関数を使うと便利だよ。 そしてatanの罠ってタイトルだが、atanは悪くない……悪いのは数学オンチなワイやでw
スターター
プロジェクト
なし
サンプル
なし
難しさ
タグ

任意)自分の作業中のスクラッチ作品URLを記録しておこう!再開するときに便利だよ。

LOADING...

※ この記録は今使ってるPCに保存されます。別のPCで作業するときは表示されません。

スクラッチに挑戦している皆さん、どうも!スクラッチコーチです。

スーパーアルティメットにマニアックなチュートリアルへようこそw

こんなチュートリアル読む人おる?という気持ちもあるけど、一応書いておこうかなって思ってる。もしここにたどり着いた人がいるなら、ウェルカム、君のために書いたと言っても過言ではないぜ。

で、結論から言うとatanアークタンジェントという関数を使うと便利。

これね。アークタンジェントって中二病キャラの必殺技みたいな名前で草。

ok-scratch ok-scratch

高校1年か2年で習うらしい。僕は数学やらなくていい高校だったから知らないw
三角関数のsinとcosは習った記憶あるけど、当時は興味ゼロだったw tanに関しては当時の数学の先生が「君らは(英語学科だから)覚えんでもええよ」ってwだからマジでatanとか習ってない……。

ちなみにPythonとかだともっと便利なatan2という関数があって、XとYから角度を求めるのがカンタンなんだけど、スクラッチにはatan2はないのでatanを使って強引に角度を算出する方法を紹介していくぜ。

でも前述したように僕は数学あんまだから、この方法がベストではないかも知れない。でも出来たから紹介する!プログラミング業界では「動くのは正義」という考え方があって、方法論が違ってても正しく動くならとりあえずOKというのは決して悪くないスタンスなのだ!

今回ももちろんモバイル対応スティックを使っていくよ。

ok-scratch ok-scratch

モバイル対応のチュートリアルはもう見たかな?もし自分のプロジェクトにスティックがないという人は、チュートリアルで一緒に作るか、こちらのプロジェクトからスティックをバックパックしよう。

今回の目的「スティックに合わせて、自由回転するプレイヤーの向きを変える」

回転が左右だけなら、スティックXがプラスかマイナスかで向きを変えればいいだけなんだけど、自由回転する場合はいっきに複雑になる。そこをatanを使って強引に算出していく。

まずは実現する動きを動画でチェックしてみてね↓

これを作るよ。今回はこの動きだけ作るからブロック数は少なめ!

メインループを作る

じゃあ緑の旗から始めようか。

スクラッチキャットの回転方法を「自由に回転」にしておこう。

メインループを設置しよう。

この中で向きの計算をしていくよ。

準備

スティックの場所に合わせて向きを算出する処理、今回の目的部分だね!

バックパックからスティックを導入して、あとは分かりやすくブロック定義と変数も作るよ。そうすれば別の作品にも使いやすいだろうし。

スティックを導入する

バックパックからスティックをドラッグアンドドロップしよう。

スティックを開く必要はないよ。スクラッチキャットを開いておいてね。

ブロック定義を作る

スクラッチキャットにブロック定義「_向きを算出する」を作ろう。再描画せずに実行するよ。パッと見で分かるように接頭語にアンダーバーを付けておくね。

ok-scratch ok-scratch

接頭語で変数やブロック定義などの種類をパッと見で分かるようにする方法は、コーディング規約としてまとめてあるよ。興味がある人はチェックしてね。

変数を作る

変数「向き」を作るよ。

atanを使ってみる

では練習でアークタンジェントを使ってみよう。一般的にはatan(Y / X)のように、atanにはY÷Xを与えるっぽい。

Xがプラスのとき

いくつかサンプルを見ながらatanがどういう解をくれるのかチェックしていこうか。

右上を向きたい

仮にYが1でXも1の場合を考えてみよう。

スティックの位置が↓こんなかんじになってる状態ね。

スティックが右上にあるときは、スプライトも右上を向いてくれたらバッチリだよね。

じゃあatanでYが1でXが1の状態を作ってみよう!

おお!見事に45っていう数値が出てきたね。

右を向きたい

では真横に動くようなケースではどうだろうか。

Yが0で、Xが1のときだね。

スティックは↓こんな感じ。

スプライトの向きは90になってほしい。

atanに入れてみよう。

あれ?違うね……。うまくいかない。

右下を向きたい

次はYが-1で、Xが1のときはどうかな。

スティックは↓こんな状態だね。

スプライトの向きは135になってほしい。

atanで作ってみると……。

あらら、これも違うみたいだね。

上を向きたい

Y = 1、X = 0。だからスティックは↓こう。

ほしいのは↓みたいに0°。

atanの解は……。

90°になってしまった……いったいどうなってるんだ!?

ズレに法則性がある

ズレてる、atan使えねぇ……そう諦める前にズレ方に注目してほしい。

ほしい角度atanの解
右上:◯4545
右:✗900
右下:✗135-45
上:✗090

なーんか法則性がある気がする。ためしに色々な数字を掛け合わせてみたところ「90 - atanの解」をするとズバッと欲しい角度が取れた。

ほしい角度atanの解90 - antaの解
右上:◯454590 - 45 = 45
右:◯90090 - 0 = 90
右下:◯135-4590 - (-45) = 135
上:◯09090 - 90 = 0

くっ、よく考えたら当たり前だったんだけど、一応図解しておくぜ!

合ってたケース(右上)

たまたま合っててぬか喜びした。

計算結果が合わないケース(上)

右上以外ダメじゃん、って気づいた。

よく考えたらそもそも90°ズレてた

試行錯誤して0°のケースを自分なりに図にしてみたら、そもそもatanが算出してくれる角度って、スクラッチの向きと90°ズレてるじゃんって気づきました、本当にありがとうございました。

↓のピンクの先の部分。90°ズレてるよね、うん。

だから90からatanの値をマイナスすると上手いこと計算が合ってたというカラクリでした。

ok-scratch ok-scratch

数学オンチ……この解答ももっとスマートなやり方があるのかもしれない……あるならぜひリミックスして教えていただきたいです。

Xがマイナスのとき

さらに数学オンチな僕を混乱させてくれたのは、Xがマイナスのときな!

左上を向きたい

たとえばY = 1でX = -1のとき。

ほしい角度は-45°。

atanの解は……。

合ってるんかい!でも90からマイナスすることにしたから、90 - (-45) = 135になってしまう!く……。

scratch-cat scratch-cat

まぁここは焦らず条件ブロックを使いましょうぜ。Xがマイナスのときは、90からマイナスしなければいいではありませぬか?

ok-scratch ok-scratch

うむ、そうだな。しかし、念のため左とかもatanしてみようぞ。

左を向きたい

Y = 0、X = -1のときだね。

ほしい角度は-90°!

atanの解は……。

ゼロぉ!!!なんだそれぇ!!!

atanは負の象限を返してくれない

調べたよ、ウィキペディアで。そしたらatanは負の象限は返さないって感じのことが書いてあった。

ok-scratch ok-scratch

負の象限とは、ここではつまりXがマイナスの時って解釈でOK。

よく分からないから更にググったら、atanで無理やり負の象限を出したいときは180°マイナスしたらいいと書いてあった。

いや、atanの解は0でほしいのは-90だから、シンプルに-180したらダメじゃん……っと思って気づいた。

ok-scratch ok-scratch

せや、スクラッチの向きは90°ズレとるんやった……

そこでXがプラスのときと同じようにいったん90 - atanの解をしてから、更にマイナス180してみたところ。

取れたぁ!!-90獲ったどぉ!!

久しぶりに数学的なモヤモヤで脳みそが千切れそうになったぜ……やるな、スクラッチ!

コーディングしていく

よし、atanの基本的な解答とスクラッチのクセを組み合わせるロジックは見えた。あとはコーディングしていくだけだ!イケる気がする!

基本的なatan演算

まずは基本形を作ろう。

YをXで割るという順番だけ注意しよう。

90から引く

スクラッチの向きは上が0°であるのに対して、atanでは右が0°という想定なので、このズレを補正するべく90からatanの解答を引くようにする。

向きにセットする

変数「向き」にセットしよう!

Xがマイナスのときに反転させる

さらにatanでは負の象限を返してくれないので、Xがマイナスなら強引にマイナス180°しよう。

条件分岐をおいて……

スティックXがマイナスなら……

マイナス180しよう!

向きを割り当てて完成!

ではメインループに戻って、このブロック定義を呼び出して向きを変えてみよう。

変数「向き」を向きに割り当てる……書くと意味不明w

動けぇ!

OK!

分かりづらい解説によく付いてきてくれた!ありがとう!これでグリグリ回る仕組みが整ったね!

実はスプラトゥーンをモバイル対応してみようとしてた

そう、この回転をやろうと思ったきっかけはFunnyAnimatorJimTVさんのスプラトゥーンをリミックスしたいなっていう動機だったんだよ。

グリグリ回るし、歩くのもできたんだけど、iPadでテストしようとしたらスプラトゥーンのプロジェクトが大きすぎてiPadでロードできなかったw

モバイル対応しても意味ないじゃんって気づいて、せっかくだからこの自由回転のロジックだけでも世に出してあげたいと思って書き上げた記事でした!読んでくれてありがとう♪

このスクラッチゲームの作り方への質問もOK このスクラッチゲームの作り方への質問もOK
このスクラッチゲームの作り方に挑戦していて分からないことが発生したら質問してみてね。気づいたタイミングで回答するよ。 質問は 僕のスクラッチのプロフィール で受け付けているよ。

質問テンプレート(素早く3回クリックすると全選択できるのでコピーしよう)

・◯◯ ... 記事のどこまで実装が終わったのかを記入しよう。
・□□ ... どんな問題が起きているのか、どういうときに起きるのか、具体的に書こう。
・共有済みURL ... たまに共有してない作品URLを書いてる人がいるけど、共有しないとこちらから確認できないからよろしくね。

スクラッチャーからのコメント

Hikiniku14 Hikiniku14 2025-01-05
質問失礼します。 https://scratch.coach/lesson/calc-angle-with-atan/ これに挑戦していたのですが、ok-scratchさんのやり方だとatanを使っていますが、僕はスティックの方でクローンされた白い丸の中で座標をずらした後にスティックの中心に向けてから180度回転させてその向きを猫の向きにするというやり方でやったらうまくいきました。これでもいいのかなと疑問に思いましたので質問させていただきました。↓そのプログラム https://scratch.mit.edu/projects/1116533776
ok-scratch ok-scratch 2025-01-05
@Hikiniku14 おぉ、よりシンプルに実装できた感じですか。素晴らしい〜!atanとか使わないほうがハードル低いから、そちらのほうが良いかもですね
Harutomaker Harutomaker 2024-09-03
こんにちは!サイト見てます!「アークタンジェントの罠!モバイル対応したスティックで向きを算出する方法(自由回転)」この記事面白かったです!
ok-scratch ok-scratch 2024-09-03
@Harutomaker その声めちゃ嬉しいです。どの記事が役に立ったのか、すごく知りたいので。ありがとうーーーー(^o^)
Harutomaker Harutomaker 2024-09-03
@ok-scratch こちらもアイデアをもらえたのでありがとう!
maple_tayama maple_tayama 2024-05-04
モバイルスティックチュートリアル4を見たらatan に勝利しました。嬉しすぎて逝きそう。チュートリアルに感謝♪───O(≧∇≦)O────♪
ok-scratch ok-scratch 2024-05-04
@maple_tayama 分かる!!モバイルチュートリアルの4は個人的にもすごい奮闘記って感じで苦労した。その分atanをとっちめた時は嬉しかった。atan克服おめでとう!グルグル回転していこう!
maple_tayama maple_tayama 2024-05-04
@ok-scratch 実はスティックではなく弾幕ゲームの自機狙い弾に利用しました。
ok-scratch ok-scratch 2024-05-04
@maple_tayama 応用!?むしろ素晴らしいです。どんどん別の使い方しちゃってください。
maple_tayama maple_tayama 2024-05-04
@ok-scratch で今オーバーヒート中です。
ok-scratch ok-scratch 2024-05-05
@maple_tayama はは、休憩してね(^_^;)
maple_tayama maple_tayama 2024-05-05
@ok-scratch _(:3 」∠)_できた…
ok-scratch ok-scratch 2024-05-06
@maple_tayama 整ったら(もしよければ)見せてね( ´∀`)bグッ!
maple_tayama maple_tayama 2024-05-06
@ok-scratch これの5番目の弾幕です。xとyの指定もできました。https://scratch.mit.edu/projects/1014845383/
maple_tayama maple_tayama 2024-05-06
@maple_tayama https://scratch.mit.edu/projects/1014845383
ok-scratch ok-scratch 2024-05-07
@maple_tayama スムーズな弾幕ゲームになりましたね!ジョイスティックでも楽しめた。ナイス〜( ´∀`)bグッ!
maple_tayama maple_tayama 2024-05-07
@ok-scratch 車運転ゲームワクワク(唐突)
ok-scratch ok-scratch 2024-05-08
@maple_tayama タクシーだから左ドアをお客さんに向けて停めないとクリアできない鬼仕様です……。
ok-scratch ok-scratch 2024-05-08
@ok-scratch ちなみに動画とテキスト。実験的にテキストはダイジェストです!
maple_tayama maple_tayama 2024-05-08
@ok-scratch おおっ楽しみです
MORIHARUPON MORIHARUPON 2023-12-13
https://scratch.mit.edu/projects/934133456/ これなんですけど、これをモバイル化したいです。ですが、キャラクター(車)自体が動いてるわけじゃなくて背景が動いてるんですよ。そういう時ってどうやって動かせばいいんでしょうか
ok-scratch ok-scratch 2023-12-14
@MORIHARUPON お、以前オンライン化に挑戦していた作品ですよね。モバイルでも変数xとyを変えるだけでいいのではないかと予想してます。ジョイスティックを実装して、ジョイスティックの動きに合わせて変数xとyの値を変えてあげればスプライト「Track」が機能するような気がします。モバイルのジョイスティックはこちらを参考に作ってみてください。 https://scratch.coach/lesson/mobile-friendly-with-multi-tap/
MORIHARUPON MORIHARUPON 2023-12-14
@ok-scratch やってみたんですが、Trackが少しだけチョイチョイって動くだけで走れません。他にも車の角度?が変わらなかったりでどうせればいいでしょうか。何回もすみません
MORIHARUPON MORIHARUPON 2023-12-14
@ok-scratch すいませんURL間違えてました。ごめんなさい。 https://scratch.mit.edu/projects/939498667/ こっちです
MORIHARUPON MORIHARUPON 2023-12-14
@ok-scratch 何回も時間をまたいでの質問申し訳ないですが、しばらくいろんな方法試してたら、TrackのXとYの値が大きすぎてチョイチョイしか動いてないようでした。ヒント頂ければ嬉しいです
ok-scratch ok-scratch 2023-12-14
@MORIHARUPON いまスマホで強引にデバッグしたので情報量少ないのですが、スプライト「Car」にあるブロック定義「Key」っていうのをいじったら車が動いたり回転しました。条件式が上キーまたはwキーってなってる部分を、暫定的に「マウスを押したら」にしたら動いたので、変えるべきは変数xvとyvかもですね。このあたりにスティックYとか使っていけば動くは動くかなと。ただ、スティックの角度に合わせて車の角度も変えたいところですよね、、、きっと。ひょっとしたらこの定義に右キーおしたら、って部分もあるからここにスティックXの値を使えば角度も操作できるかも。もしダメなら、たしか遊び半分だけど似たようなことをトライしたことあって、最終手段として回転にはこのチュートリアルが参考になるかもです。 https://scratch.coach/lesson/calc-angle-with-atan/
MORIHARUPON MORIHARUPON 2023-12-15
@ok-scratch できました!ありがとうございます!
MORIHARUPON MORIHARUPON 2023-12-15
@ok-scratch Atan 使わないで(むずすぎて)言われたことなんとなぁくやってたらすごいのできました
MORIHARUPON MORIHARUPON 2023-12-15
@ok-scratch 全く関係ないんですけど、一番上に行くボタンクリスマス仕様になってました。
ok-scratch ok-scratch 2023-12-15
@MORIHARUPON おおナイスです!難しいからすごいわけじゃないので、方法論は何でもOK!できたことが最高です! ちょっと帽子かぶせてみました(笑)スクラッチキャット好き。
MORIHARUPON MORIHARUPON 2023-12-15
@ok-scratch ここからですね!
MORIHARUPON MORIHARUPON 2023-12-16
@ok-scratch ジョイスティックをチョット改造してスティックボタンが押されたら(変数)スティックボタンが1になるようにしました。でも、何故か加速しません。どうすればいいでしょうか? スプライトCarの右下の方なんですが…
MORIHARUPON MORIHARUPON 2023-12-16
@MORIHARUPON そういえば、オンライン化の方は裏でどんどん進めてます。仮のプロジェクトで出来たらまるまる本物プロジェクトに移すって感じです
MORIHARUPON MORIHARUPON 2023-12-16
@ok-scratch 一番大事なことです。著作権だいじょぶ何でしょうか
ok-scratch ok-scratch 2023-12-17
@MORIHARUPON 「スペースが押されたではない」が絶対にTRUEになってしまうからだと思います! 著作権はどれについてでしょうか。このレース作品のことですか?
MORIHARUPON MORIHARUPON 2023-12-17
@ok-scratch はい。著作権の方はこのゲームのことです。元があるので。元は詳しく言えませんが。ありがとうございます
ブクマよろしくお願いします! ブクマよろしくお願いします!
どんどん追記・更新していくので、ブックマークやシェアよろしくお願いします!

スクラッチゲーム攻略

スクラッチゲーム

    • 厳選されたスクラッチ人気作品リストがレビュー付きで楽しめます
      趣味に関するスクラッチ作品例
      勉強になるスクラッチ作品