2013-09-08 3 views
0

В приведенном ниже коде я создал 4 спрайта (пикн) внутри спрайта (noteholder). Как я могу получить абсолютные значения экземпляров picn, которые я создаю? Я знаю о функции localToGlobal, но я не могу понять, как использовать это в этом случае. На данный момент, я думаю, мне нужен контейнер, потому что мне нужно иметь возможность перемещать спрайты после создания. Любая помощь приветствуется. Благодаря!Получить глобальную координату динамически созданного вложенного компонента?

package 
{ 
import flash.display.Bitmap; 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.geom.Point; 
import Main; 


public class Notes extends Sprite 
{ 
    private var speed:int = 14; 
    [Embed(source="../lib/Dodgethis.jpg")] 
    private var picn:Class; 
    private var noteholder:Sprite = new Sprite(); 


    public function appear() { 
     trace ("appear ran") 
     var arr1:Array = new Array; 
     var numnotes:Number = 4; 
     Main.StageRef.addChild(noteholder); 
     trace (noteholder.x, noteholder.y); 


     for (var i = 0; i < numnotes; i++) 
      { 
      //trace (i); 
       var nbm:Bitmap = new picn; 
       noteholder.addChild(nbm); 
       nbm.y = i * 50; 
       arr1.push(nbm); 
+0

Рассмотрим http://stackoverflow.com/questions/6062209/flash-as3-understanding-localtoglobal –

+0

Спасибо, но я не могу сослаться на точку, я хочу использовать метод localToGlobal, потому что это не созданный во время выполнения, и у меня нет способа ссылаться на него по имени (по крайней мере, я не могу понять, как ссылаться на них по имени из-за области переменных) – something13

+0

Учитывая ваш код выше, вы можете ссылаться на эти растровые изображения двумя способами - либо через массив например 'arr1 [0]' или из спрайта 'noteholder.getChildAt (0)' - вам, вероятно, следует предпочесть 'arr1', и вы, вероятно, должны поместить его в объект и переименовать его' noteSprites' или что-то более четкое. Вам не нужно действительно возиться с именованием динамически созданных объектов отображения. –

ответ

0

Вам необходимо сохранить ссылку на объекты отображения, которые вы динамически создаете, - вам не нужно «имя», которое является просто абстракцией переменных экземпляра при создании визуальных активов в Flash IDE.

Я обновил свой код, чтобы продемонстрировать концепцию:

package 
{ 
import flash.display.Bitmap; 
import flash.display.Sprite; 
import flash.display.Stage; // added this 
import flash.events.Event; 
import flash.geom.Point; 
import flash.geom.Rectangle; // added this (see below) 
import Main; 

public class Notes extends Sprite 
{ 
    private var speed:int = 14; 
    [Embed(source="../lib/Dodgethis.jpg")] 
    private var NoteBMP:Class; 
    private var display:Sprite = new Sprite(); 
    private var notes:Array = []; // make notes an instance variable, so it's accessible throughout the class 

    // I renamed appear to 'build' because I'm a pedantic moron 
    public function build():void 
    { 
     trace ("build ran"); 
     var noteCount:int = 4; 
     Main.StageRef.addChild(display); 

     for (var i:int = 0; i < noteCount; i++) 
     { 
      var nbm:Bitmap = new NoteBMP; 
      display.addChild(nbm); 
      nbm.y = i * 50; 
      notes.push(nbm); // by adding the display objects to an array you can reference them later 

затем в некоторый более поздний момент в классе Notes вы можете ссылаться на ваши растровые изображения с помощью цикла через notes массив

// initialize variables outside the loop 
var localPos:Point 
var globalPos:Point; 
var bounds:Rectangle; 
var n:DisplayObject; 
var stage:Stage = Main.StageRef; 

for (var i:int = 0; i < notes.length; i++) 
{ 
    trace('note' + i); 
    n = notes[i] as DisplayObject; // cast during assignment since array items have ambiguous type 

    // getBounds() returns a Rectangle representing the bounding box of the display object 
    bounds = n.getBounds(stage); 
    trace(
     'getBounds:', 
     bounds.top, bounds.left, bounds.bottom, bounds.right 
    ); 

    // localToGlobal() returns a Point which is just the position 
    localPos = new Point(n.x, n.y); 
    globalPos = display.localToGlobal(localPos) 
    trace(
     'localToGlobal:', 
     globalPos.x, globalPos.y 
    ); 
} 

несколько баллов:

  1. Я переработал некоторые имена, чтобы сделать намерение более ясным.
  2. Интересно, почему ваш класс Notes расширяет Sprite, так как он добавляет display (то, что вы назвали «noteholder») на сцену. Предполагая, что это правильно, просто сделайте Notes универсальным объектом, то есть, похоже, не нужно расширять другой класс.
0

Вы можете использовать GetBounds about getBounds

// call this after added to stage 
if (stage) { 
    var r:Rectangle = nbm.getBounds(stage);// r's x and y is the global pos 
} 

И я думаю, что localToGlobal должен работать в вашем случае. Перемещение sprites не влияет на localToGlobal

+0

Извините, но это не сработало для меня. Если бы я набрал его точно так же, как у вас, ничего не произошло. Скрипт никогда не запускался. Когда я вынул if (stage), он побежал, но значения y были равны 0, что мне совсем не помогает. Подумайте, что еще попробовать? – something13

+0

Смотрите мой комментарий выше и попробуйте 'noteSprites [0] .getBounds (Main.StageRef)' –

Смежные вопросы