AS3: réglage du point d'alignement d'un objet DisplayObject avec actionscript?
Comment vous définissez le point d'enregistrement sur une image-objet ou de la Forme via actionscript (je sais c'est banal à l'aide de Flash, mais j'ai besoin de le faire uniquement dans actionscript)
L'API de Flash Player ne pas exposer cet. Je crois que c'est parce que Flash fait cuit dans le point d'enregistrement dans les données de forme lorsqu'il crée le fichier SWF. Ainsi, il n'y a pas de réel point d'enregistrement à se déplacer (au lieu de cela, vous auriez déplacer les données de forme... si le Lecteur Flash vous permettent de modifier les données de forme!).
J'ai toujours résoudre ce simplement élever mon sprite/forme à l'autre, DisplayObject. Donc, si j'ai spriteA et que vous voulez définir son point d'enregistrement (15, 35), je ferais ceci:
var spriteB:Sprite=newSprite();
spriteB.addChild(spriteA);
spriteA.x =15;
spriteA.y =35;
Et à partir de là reportez-vous à spriteB partout, j'ai précédemment en se référant à spriteA.
C'est certainement la méthode la plus simple et la plus simple. Pas le plus élégant. Bu, si la surcharge d'avoir un supplément de conteneur n'est pas un problème...
Suivi les commentaires, vous pouvez faire une mise en œuvre rapide comme ci-dessous.
Ce n'est pas exactement ce que vous voulez tant que vous ne pouvez pas définir les différents alignements pour chaque enfant.
Je ne voulais pas faire trop compliqué, c'est plus de travail-pseudo-code " pour vous donner une idée ...
non, le point d'enregistrement. par défaut, il est tout en haut,à gauche. BTW, il n'y a pas de valeur par défaut pour la mise en œuvre que pour les sprites et les formes. Ce qui est logique, car il dépend beaucoup de la façon dont votre objet de taille moyenne. Le mieux est d'utiliser un framework d'INTERFACE ou de construire votre propre. L'idée étant de spécifier la taille de la titulaire et les alignements des enfants.
J'espère que cela aidera quelqu'un. Le Starling framework est un fantastique méthode appelée, "alignPivot()". J'ai pris leur concept et l'a adapté à la Flash DisplayList. Vous dire essentiellement un sprite de modifier son inscription à gauche, à droite, au centre, en haut et en bas. Ce code met votre sprite dans un conteneur et se positionne de façon appropriée. Il retourne le conteneur d'origine avec le sprite contenues à l'intérieur.
Code stocké dans un autre appelé appelé, "Position".
publicstaticfunction alignPivot(s:DisplayObject, horizontalAlign:String="center", verticalAlign:String="center", showRegistration:Boolean=false, _color:uint=0x000000):Sprite{//create a container sprite to house the sprite you'd like to movevar _container:Sprite=newSprite();//add your sprite to the continer sprite (the container sprite is what will be returned)
_container.addChild(s);//using getBounds(), find the x,y,width,and height of your sprite within the continer.var bounds:Rectangle= _container.getBounds(s);//create variables for x and y cooridnatesvar xVal:Number;var yVal:Number;//I have a separate class called Align which contains public static constants for positiong.//Check the values passed above and get the correct x value;if(horizontalAlign ==Align.LEFT) xVal =-bounds.x;elseif(horizontalAlign ==Align.CENTER) xVal =-bounds.x - bounds.width *.5;elseif(horizontalAlign ==Align.RIGHT) xVal =-bounds.x - bounds.width;elsethrownewArgumentError("Invalid horizontal alignment: "+ horizontalAlign);//Check the values passed above and get the correct y value;if(verticalAlign ==Align.TOP) yVal =-bounds.y;elseif(verticalAlign ==Align.CENTER) yVal =-bounds.y - bounds.height *.5;elseif(verticalAlign ==Align.BOTTOM) yVal =-bounds.y - bounds.height;elsethrownewArgumentError("Invalid vertical alignment: "+ verticalAlign);//apply the new x and y cooridnates to your sprite (the one moving within the container we created above)
s.x = xVal;
s.y = yVal;//optional - this will create a small X at the 0,0 position of the container.//This is helpful if you want to see where your registration points areif(showRegistration){var mark:Sprite=newSprite();
mark.graphics.lineStyle(1, _color);
mark.graphics.moveTo(-5,-5);
mark.graphics.lineTo(5,5);
mark.graphics.moveTo(-5,5);
mark.graphics.lineTo(5,-5);
_container.addChild(mark);}//return your contianer sprite//This will replace the sprite that you passed in the first parameter.//That sprite is inside the container, so you won't noticereturn _container;}
Mise en œuvre:
//Create your spritevar _holder:Sprite=newSprite();//Create a shape to put in your spritevar my_shape:Shape=newShape();
my_shape.graphics.beginFill(0x000000);
my_shape.graphics.drawRect(0,0,200,100);
my_shape.graphics.endFill();//Add the shape to your sprite
_holder.addChild(my_shape);//Align the holder (must be done AFTER all children have been added)//This will put the registration point at the top-center of the sprite. //_holder is replaced by a sprite (container) that contains _holder.//The _holder inside the container is positioned appropriately.
_holder =Position.alignPivot(_holder,Align.CENTER,Align.TOP);//Add the new sprite to your stage.this.addChild(_holder);
Liste de constantes de sorte que vous n'avez pas à écrire vous-même:
L'API de Flash Player ne pas exposer cet. Je crois que c'est parce que Flash fait cuit dans le point d'enregistrement dans les données de forme lorsqu'il crée le fichier SWF. Ainsi, il n'y a pas de réel point d'enregistrement à se déplacer (au lieu de cela, vous auriez déplacer les données de forme... si le Lecteur Flash vous permettent de modifier les données de forme!).
J'ai toujours résoudre ce simplement élever mon sprite/forme à l'autre, DisplayObject. Donc, si j'ai spriteA et que vous voulez définir son point d'enregistrement (15, 35), je ferais ceci:
Et à partir de là reportez-vous à spriteB partout, j'ai précédemment en se référant à spriteA.
OriginalL'auteur Troy Gilbert
Utilisant la matrice de transformation de ce qui est possible. Voici une bonne mise en œuvre de ce trouve sur ce site.
Le lien est mort. Expliquant peut-être cela meilleur, une bonne chose à faire.
OriginalL'auteur picardo
pour vous dire l'index ?Suivi les commentaires, vous pouvez faire une mise en œuvre rapide comme ci-dessous.
Ce n'est pas exactement ce que vous voulez tant que vous ne pouvez pas définir les différents alignements pour chaque enfant.
Je ne voulais pas faire trop compliqué, c'est plus de travail-pseudo-code " pour vous donner une idée ...
BTW, il n'y a pas de valeur par défaut pour la mise en œuvre que pour les sprites et les formes. Ce qui est logique, car il dépend beaucoup de la façon dont votre objet de taille moyenne. Le mieux est d'utiliser un framework d'INTERFACE ou de construire votre propre. L'idée étant de spécifier la taille de la titulaire et les alignements des enfants.
OriginalL'auteur Theo.T
J'espère que cela aidera quelqu'un. Le Starling framework est un fantastique méthode appelée, "alignPivot()". J'ai pris leur concept et l'a adapté à la Flash DisplayList. Vous dire essentiellement un sprite de modifier son inscription à gauche, à droite, au centre, en haut et en bas. Ce code met votre sprite dans un conteneur et se positionne de façon appropriée. Il retourne le conteneur d'origine avec le sprite contenues à l'intérieur.
Code stocké dans un autre appelé appelé, "Position".
Mise en œuvre:
Liste de constantes de sorte que vous n'avez pas à écrire vous-même:
OriginalL'auteur Tony
Selon pourquoi vous en avez besoin, il peut être résolu en utilisant la classe DisplayObject.transformer.la matrice, qui renvoie un La matrice objet.
Par exemple, si vous vouliez changer le point de rotation, alors vous pourriez utiliser la transformation de la matrice pour le faire.
OriginalL'auteur Richard Szalay