AS3跟踪和旋转物体的使用坐标(AS3 tracking and using coordinates

2019-10-20 05:46发布

一个人如何跟踪和使用上初始化旋转物体的坐标?

比方说,我有一个是把舞台上的主要的init()剑; 和旋转(调整),以便它与角色的角度确定一起来看看吧。 然而,在另一个类,我使剑旋转多一些上一个按键计时器事件,从而创建一个“秋千”的动画。

所有这一切都是通过Flashdevelop中完成的。 我只用CS6创建符号。 而作为这个“摇摆”正在发生的事情,我想补充另一个符号到这是一个碰撞点对象的剑尖。 当摆动开始,每一次挥杆后取出它被添加到舞台上。 我想这个对象跟着剑很尖,但好像我也只能达到它沿用了原先的剑对象的坐标,就好像我最初没有修改的说剑的旋转。 我试图执行GlobalToLocal()和localToGlobal()方法,但我不认为我完全理解什么是与该发生的事情。

我希望我是再清楚不过的是我想要做的事。 谢谢。 这是有问题的相关代码。 其代码是以前我试过上面提到的两个方法和问题目前是完全一样的之前描述。 我想任何的这些方法还是我只是做别的事情了?

主要初始化:

sword = new Sword();

sword.x = 53;
sword.y = 90;
addChild(sword);
sword.rotationZ = -150;
sword.rotationY = 25;
sword.rotationX = -15;

Coll_Point = new coll_point();

与摆动交易类有这样的方法:

private function SwingTime(event:Event):void
{
    Main.Coll_Point.x = Main.sword.x + Main.sword.width;
    Main.Coll_Point.y = Main.sword.y + Main.sword.height;
    Main.MazeNr1.addChild(Main.Coll_Point);

    if (Main.sword.rotationZ > -330)
    Main.sword.rotationZ -= 20;

    if (Main.sword.rotationX < 15)
    Main.sword.rotationX += 10;

    if ((Main.sword.rotationZ == -330) && (Main.sword.rotationX == 15))
    {
        SwingTimer.stop();
        SwingBckTimer.start();
    }
}

编辑:代码的一个更全面的版本:

public class Main extends MovieClip 
{
    public static var from_point:Point = null;
    public static var to_point:Point = new Point();
    public function Main():void
    {
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }

    // Puts everything on the stage here.
    private function init(e:Event = null):void
    {
    removeEventListener(Event.ADDED_TO_STAGE, init);
        PlayerInst = new Dorf();
        PlayerInst.x = 45;
        PlayerInst.y = 51;
        addChild(PlayerInst);

        sword = new Sword();
        sword.x = 53;
        sword.y = 90;
        sword.rotationZ = -150;
        sword.rotationY = 25;
        sword.rotationX = -15;
        from_point = new Point (Main.sword.width, Main.sword.height);
        to_point = sword.localToGlobal(from_point);
        addChild(sword);
        swordBD = new BitmapData(32, 32, true, 0x0000000000);
        swordBD.draw(sword);

        Coll_Point = new coll_point();
        Coll_PointBD = new BitmapData(2, 2, true, 0x0000000000);
        Coll_PointBD.draw(Coll_Point);
    }
}

这是主要的样子和字面上每一个对象实例添加到舞台上这种方式。 包括碰撞点,背景,人物,视野范围等,以及相关的符号类的线的渐变填充去有点像这样:

public class Creature extends MovieClip 
{
    protected var Swing:Boolean;
    private var SwingTimer:Timer = new Timer (5, 0);
    private var SwingBckTimer:Timer = new Timer (150, 1);
// Constructor.
    public function Creature()
    {
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }

    // Initializer.
    private function init(event:Event = null):void
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);

        SwingTimer.addEventListener(TimerEvent.TIMER, SwingTime);
        SwingBckTimer.addEventListener(TimerEvent.TIMER, SwingBack);
    }
private function SwingAction():void
    {
        if (Swing == true)
        {
            SwingTimer.start();
        }
    }

    private function SwingTime(event:Event):void
    {
        Main.Coll_Point.x = Main.sword.localToGlobal(Main.from_point).x;
        Main.Coll_Point.y = Main.sword.localToGlobal(Main.from_point).y;
        Main.sword.addChild(Main.Coll_Point);
        trace(Main.Coll_Point.x);
        trace(Main.Coll_Point.y);

        if (Main.sword.rotationZ > -330)
        Main.sword.rotationZ -= 20;

        if (Main.sword.rotationX < 15)
        Main.sword.rotationX += 10;

        if ((Main.sword.rotationZ == -330) && (Main.sword.rotationX == 15))
        {
            SwingTimer.stop();
            SwingBckTimer.start();
        }
    }

    private function SwingBack(event:Event):void
    {
        Main.sword.rotationZ = -150;
        Main.sword.rotationX = -15;
        //Main.MazeNr1.removeChild(Main.Coll_Point);
    }

还有一个相当长的update(); 功能动画并移动,需要移动每单个对象。

Answer 1:

我认为你的问题可能是

    Main.Coll_Point.x = Main.sword.x + Main.sword.width;
    Main.Coll_Point.y = Main.sword.y + Main.sword.height;

Coll_Point预计全球坐标。

零件+ Main.sword.width+ Main.sword.height仅使得高度与y轴和宽度与x轴对齐,预期如果剑不旋转工作。

您应该使用localToGlobal()上是本地的位置Main.swordMain.sword.width, Main.sword.height )获取表示旋转尖端剑你添加它作为一个孩子之前在全球的地位。



还有,你可以处理这个两个方法(你似乎已经有所结合两者)。 你可以


  • 添加Coll_Point作为一个孩子在层次的东西上面剑(第一阶段,MazeNr1,...)和手动更新位置每个定时器的回调。 你将不得不重新计算每次的位置,所以采取了localToGlobal()由init到您的定时器功能。 它不会更新,如果它不被调用。

对于你应该有这样的计时器回调代码:

var local:Point = new Point(Main.sword.width, Main.sword.height);
var global:Point = Main.sword.localToGlobal(local);
Main.Coll_Point.x = global.x;
Main.Coll_Point.y = global.y;



  • 添加点作为子剑。 这可能是一个更好的方法,因为那么位置将被自动更新。 我不记得是什么之前,是你然后给在“本地”形式的坐标,所以不要使用localToGlobal()

在您创建运行这个曾经Collision_Point

Coll_Point.x = <your x offset>;
Coll_Point.y = <your y offset>;
Main.sword.attachChild(Coll_Point);

相反剑的heightwidth你可能想尝试像-heightwidth/2



这里是一个快速(而不是最漂亮的)图片说明问题。 局部空间旋转与对象:



Answer 2:

我能想象,以帮助您解决这个问题的唯一的事情就是你的碰撞对象具有相同的注册点剑。 我的意思是,定位点应该匹配,和碰撞图形应精灵的内部移动,使其剑顶部的位置相匹配。

这样,您就可以把碰撞对象在剑的非常相同的位置和应用非常相同的旋转。 这样,它会随着剑的顶部移动,仍然有则hitTest正常工作。

我无法想象任何其他方式算出这个任何代码将得到边界和位置。 但是,重要的真实的东西是注册点和剑,这是一个图形的事情,不能用编码进行处理的顶部。

我希望你能想象我的意思 - 如果现在,只是说,我会为您提供的图片:)



文章来源: AS3 tracking and using coordinates of a rotated object