Flash 如何制作闪光形状';s(x,y)坐标与它的起点无关,而是与它在框架上的位置有关

Flash 如何制作闪光形状';s(x,y)坐标与它的起点无关,而是与它在框架上的位置有关,flash,actionscript-3,flash-builder,flash-cs5,Flash,Actionscript 3,Flash Builder,Flash Cs5,好吧,从昨晚开始我就一直在努力解决这个问题。当我创建一个新对象(一个新单元)并将其绘制到屏幕上(Flash在那里完成所有工作)时,它的第一个放置点被认为是它的原点。也就是说,getX和getY将返回到该点的距离 为什么呢?或者我怎样才能阻止这一切 function createUnit(health:int, attack:int, reach:int, speed:int, friendly:Boolean, type:String):Object { var unit = new O

好吧,从昨晚开始我就一直在努力解决这个问题。当我创建一个新对象(一个新单元)并将其绘制到屏幕上(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;
}
函数createUnit(健康:int,攻击:int,到达:int,速度:int,友好:Boolean,类型:String):对象{
var unit=新对象();
unit.cHealth=健康;
unit.tHealth=健康;
unit.uAttack=攻击;
unit.uReach=到达距离;
unit.uSpeed=速度;
如果(友好){
unit.xSpeed=-速度;
}否则{
unit.xSpeed=速度;
}
单位速度=0;
unit.isFriendly=友好;
unit.unitType=类型;
unit.updateUnit=函数(){

if(unit.cHealth我在Flash中对as3中的形状做得不多,但我对movieclips做了很多。这似乎是您应该使用的对象。我建议尝试使用movieclip而不是形状,看看您是否仍然存在同样的问题。(仅当您最终需要movieclip附带的所有功能时才使用movieclip,因为它是最重的DisplayObject)

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

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

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

形状是一个与精灵、MovieClip和按钮相同的显示对象。flash中的所有显示对象在0,0处创建时自动初始化其x和y位置

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

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

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

因此,绘制圆时,圆心位于形状的原点0,0

然后使用设置形状的位置

tShape.x = spawnX; 
tShape.y = spawnY;
从那里,您的代码将按预期工作


另一方面,Actionsript通过使用严格的类型来提高性能,尽管这不是必需的。在项目后期重构时,为您的单元使用对象的选择可能值得再次探讨,并将其从通用对象转换为自定义类类型。使用对象不会破坏您的游戏,但为其创建类型可能会让我感到意外如果游戏需要额外的性能,请提高游戏性能。

你读过吗?这就是我正在做的事情……我昨天开始使用flash,但有Java的背景。Java和AS3一样都是重OOP的。为什么要嵌套这样的函数。你的作用域将非常难以管理。你可能想查看document类来获得它我们自己是按照正确的路线开始的。无意冒犯,但这种编码风格很可怕。因为你没有遵循标准OOP,我怀疑你会得到答案。正如你所知道的,原点通常是边界框的左上角,其中包含你要找的元素。哦,我知道这很可怕,我在没有查看clas的情况下开始了它s在AS3中的功能。如果我错了,请纠正我,但由于我将每个形状作为舞台的子对象添加,因此它们的(x,y)正如您所说,coords应该位于舞台的左上角。
MovieClip
是最重的
DisplayObject
并且不应该被推荐,除非它的所有功能都是必需的,例如具有时间线和能够包含子对象。访问了解我的意思。基于他对spawnin所做的g我猜他最终会想要这些功能中的大部分,而不仅仅是一个圆……但如果不是这样,我已经编辑了我的答案,以确保这是清楚的。我个人认为OP对flash来说是新的,真的需要学习基础知识。正如问题所述,getY和getX正在返回与原点的距离。在这个“函数”中他在叫“.x”和“.y”,这是形状的当前位置,不知道距离会从哪里来。所以,祝你好运,但这个问题没有正确的答案。
tShape.x = spawnX; 
tShape.y = spawnY;