0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

スプライトをマウスポインターに追従させる時の向きの制御

Last updated at Posted at 2017-08-11

スプライトをマウスポインターに追従させたい

これを実装しようとするときに、まず目に入ってくるブロックは

  • マウスのポインターへ向ける
  • マウスのポインターへ行く

の2つでしょう。
20170811_1.png

これを無限ループの中に入れておけば、
常にスプライトはマウスポインターについていき、しかも向きも変わる。
ポインターを右に動かせば、右を向きながらついてくるし、
ポインターを左に動かせば、左を向きながらついてくる…と思うのだが、そうはいかない。

問題

20170811_2.png

下記リンク先で「フラグ」クリック後、「1」をクリックしてみてください。
https://scratch.mit.edu/projects/158213042/
このように、右向きがデフォルトのスプライトの場合は、
ポインターが左に動いたとき、
移動中は左を向いてくれますが、移動が終わると右向きに戻ってしまいます。

左向きがデフォルトのスプライトの場合は逆になり、
ポインターが右に動いたときに、移動完了後に左を向いてしまいます。

原因

原因は、「マウスのポインターへ向ける」の命令の仕様です。
この命令は、スプライトとポインターの座標が一致した場合、
デフォルトの向きを向くようになっています。

20170811_4.png

こちらのスケッチで、その仕様を確認できます。
https://scratch.mit.edu/projects/170996249/

この仕様により、先の無限ループだと、

  1. スプライトとポインターが重なっていない時は、そちらにスプライトが移動する
  2. その時に、スプライトの向きはポインターの方を向く
  3. スプライトとポインターが重なると、スプライトはそれ以上移動はしない
  4. その時は、「マウスのポインターへ向ける」命令の仕様により、スプライトはデフォルトの向きになる

となるわけです。

解決策

解決策は色々あると思います。
最初に紹介したスケッチでは、2番~4番のアルゴリズムはすべて問題なく動作してくれます。
その中でも、最も単純なのは4番のアルゴリズムではないでしょうか。

20170811_3.png

今回は、回転方向が左右のみなので、
スプライトとポインターが重なる条件を書くべきところには、
x座標が一致することで代えてあります。

もし、回転方向が自由に回転するのであれば、
条件式は、x座標が不一致、かつ、y座標も不一致
とすればよいでしょう。
これによって、スプライトとポインターが重なった時は、スプライトの向きは操作されず、
直前の向きが維持されるようになります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?