Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 AS3跟踪和使用旋转对象的坐标_Actionscript 3_Flashdevelop_Rotatetransform - Fatal编程技术网

Actionscript 3 AS3跟踪和使用旋转对象的坐标

Actionscript 3 AS3跟踪和使用旋转对象的坐标,actionscript-3,flashdevelop,rotatetransform,Actionscript 3,Flashdevelop,Rotatetransform,如何跟踪和使用初始化时旋转的对象的坐标 比方说,我有一把剑,放在主init()的舞台上;并旋转(调整),使其与角色透视图一起看起来正常。然而,在另一个课程中,我在一个按键定时器事件中使剑旋转一些,以便创建一个“摆动”动画 所有这些都是通过flashdevelop完成的。我只使用CS6来创建符号。当这个“摆动”发生时,我想在剑尖上添加另一个符号,这是一个碰撞点对象。当秋千开始时,它被添加到舞台上,在每次秋千后被移除。我想让这个物体跟随剑的尖端,但似乎我只能实现它跟随原始剑物体的坐标,就好像我最初没

如何跟踪和使用初始化时旋转的对象的坐标

比方说,我有一把剑,放在主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();
    }
}
处理swing的类有如下方法:

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();
    }
}
这就是Main的样子,实际上每个对象实例化都是这样添加到stage的。包括碰撞点、背景、字符、视线半径的渐变填充等,相关的符号类别如下:

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);
    }
公共类生物扩展MovieClip
{
受保护变量Swing:布尔值;
私有变量SwingTimer:计时器=新计时器(5,0);
私有变量SwingBckTimer:Timer=新定时器(150,1);
//构造器。
公共功能生物()
{
if(stage)init();
else addEventListener(Event.ADDED_TO_STAGE,init);
}
//初始化器。
私有函数init(event:event=null):void
{
removeEventListener(Event.ADDED_TO_STAGE,init);
SwingTimer.addEventListener(TimerEvent.TIMER,SwingTime);
SwingBackTimer.addEventListener(TimerEvent.TIMER,SwingBack);
}
私有函数SwingAction():void
{
if(Swing==true)
{
SwingTimer.start();
}
}
私有函数SwingTime(事件:事件):无效
{
Main.Coll_Point.x=Main.swarm.localToGlobal(Main.from_Point.x;
Main.Coll_Point.y=Main.swarm.localToGlobal(Main.from_Point).y;
主。剑。加德柴尔德(主。科卢点);
跟踪(主Coll_点x);
迹线(主坐标点y);
如果(Main.sware.rotationZ>-330)
Main.sware.rotationZ-=20;
如果(主刀旋转X<15)
Main.swip.rotationX+=10;
如果((Main.swarm.rotationZ=-330)和&(Main.swarm.rotationX==15))
{
SwingTimer.stop();
swingbacktimer.start();
}
}
私有函数SwingBack(事件:事件):无效
{
Main.brow.rotationZ=-150;
Main.sware.rotationX=-15;
//Main.MazeNr1.removeChild(Main.Coll_点);
}

还有一个相当长的update();函数,可以对需要移动的每个对象进行动画和移动。

我认为您的问题可能在

    Main.Coll_Point.x = Main.sword.x + Main.sword.width;
    Main.Coll_Point.y = Main.sword.y + Main.sword.height;
Coll_Point需要全局坐标

零件
+主.剑.宽度
+主.剑.高度
仅在剑未旋转以使高度与y轴对齐,宽度与x轴对齐时才能正常工作

您应该在
Main.swill
(
Main.swarm.width,Main.swarm.height
),以获取表示刀尖旋转的全局位置,然后再将其作为子级添加



有两种方法可以实现这一点(您似乎将两者结合起来)。您可以


  • 将Coll_点作为子对象添加到层次结构中剑的上方(Stage,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()
在创建碰撞点的位置运行一次:

Coll_Point.x = <your x offset>;
Coll_Point.y = <your y offset>;
Main.sword.attachChild(Coll_Point);
Coll_Point.x=;
Coll_Point.y=;
主。剑。攻击儿童(Coll_Point);
您可能需要尝试类似于
-height
width/2
的方法,而不是使用剑
高度
宽度



下面是一张快速(但不是最漂亮)的图片来演示问题。局部空间随对象旋转:


我能想象的唯一能帮你解决这个问题的方法是让碰撞对象与剑具有相同的注册点。我的意思是方向点应该匹配,并且碰撞图形应该在精灵内部移动,以便它与剑顶部的位置匹配

通过这种方式,你可以将碰撞对象放置在剑的同一位置,并进行同样的旋转。这样它将沿着剑的顶部移动,并且仍然可以正常运行hitTest

我无法想象有任何其他方法可以解决这个问题,因为任何代码都会得到边界和位置