Как сделать так, чтобы координаты (x, y) фигуры Flash относились не к ее начальной точке, а к ее расположению на кадре - PullRequest
1 голос
/ 15 февраля 2012

Хорошо, я боролся с этим с прошлой ночи. Когда я создаю новый объект (новый блок) и рисую его на экране (Flash выполняет всю работу там), точка, в которой он находится, считается его источником. То есть getX и getY будут возвращать расстояние от этой точки ...

Почему это? Или как я могу это остановить?

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;
}

Ответы [ 2 ]

0 голосов
/ 15 февраля 2012

Shape - это DisplayObject, такой же, как Sprite, MovieClip и Button. Все экранные объекты во вспышке автоматически инициализируют свои позиции X и Y, когда они создаются в 0,0.

Когда вы выполняете вызовы рисования для shape.graphics, координаты относятся к началу фигуры. Другими словами, форма имеет свое собственное преобразование.

Чтобы исправить свой код, измените эту строку:

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

до:

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

так, чтобы круг рисовался с центром в начале координат, 0,0.

Затем установите положение фигуры, используя

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

Оттуда ваш код будет работать как положено.

Кроме того, Actionscript получает улучшение производительности от использования строгой типизации, хотя это и не требуется. Выбор использования объекта для вашего модуля, возможно, стоит пересмотреть позже в проекте при рефакторинге и преобразовании его из универсального объекта в пользовательский тип класса. Использование объекта не сломает вашу игру, но создание Типа для него может улучшить вашу игровую производительность, если ваша игра нуждается в дополнительной производительности.

0 голосов
/ 15 февраля 2012

Я не особо много сделал с Shapes во Flash с as3, но я много сделал с мувиклипами.Это похоже на объект, который вы должны использовать.Я бы посоветовал попытаться использовать мувиклип вместо формы и посмотреть, не возникла ли у вас такая же проблема.(Используйте movieclip только в том случае, если вам понадобятся все функции, которые поставляются с ним, поскольку он является самым тяжелым DisplayObject).

Другая вещь, которую я вижу, это то, что вы никогда не устанавливаете местоположение фигур.Вы всегда устанавливаете местоположение формы равным 0,0 (никогда не указывая его).Вы должны сделать

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

, а затем просто нарисуйте свой круг в 0,0 в форме.Команда drawCircle рисует значения x, y внутри вашей фигуры, которая имеет свою собственную позицию.

...