Murayama blog.

プログラミングと、その次の話

マウスの位置を追いかけるやつ


今日は勢いに乗ってもう1本やってみる。


これもスピードと角度のサンプルです。


マウスを追いかけてくるアプリです。
結果はこちら。どう面白い?


そんでコード。

package
{
  import flash.display.Sprite;
  import flash.events.Event;
  
  public class FollowMouse extends Sprite
  {
    private var arrow:Arrow;
    private var speed:Number = 3;
    
    public function FollowMouse()
    {
      init();
    }
    
    private function init():void{
      arrow = new Arrow();
      addChild(arrow);
      addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }
 
    private function onEnterFrame(evt:Event):void
    {
      // 横の距離、縦の距離
      var dx:Number = mouseX - arrow.x;
      var dy:Number = mouseY - arrow.y;
      
      // 縦、横の距離から角度(ラジアン)を算出
      var radians:Number = Math.atan2(dy, dx);
      // 角度に変換
      arrow.rotation = radians * 180 / Math.PI;
      
      // 角度がわかれば縦、横のスピードがわかる
      var vx:Number = Math.cos(radians) * speed;
      var vy:Number = Math.sin(radians) * speed;
      
      arrow.x += vx;
      arrow.y += vy;
    }
  }
}
 
import flash.display.Sprite;
class Arrow extends Sprite
{
  public function Arrow()
  {
    init();      
  }
  
  public function init():void{
    graphics.lineStyle(1, 0, 1)
    graphics.beginFill(0xFF0000);
    graphics.moveTo(-50, -25);
    graphics.lineTo(0, -25);
    graphics.lineTo(0, -50);
    graphics.lineTo(50, 0);
    graphics.lineTo(0, 50);
    graphics.lineTo(0, 25);
    graphics.lineTo(-50, 25);
    graphics.lineTo(-50, -25);
    graphics.endFill();
  }
}


肝なのは、

    private function onEnterFrame(evt:Event):void
    {
      // 横の距離、縦の距離
      var dx:Number = mouseX - arrow.x;
      var dy:Number = mouseY - arrow.y;
      
      // 縦、横の距離から角度(ラジアン)を算出
      var radians:Number = Math.atan2(dy, dx);
      // 角度に変換
      arrow.rotation = radians * 180 / Math.PI;
      
      // 角度がわかれば縦、横のスピードがわかる
      var vx:Number = Math.cos(radians) * speed;
      var vy:Number = Math.sin(radians) * speed;
      
      arrow.x += vx;
      arrow.y += vy;
    }


コメントに書いてあるとおり、
縦の長さ、横の長さがわかればMath.atan2で角度を求めることができる。
角度がわかれば、Math.cosで横の成分、Math.sinで縦の成分がわかる、と。


以上。