2011-07-06 175 views
2

我正在做一个精灵的简单旋转,但是有一个奇怪的行为,精灵不会围绕它的左上角旋转。我想我沿着测试类的左上角而不是精灵子进行旋转。我想旋转左上角的矩形(有点像钟针)。该代码是很短,所以我会让代码+图片解释我的问题:旋转精灵将精灵从原始位置移动

package 
{ 
    import flash.display.Sprite; 

    public class test extends Sprite 
    { 
     public function test() 
     { 
      var mySprite:Sprite = new Sprite(); 
      mySprite.graphics.beginFill(0x000000); 
      mySprite.graphics.drawRect(100,100,6,120); 
      mySprite.graphics.endFill(); 
      this.addChild(mySprite); 
      mySprite.rotation = 45; 
     } 

    } 
} 

似乎太简单了,搞砸了,还有这里的结果。红线位于主键上方以供参考。第一张图我设置mySprite.rotation=0和第二个是上面显示的代码: http://i56.tinypic.com/a4vi4h.png

enter image description here

我读了很多东西约定点周围旋转,我已经试过影片剪辑,而不是精灵做,我甚至复制粘贴tutorial on rotation,没有任何作品。为什么会发生这种行为,我该如何解决?

编辑:谢谢大家,所有的建议都以不同的方式帮助我,他们都是正确的,所以+1,我会选择我选择在我的代码中使用的解决方案。

回答

1

的精灵是绕着它的左上角,但您不必在左上角的任何图形。酒吧呈现在(100,100)。试试这个:

var mySprite:Sprite = new Sprite(); 
mySprite.graphics.beginFill(0x000000); 
mySprite.graphics.drawRect(0,0,6,120); // render in 0, 0 
mySprite.graphics.endFill(); 
mySprite.x = 100; // move it 
mySprite.y = 100; 
this.addChild(mySprite); 
mySprite.rotation = 45; 
+0

啊,谢谢。所以当我在100,100处画一个矩形时,图形仍然是0,0,因为它是左上角的? (我假设0,(我的矩形的右侧)作为右上角?)我应该渲染所有图形在0,0和移动它们? – NorthGuard

+0

右上角是(宽度,0)。 (宽度,高度)在右下方。 – taskinoor

3

如果你想从它的中心旋转,你可以试试:

var mySprite:Sprite = new Sprite(); 
mySprite.x = mySprite.y = 100; 
mySprite.graphics.beginFill(0x000000); 
mySprite.graphics.drawRect(-3,-60,6,120); 
mySprite.graphics.endFill(); 
this.addChild(mySprite); 
mySprite.rotation = 45; 
+0

我编辑了它,但我想旋转它关于它的左上角。我将不得不使用基于角度的新x,y坐标来重绘它,只是为了让它旋转到位? (我最终想要动画) – NorthGuard

+1

作为@taskinoor提到,您可以将drawRect函数中的x,y设置为(0,0)。这将从左上角抽出。但是,您想要左上角的锚点,还是要在左下角? – Corey

+0

yup,左上角,非常感谢 – NorthGuard

1

您正在围绕与其x/y坐标(当前设置为0,0)相同的mySprites注册点旋转矩形。您可以绘制矩形,然后通过设置sprite xy将其移动到正确的位置。

var mySprite:Sprite = new Sprite(); 
mySprite.graphics.beginFill(0x000000); 
mySprite.graphics.drawRect(-3, -60, 6, 120); 
mySprite.graphics.endFill(); 
mySprite.x = 100; 
mySprite.y = 100; 
addChild(mySprite); 
mySprite.rotation = 45; 

这应该工作。要查看问题是如何发生的,请编译下面的代码,您将能够看到原始栏的移动。

for (var i:int = 0; i <= 45; i+=5) { 
    var mySprite:Sprite = new Sprite(); 
    mySprite.graphics.beginFill(0x000000,0.5); 
    mySprite.graphics.drawRect(100, 100, 6, 120); 
    mySprite.graphics.endFill(); 
    addChild(mySprite); 
    mySprite.rotation = i; 
}