1

映画のシンボルにスプライトがあり、半径 360 度内でホバリングしたいです。スムーズでランダムにしたいと思っていました。元のxy座標から実際に冒険することはありません。

if ステートメントと開始の勢いを使用して、いくつかの規定を作成しようとしました。このような:

var num = 2;

stage.addEventListener(Event.ENTER_FRAME, hover);
function hover(evt:Event):void{

      //start it moving
cloudWhite.y += num;
cloudWhite.x += num;


//declare these variables
var cX = cloudWhite.x;
var cY = cloudWhite.y;


//  object travels 10 pixels 
var cXP = cX + 10;
var cXN = cX - 10;
var cYP = cY + 10;
var cYN = cY - 10;


 //  if object goes 10 pixels reverse direction of momentum (maybe)

if (cX >= cXP) {
    num = -2;
}
if (cX <= cXN){
    num = 2;
}
if (cY >= cYP) {
    num = 2;
}
if (cY <= cYN){
    num = 2;
}

明らかに、これは非常に間違っています。実行すると、オブジェクトは 0,0 または数学の神だけが知っている場所に移動するからです。

私は明らかにこの種の数学の初心者なので、申し訳ありませんが、この背後にある三角法を学ぶことに非常に興奮しています.

ご協力いただきありがとうございます。読んでいただきありがとうございます。

4

1 に答える 1

2

ENTER_FRAME ループ内ですべての変数を設定しているため、条件が true と評価されることはありません。あなたがこれをしているすべての単一のフレームで:

cloudWhite.x += 2;
cX = cloudWhite.x;
cXP = cX + 10; // Must == cloudWhite's previous x + 10 + 2;
cXN = cX - 10; // Must == cloudWite's previous x -10 + 2;
if(cX > cXP)... // Can never be true.
if(cX < cXN)... // Can never be true.

あなたがする必要があるのは:

1) cloudWhite の元の位置をループ外のどこかに保存し、ループが始まる前に保存します。

2) ループが始まる前に、cloudWhite の元の位置に相対的な境界を定義します。また、反復ごとに位置を変更する量も定義します。

3) ループを開始します。

4) 各反復で cloudWhite の現在の位置をインクリメントします。形状をランダムに動かしたい場合は、ここに少しランダムを追加します。

5) cW の新しい位置が範囲外にあるかどうかを確認し、範囲外にある場合は方向を調整します。

以下のサンプルは粗雑でぎくしゃくしていますが、どのような効果を求めているのか正確にはわかりません. 各方向でよりスムーズで長い動きが必要な場合は、位置を手動で増減する代わりに、 Tweenクラスまたは一般的なGreensockなどの Tween ライブラリを使用することを検討してください。これに関する有益な議論がここにあります: http://www.actionscript.org/forums/archive/index.php3/t-163836.html

import flash.display.MovieClip;
import flash.events.Event;

// Set up your variables
var original_x:Number = 100; // Original x
var original_y:Number = 100; // Original y
var x_inc:Number = 5; // X Movement
var y_inc:Number = 5; // Y Movenent
var bounds:Number = 50; // Distance from origin allowed
// Doesn't take into account width of object so is distance to nearest point.

// Create an MC to show the bounds:
var display:MovieClip = addChild(new MovieClip()) as MovieClip;
display.graphics.lineStyle(1, 0x0000FF);
display.graphics.beginFill(0x0000FF, 0.5);
display.graphics.drawRect(0-bounds, 0-bounds, bounds * 2, bounds *2);
display.x = original_x;
display.y = original_y;
addChild(display);

// Create our moving mc:
var mc:MovieClip = addChild(new MovieClip()) as MovieClip;
mc.graphics.beginFill(0xFF0000, 1);
mc.graphics.drawCircle(-10, -10, 20);
// Position it:
mc.x = original_x;
mc.y = original_y;
addChild(mc);

// Loop:
function iterate($e:Event = null):void
{
    // Move the mc by a random amount related to x/y inc
    mc.x += (Math.random() * (2 * x_inc))/2;
    mc.y += (Math.random() * (2 * y_inc))/2;
    // If the distance from the origin is greater than bounds:
    if((Math.abs(mc.x - original_x)) > bounds)
    {
        // Reverse the direction of travel:
        x_inc == 5 ? x_inc = -5 : x_inc = 5;
    }
    // Ditto on the y axis:
    if((Math.abs(mc.y - original_y)) > bounds)
    {
        y_inc == 5 ? y_inc = -5 : y_inc = 5;
    }
}
// Start the loop:
addEventListener(Event.ENTER_FRAME, iterate);

これで始められるはずです。正式な三角関数でこれを行う方法は他にもたくさんあると思いますが、これには非常に単純であり、既存の方法の単なる拡張であるという利点があります。

于 2012-08-26T15:02:26.523 に答える