2012-02-14 1 views
1

좋아, 어젯밤부터 이걸 고민해 왔습니다. 새 객체 (새 단위)를 만들고이를 화면에 그려 넣으면 (Flash는 모든 작업을 수행합니다) 처음 배치 된 지점이 원래 위치로 간주됩니다. 즉, getX와 getY는 그 점으로부터 거리를 반환합니다 ...어떻게 플래시 모양 (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

[Object Oriented Programming] (http://www.adobe.com/products/catalog.html)에 대해 읽었습니까? – Marty

+0

그게 내가하고있는 일이야. 어제 플래시가 시작되었지만 자바를 배경으로. –

+0

자바가 무겁다 OOP는 AS3과 마찬가지로 왜 이런 함수를 중첩시킬 것인가? 귀하의 범위는 미친 듯이 관리하기 어려울 것입니다. 적절한 경로를 시작하기 위해 문서 클래스를 조사하는 것이 좋습니다. 불쾌감은 없지만이 코딩 스타일은 끔찍합니다. 표준 OOP를 따르지 않았기 때문에 대답을 얻지 못할지 의심 스럽습니다. 원점은 일반적으로 찾고있는 요소가 포함 된 경계 상자의 왼쪽 위 모퉁이입니다. –

답변

-1

as3을 사용하여 Flash에서 모양을 많이 사용하지는 않았지만 영화 클립을 많이 사용했습니다. 이것은 당신이 사용해야하는 객체처럼 보입니다. Shape 대신 무비 클립을 사용하고 여전히 동일한 문제가 있는지 확인하는 것이 좋습니다. (가장 무거운 DisplayObject이므로 함께 제공되는 모든 기능을 필요로하는 경우 movieclip 만 사용하십시오.)

내가 보는 또 다른 것은 당신이 도형 위치를 설정하지 않는다는 것입니다. 도형의 위치를 ​​항상 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; 

를 사용하여 도형의 위치를 ​​설정합니다.

제쳐두고, Actionsript는 엄격한 입력을 사용하면 성능이 향상되지만 필요하지는 않습니다. Unit for Object를 사용하는 선택은 리팩터링 할 때 프로젝트에서 나중에 다시 방문 할 가치가있을 수 있으며 일반 오브젝트에서 사용자 정의 클래스 유형으로 변환 할 수 있습니다. 개체를 사용하면 게임이 중단되지 않지만 추가 성능이 필요한 게임의 경우 Type을 만들면 게임 성능이 향상 될 수 있습니다.

관련 문제