2011-06-28 18 views
2

現在、私はオブジェクトの魚を食べ物に移動する機能を持っています。食べ物にうまく回転できないのが現状です。食べ物が魚の上にある私の魚の回転は0になっています。食べ物が私の魚の下にあれば、180度回転させて回転させますが、回転はあまりにも突然です。食べ物。回転するオブジェクトが別のオブジェクトに向かって回転する

どのように私はそれをいくつかの距離を移動すると同時に回転するようにすることができますか?それは現実的ではないので同じ場所で食べ物に回転できないからです。

public function moveToFood():void 
     { 
      var foodTarget:Food = fishArray[fishArray.length - 1]; 
      trace("Popped food with position" + foodTarget.x + " " +foodTarget.y); 
      var dx:Number = x - foodTarget.x; 
      var dy:Number = y - foodTarget.y; 
      if (foodTarget.y > this.y) 
      { 
       trace("Food below fish") 
       rotation = 180; 
       this.x -= dx/15; 
       this.y -= dy/15; 
      }else if (foodTarget.y < this.y) 
      { 
       trace("Food above fish") 
       rotation = 0; 
       this.x -= dx/15; 
       this.y -= dy/15; 
      } 

     //removing food when both hit boxes hit 
     if (hit.hitTestObject(foodTarget.hit)) 
      { 
       foodIsDropped = false; 
       foodTarget.removeSelf(); 
      } 
     } 
+0

Tweenクラス –

+0

を使用すると、回転を行うためにトゥイーンクラスを使用できますか? – sutoL

答えて

1

以前の回答(Tweenerについて)は可能な解決策ですが、私はそれが少し残酷すぎると思います。

すでに魚を動かす方法があります。そしてあなたはそこでxとyを使って - =演算をしています。だから、瞬時に変更するのではなく、同じことをローテーションで行うのはなぜですか?

public function moveToFood():void 
{ 
    var foodTarget:Food = fishArray[fishArray.length - 1]; 
    trace("Popped food with position" + foodTarget.x + " " +foodTarget.y); 

    var targetRotation:Number = 0; 
    if (foodTarget.y > y) 
    { 
     trace("Food below fish") 
     targetRotation = 180; 
    } else if (foodTarget.y < y) 
    { 
     trace("Food above fish") 
     targetRotation = 0; 
    } 

    var dx:Number = x - foodTarget.x; 
    var dy:Number = y - foodTarget.y; 
    x -= dx/15; 
    y -= dy/15; 

    // *** update rotation *** 
    rotation += (targetRotation-rotation)*.2; 

    //removing food when both hit boxes hit 
    if (hit.hitTestObject(foodTarget.hit)) 
     { 
      foodIsDropped = false; 
      foodTarget.removeSelf(); 
     } 
    } 
} 
+0

こんにちは、これは私が探しているものです、ところで、私は現在、それだけで上下に行っています、それはどのように私はそれが全方向になるように実装することができます知っていますか?左右に回転します。 – sutoL

+0

Math.atan2()を使用して直角を計算します。 'var angle:Number = Math.atan2(foodTarget.y-y、foodTarget.x-x); targetRotation = angle/Math.PI * 180 - 90; ' –

+0

こんにちは、どうやったらそれを詳しく説明できますか?私はそのコード行が何をしているのか分かりません。 – sutoL

0

トゥイーンエンジンを使用できます。

標準Flash Tweenクラスの代わりにTweenerを使用することをお勧めします。 fl.transitions.TweenクラスはTweenerに比べてばかげていて、Flash Professional IDEを使用していない場合でもアクセスできない場合もあります。そこにあなたが見て回ることができますいくつかの他のトゥイーンエンジンがありますが、そのうちのいくつかは、ライセンス料(IE:​​)運ぶことができますが、ツイナーを使用していた場合

ので、あなたは、単にクラスのいくつかのインポートになります。

import caurina.transitions.Equations; 
import caurina.transitions.Tweener; 

そして、このように回転をトゥイーン:Tweenerのドキュメントを通して読ん

trace("Food below fish") 
Tweener.addTween(this, {time: 0.25, transition: Equations.easeInOutCubic, rotation: 180}); 

(それは本当に短いです)。もしあなたが以前にそれについて聞いていないのであれば、おそらくそれをたくさん使ってしまうでしょう。

0

Javaアプリケーション用に以下のコードを使用しました。 atan2(y、x)関数は、-PIとPIの間の角度を返します。関数はYを最初の引数としてXを取ります。argsのXとYはターゲットとオブジェクトの位置の差です。それぞれの場合は食べ物と魚です。平凡な数学0の角度が右に向いていることに気づくだけの価値があり、+の角度が上がって左になり、角度が下がって左になると、この画像を見てください:http://iepro.files.wordpress.com/2009/12/atan2.jpg?w=280&h=283 または http://www.mathworks.com/help/techdoc/ref/math_a20.gif

float heading; 
float targetHeading = atan2(target.y - this.y, target.x - this.x); 

... 

if(this.heading != this.targetHeading){ 
    if(this.heading <=0){ //heading in minus 
     if(this.targetHeading > -PI && this.targetHeading <=0){ //target in minus 
      if(this.targetHeading < this.heading){ // both in minus and target is lefter 
       if(this.heading - this.targetHeading > this.mManeuverSpeed){ 
        this.turnLeft(); 
     //   System.out.println("SHIP: A"); 
       }else{ 
        this.resetHeading(); 
       } 
      }else{         // both in minus and target is righter 
       if(this.targetHeading - this.heading > this.mManeuverSpeed){ 
        this.turnRight(); 
     //   System.out.println("SHIP: B"); 
       }else{ 
        this.resetHeading(); 
       } 
      } 
     }else{             //target in plus 
      if(this.heading + PI <= this.targetHeading){   //target in plus and is lefter or opposite 
       if(PI + this.heading + (PI - this.targetHeading) > this.mManeuverSpeed){ 
        this.turnLeft(); 
     //   System.out.println("SHIP: C " + this.heading + " > " + this.targetHeading); 
       }else{ 
        this.resetHeading(); 
       } 
      }else{            //target in plus and is righter 
       if(this.targetHeading - this.heading > this.mManeuverSpeed){ 
        this.turnRight(); 
     //   System.out.println("SHIP: D"); 
       }else{ 
        this.resetHeading(); 
       } 
      } 
     } 
    }else{         //heading in plus 
     if(this.targetHeading > -PI && this.targetHeading <=0){ //target in minus 
      if(this.heading - this.targetHeading < PI){  //if target is in minus and lefter 
       if(this.heading - this.targetHeading > this.mManeuverSpeed){ 
        this.turnLeft(); 
     //   System.out.println("SHIP: E"); 
       }else{ 
        this.resetHeading(); 
       } 
      }else{ 
       if(PI + this.targetHeading + (PI - this.heading) > this.mManeuverSpeed){ 
        this.turnRight(); 
     //   System.out.println("SHIP: F"); 
       }else{ 
        this.resetHeading(); 
       } 
      } 
     }else{            //if target in plus 
      if(this.heading <= this.targetHeading){ 
       if(this.targetHeading - this.heading > this.mManeuverSpeed){ 
        this.turnRight(); 
     //   System.out.println("SHIP: G " + this.heading + " < " + this.targetHeading); 
       }else{ 
        this.resetHeading(); 
       } 
      }else{ 
       if(this.heading - this.targetHeading > this.mManeuverSpeed){ 
        this.turnLeft(); 
     //   System.out.println("SHIP: H " + this.heading); 
       }else{ 
        this.resetHeading(); 
       } 
      } 
     } 
    } 
}//heading != targetHeading 

void turnLeft(){ 
    this.heading -= this.mManeuverSpeed; 
} 

void turnRight(){ 
    this.heading += this.mManeuverSpeed; 
} 

void resetHeading(){ 
    this.heading = this.targetHeading; 
} 
+0

こんにちは、現在私はあなたの写真で正確に私の魚に相対的な角度を取得しています。しかし、私はrotation.insteadを移動するelse文がない場合は、私は持っています: \t \t \t rotation + =(foodLocationDegrees - (rotation - 90))* .2;それは回転をうまく行いますが、食べ物が90-180度の間の象限である陽性の左側に置かれた場合、私のオブジェクト(魚)は数回回転します。なぜこのようなことが起こるのか分かりません。 – sutoL

+0

まあ、私はこの完全な式(上記のコード)を得る前に、しばらくの間実験していました。何とか誰かがそれをもっと短くするだろう...しかし、私はちょうどそのように行かなかった。しかし、言及するべき重要なことです。まず、私はあなたが今それを持っていることを記述しているのと同じ方法で試していました。しかし、私は特定の状況下ではそれが虚弱であることを認識しました。オブジェクトがPiまたは-Piの角度を通過しなければならないときにこれを取り除くために、私はあらゆる可能な状況のために式を真っ暗にしました。もしも上記の場合の束は: – noncom

+0

iohhこのフォーラムは通常のコメントを投稿することを許可していません...このスレッドの他の投稿を参照してください – noncom

1

...可能性のあるあらゆる種類の計算式をブルートフォースしました。上記の場合の束は、それだけを意味します:

if there is need to turn 
    if we are now in + arc 
     if target in - arc 
      if target is lefter 
       if difference is more than turnrate 
        turn left 
       else 
        align 
       end 
      else //target is righter 
       if difference is more than turnrate 
        turn right 
       else 
        align 
       end 
      end 
     else //target is in + arc 
      if target is lefter or opposite 
       if difference is more than turnrate 
        turn left 
       else 
        align 
       end 
      else //target is righter 
       if difference is more than turnrate 
        turn right 
       else 
        align 
       end 
      end 
     end 
    else //same thing as above but for us being in - arc 
    ... 
0

btwさらに簡単な方法があります。あなたは魚のための "センサー"を作ることができます。

 \ o 
>--fish--) 
    /o 

ここにo記号が表示されます。それらのそれぞれからターゲットまでの距離を数えます。左の距離が小さい場合は左に曲がり、小さい場合は右に曲がる。非常にシンプルで、私はこれを私の子供時代に使いました。しかし、1つのオブジェクトに対して2つのdistを使用するため、他の "iffed"メソッドよりもかなり遅くなります。また、2つの距離の差がDELTAより小さい場合に条件を含めることを忘れないでください。 (angle = atan2(difx、dify))...

関連する問題