2012-02-14 17 views
1

よろしく、昨夜からこれに苦労しています。新しいオブジェクト(新しいユニット)を作成し、それをスクリーンに描画すると(Flashはすべての作業を行います)、最初に配置されたポイントがその起点とみなされます。つまり、getXとgetYはその点からの距離を返します。Flashのシェイプの(x、y)座標を始点ではなくフレーム上の位置にするにはどうすればいいですか?

なぜですか?それとも私はこれをやめることができますか?

function createUnit(health:int, attack:int, reach:int, speed:int, friendly:Boolean, type:String):Object { 
    var unit = new Object(); 
    unit.cHealth = health; 
    unit.tHealth = health; 
    unit.uAttack = attack; 
    unit.uReach = reach; 
    unit.uSpeed = speed; 
    if (friendly) { 
     unit.xSpeed = -speed; 
    } else { 
     unit.xSpeed = speed; 
    } 
    unit.ySpeed = 0; 
    unit.isFriendly = friendly; 
    unit.unitType = type; 
    unit.updateUnit = function() { 
     if (unit.cHealth <= 0) { 
      deleteUnit(unit); 
     } 
     unit.moveUnit(); 
     unit.findClosestUnit(); 
    } 
    unit.getY = function():int { 
     return unit.shape.y; 
    } 
    unit.getX = function():int { 
     return unit.shape.x; 
    } 
    unit.moveUnit = function() { 
     unit.shape.x += unit.xSpeed; 
     unit.shape.y += unit.ySpeed; 
    } 
    unit.findClosestUnit = function() { 
     var dist:int = 0; 
     var closestDist:int = 0; 
     var closestUnit:Object = null; 
     var array:Array; 
     if (unit.isFriendly) { 
      array = eUnits; 
     } else { 
      array = fUnits; 
     } 

     if (array != null) { 
      var i:int = 0; 
      for (i; i < array.length; i++) { 
       var obj = array[i]; 
       trace(this.shape.x); 
       dist = Math.sqrt(Math.pow(obj.getX() + unit.getX(), 2) + Math.pow(obj.getY() + unit.getY(), 2)); 
       //trace(dist); 

       if (dist <= closestDist) { 
        closestDist = dist; 
        closestUnit = obj; 
        //basically the two lines below *will* start the unit's movement towards the nearest enemy. 
        //unit.ySpeed = (unit.getY() - closestUnit.getY())/unit.uSpeed; 
        //unit.xSpeed = (unit.getX() - closestUnit.getX())/unit.uSpeed; 
       } 

       if (dist <= unit.reach) { 
        unit.attackUnit(closestUnit); 
       } 
      } 
     } 
    } 
    unit.attackUnit = function(unit2:Object) { 
     unit2.cHealth -= unit.attack; 
    } 

    var spawnX:int; 
    var spawnY:int; 
    var color:uint; 

    if (friendly) { 
     spawnX = stage.stageWidth; 
     spawnY = stage.stageHeight/2; 
     color = 0xFFCC00; 
    } else { 
     spawnX = 0; 
     spawnY = Math.random() * stage.stageHeight; 
     color = 0x682388; 
    } 

    var tShape:Shape = new Shape(); 
    tShape.graphics.beginFill(color); 
    tShape.graphics.lineStyle(2, 2); 
    tShape.graphics.drawCircle(spawnX, spawnY, 10); 
    tShape.graphics.endFill(); 
    stage.addChild(tShape); 
    unit.shape = tShape; 

    return unit; 
} 
+1

[オブジェクト指向プログラミング](http://www.adobe.com/jp/products/catalog.html)を読んだことがありますか? – Marty

+0

これは私がやっていることのようなものです...私は昨日フラッシュを始めましたが、Javaを背景にしています。 –

+0

Javaは重いですOOPはAS3のようになぜこのような関数を入れ子にしますか?あなたの範囲は管理するのが非常に難しいでしょう。適切なルートを使い始めるために、ドキュメントクラスを調べることをお勧めします。犯罪はありませんが、このコーディングスタイルは恐ろしいものです。あなたが標準のOOPに従わなかったので、私はあなたが答えを得ることを疑う。原点は一般的に、探している要素を含む境界ボックスの左上隅です。 –

答えて

-1

私は実際にAS3とFlashの形状の多くを行っていないが、私はムービークリップで多くのことを行っています。これはあなたが使用すべきオブジェクトのようです。シェイプの代わりにムービークリップを使用して、同じ問題がまだ発生しているかどうかを確認することをお勧めします。 (最も重いDisplayObjectなので、付属のすべての機能が必要になる場合は、movieclipを使用してください)。

もう1つは、シェイプの位置を設定していないことです。シェイプの位置は常に0,0(指定しないで)に設定します。あなたはする必要があります

tShape.x = spawnX; 
tShape.y = spawnY; 

そして、形状を0,0で円を描くだけです。 drawCircleコマンドは、独自の位置を持つ形状内のx、y値を描画します。

+0

'MovieClip'は最も重い' DisplayObject'です。タイムラインを持っていて子を含むことができるなどの機能がすべて必要な場合以外は、推奨しないでください。私が何を意味するかを見るには、[この前の私の回答](http://stackoverflow.com/questions/8131078/flash-movieclips-graphics-buttons/8131171#8131171)をご覧ください。 – Marty

+0

産卵をしていることに基づいて、私は最終的に彼が最終的にサークルだけでなく、これらの機能のほとんどを望んでいると推測しています...しかし、私は私の答えを編集して、それが明確であることを確認しました –

+0

個人的に私OPはフラッシュに新しいものだと思って、本当に基本を学ぶ必要があります。問題は、getYとgetXが原点からの距離を返すということです。その "機能"では、彼は "x"と ".y"という形の現在の位置を呼び出しています。距離の考え方は分かりません。だから幸運にもこの質問に正解はありません。 –

0

シェイプは、Sprite、MovieClip、およびButtonと同じDisplayObjectです。フラッシュ内のすべての表示オブジェクトは、0,0で作成されたときにXとYの位置を自動的に初期化します。

shape.graphicsに描画呼び出しを行うと、座標は図形の原点からの相対座標になります。換言すれば、その形状はそれ自身の変換を有する。

は、あなたのコードを修正し、この行を変更するには:円がシェイプの原点、0,0を中心に描かれているように、

tShape.graphics.drawCircle(0, 0, 10); 

tShape.graphics.drawCircle(spawnX, spawnY, 10); 

にします。

はその後、期待通りのコードが動作します。そこから

tShape.x = spawnX; 
tShape.y = spawnY; 

を使用して図形の位置を設定します。

これは必須ではありませんが、ActionsScriptは厳密な型定義を使用することでパフォーマンスが向上します。 Unit for Objectを使用する選択は、リファクタリング時にプロジェクトの後半で再訪する価値があり、汎用オブジェクトからカスタムクラスタイプに変換する必要があります。オブジェクトを使用してもゲームは中断されませんが、ゲームに余分なパフォーマンスが必要な場合は、Typeを作成するとゲームのパフォーマンスが向上する可能性があります。

関連する問題