【问题标题】:How can I make a Flash shape's (x,y) coordinate relate to not its starting point, but its location on the frame如何使 Flash 形状的 (x,y) 坐标与其起点无关,而与其在框架上的位置相关
【发布时间】:2012-03-06 08:15:28
【问题描述】:

好吧,所以我从昨晚开始就一直在努力解决这个问题。当我创建一个新对象(一个新单元)并将其绘制到屏幕上(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;
}

【问题讨论】:

  • 这就是我正在做的事情...我昨天开始使用 Flash 但有 Java 背景。
  • Java 和 AS3 一样是重 OOP,为什么要嵌套这样的函数。您的范围将非常难以管理。您可能想查看文档类以使自己开始正确的路线。没有冒犯,但这种编码风格是可怕的。因为您没有遵循标准的 OOP,所以我怀疑您会得到答案。并且您知道原点通常是包含您要查找的元素的边界框的左上角。
  • 哦,我知道这很可怕,我开始它时没有研究 AS3 中的类功能。如果我错了,请纠正我,但是由于我将每个形状添加为舞台的子对象,因此它们的 (x,y) 坐标应该与 舞台的左上角相关,如您所说.

标签: flash actionscript-3 flash-builder flash-cs5


【解决方案1】:

Shape 是与 Sprite、MovieClip 和 Button 相同的 DisplayObject。 Flash 中的所有显示对象在 0,0 创建时会自动初始化其 X 和 Y 位置。

当您对 shape.graphics 进行绘图调用时,坐标相对于形状的原点。换句话说,形状有自己的变换。

要修复您的代码,请更改此行:

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

到:

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

这样绘制的圆的中心位于 Shape 的原点 0,0。

然后使用

设置形状的位置
tShape.x = spawnX; 
tShape.y = spawnY;

从那里您的代码将按预期工作。

顺便说一句,Actionsript 通过使用严格类型提高了性能,尽管这不是必需的。稍后在项目中重构并将其从通用对象转换为自定义类类型时,为您的单元使用对象的选择可能值得重新考虑。使用对象不会破坏您的游戏,但如果您的游戏需要额外的性能,则为其创建类型可能会提高您的游戏性能。

【讨论】:

    【解决方案2】:

    我在 Flash 中使用 as3 的 Shapes 并没有真正做太多,但我对影片剪辑做了很多。这似乎是您应该使用的对象。我建议尝试使用影片剪辑而不是形状,看看您是否仍然遇到同样的问题。 (仅当您最终需要它附带的所有功能时才使用影片剪辑,因为它是最重的 DisplayObject)。

    我看到的另一件事是您从未设置形状位置。您总是将形状的位置设置为 0,0(从不指定它)。你应该这样做

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

    然后在形状中的 0,0 处绘制你的圆圈。 drawCircle 命令在具有自己位置的形状内的 x,y 值处绘制。

    【讨论】:

    • MovieClip 是最重量级的DisplayObject,除非需要它的所有功能,例如具有时间线和能够包含子项,否则不应推荐。请访问this previous answer of mine 了解我的意思。
    • 根据他在产卵方面所做的事情,我猜他最终会想要大部分这些功能,而不仅仅是一个圆圈......但万一我没有编辑我的答案确定清楚
    • 我个人认为 OP 是 Fl​​ash 新手,真的需要学习基础知识。正如问题所述,getY 和 getX 正在返回与原点的距离。在那个“函数”中,他调用了“.x”和“.y”,这是形状的当前位置,不知道距离的想法来自哪里。所以是的,祝你好运,但这个问题没有正确答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    相关资源
    最近更新 更多