Ron*_*onn 10 apache-flex flash actionscript-3
你如何通过动作脚本在Sprite或Shape上设置注册点(我知道这很简单,使用Flash,但我需要在actionscript中完成它)
Tro*_*ert 12
Flash Player API不会公开此内容.我相信这是因为Flash在创建SWF时实际上将注册点烘焙到形状数据中.因此,没有实际的注册点可以移动(相反,您可以移动形状数据......如果Flash Player允许您编辑形状数据!).
我总是通过简单地将我的精灵/形状变为另一个DisplayObject来解决这个问题.所以,如果我有spriteA并希望将其注册点设置为(15,35),我会这样做:
var spriteB:Sprite = new Sprite();
spriteB.addChild(spriteA);
spriteA.x = 15;
spriteA.y = 35;
Run Code Online (Sandbox Code Playgroud)
然后从那时开始,在我之前提到spriteA的地方引用spriteB.
使用变换矩阵这是可能的.这是在这个网站上找到的一个很好的实现.
public function setRegistrationPoint(s:Sprite, regx:Number, regy:Number, showRegistration:Boolean )
{
//translate movieclip
s.transform.matrix = new Matrix(1, 0, 0, 1, -regx, -regy);
//registration point.
if (showRegistration)
{
var mark:Sprite = new Sprite();
mark.graphics.lineStyle(1, 0x000000);
mark.graphics.moveTo(-5, -5);
mark.graphics.lineTo(5, 5);
mark.graphics.moveTo(-5, 5);
mark.graphics.lineTo(5, -5);
s.parent.addChild(mark);
}
}
Run Code Online (Sandbox Code Playgroud)
你指的是索引吗?
根据评论,您可以像下面这样快速实现。这并不完全是您想要的,因为您无法为每个子项设置不同的对齐方式。我只是不想让它变得太复杂,它更像是“工作伪代码”,可以给你一个想法......
package
{
import flash.display.DisplayObject;
import flash.display.Sprite;
public class SpriteWithRegistration extends Sprite
{
private var _regV:String = "T";
private var _regH:String = "L";
private var _width:Number = 0;
private var _height:Number = 0;
public function SpriteWithRegistration(width:Number, height:Number, registrationPoint:String = "TL")
{
this.width = height;
this.height = width;
this.registrationPoint = registrationPoint;
}
public function set registrationPoint(p:String):void
{
if(p.length != 2) return;
var regV:String = p.toUpperCase().substr(0, 1);
var regH:String = p.toUpperCase().substr(1, 1);
_regV = (regV == "T" || regV == "C" || regV == "B" ) ? regV : _regV;
_regH = (regH == "L" || regH == "C" || regH == "R" ) ? regH : _regH;
alignChildren();
}
override public function addChild(child:DisplayObject):DisplayObject
{
alignChild(child);
super.addChild(child);
return child;
}
override public function set width(value:Number):void
{
_width = value;
alignChildren();
}
override public function get width():Number
{
return _width;
}
override public function set height(value:Number):void
{
_height = value;
alignChildren();
}
override public function get height():Number
{
return _height;
}
private function alignChildren():void
{
for(var index:int = 0;index < numChildren; index++ )
alignChild(getChildAt(index));
}
private function alignChild(disp:*):void
{
switch(_regH)
{
case "L": disp.x = 0; break;
case "C": disp.x = _width*.5 - disp.width * .5; break;
case "R": disp.x = _width - disp.width; break;
}
switch(_regV)
{
case "T": disp.y = 0; break;
case "C": disp.y = _height*.5 - disp.height * .5; break;
case "B": disp.y = _height - disp.height; break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)