Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 04-12-2011, 20:25   #1 (permalink)
Neuer User
 
Registriert seit: Dec 2011
Beiträge: 3
Sprite aus Klasse heraus hinzugefügt - wie jetzt aus Klasse heraus moven?

Hi,

bin Actionscript 3 Neuling und stehe immer wieder vor demselbem Problem: Wie kann ich aus einer Klasse heraus auf Elemente auf der Bühne zugreifen? In folgender Klasse wird ein Bild geladen, dieses als Bitmap in einen Sprite Container gepackt und dieser anschließend per addchild auf die Bühne gepackt:

PHP-Code:
public class Car extends Sprite
    
{
        private var 
CarLoader:Loader;
        private var 
CarBMD:BitmapData;
        private var 
CarBM:Bitmap;
        private var 
CarContainer:Sprite;
        private var 
SpeedX:Number;
        private var 
targetPoint:Point;
        
        
// constructor
        
public function Car() 
        {
            
CarLoader = new Loader();
            
CarLoader.contentLoaderInfo.addEventListener(Event.COMPLETECarToBM);
            
CarLoader.load(new URLRequest("BangBus.png"));    
        }
        
        private function 
CarToBM(evt:Event) : void {
            
CarLoader.contentLoaderInfo.removeEventListener(Event.COMPLETECarToBM);                 
            
CarContainer = new Sprite();
            
CarBMD = new BitmapData(evt.target.widthevt.target.heighttrue0x00FFFFFF);
            
CarBMD.draw(evt.target.content);
            
CarBM = new Bitmap(CarBMD);
            
CarContainer.addChild(CarBM);
            
CarBM.= - CarBM.width 2;
            
CarBM.= - CarBM.height 2;
            
addChild(CarContainer);
        }    
        
    } 
In der main.as sieht das ganze so aus:

PHP-Code:
// Car 1
Car1 = new Car();            
addChild(Car1); 
Wie kann ich jetzt den CarContainer bewegen? Es funktioniert, ihn einfach per
PHP-Code:
CarContainer.+= 20 
innerhalb der CarToBM Funktion nach rechts zu bewegen. Warum aber kann ich nicht innerhalb der Car Klasse eine neue public Funktion schreiben, die genau das gleiche ausführt?

PHP-Code:
public function moveCar() : void {
CarContainer.+= 20;

Dann passiert nämlich nichts. Weiß wer Rat?

Besten Dank...
gisinator ist offline   Mit Zitat antworten
Alt 04-12-2011, 22:14   #2 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
du machst alles viel zu kompliziert.
und nur KlassenNamen fangen mit nem Großbuchstaben an:

PHP-Code:
public class Car extends Sprite
{
    private var 
speedX:Number;
    private var 
targetPoint:Point;
    
    
// constructor
    
public function Car() 
    {
        var 
loader:Loader = new Loader();
            
loader.contentLoaderInfo.addEventListener(Event.COMPLETEimageLoaded);
            
loader.load(new URLRequest("BangBus.png"));
    }
    
    private function 
imageLoaded(evt:Event) : void 
    
{
        
e.currentTarget.removeEventListener(Event.COMPLETEimageLoaded);
        var 
bm:DisplayObjecte.currentTarget.content;
            
bm.= -bm.width/2;
            
bm.= -bm.height/2;
        
addChild(bm);
    }

PHP-Code:
var car:Car = new Car();
addChild(car);

addEventListener(Event.ENTER_FRAMEloop);
function 
loop(e:Event):void
{
    
car.+= 2;

Zitat:
innerhalb der CarToBM Funktion nach rechts zu bewegen. Warum aber kann ich nicht innerhalb der Car Klasse eine neue public Funktion schreiben, die genau das gleiche ausführt?
vermutlich, weil du sie aufrufst, bevor das Bild geladen wurde; somit gibt es CarContainer noch garnicht

und bei "Car1" ahne ich auch schon böses. schau dir mal Arrays an!
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist gerade online   Mit Zitat antworten
Alt 04-12-2011, 22:19   #3 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von gisinator Beitrag anzeigen
Warum aber kann ich nicht innerhalb der Car Klasse eine neue public Funktion schreiben, die genau das gleiche ausführt?

PHP-Code:
public function moveCar() : void {
CarContainer.+= 20;

Dann passiert nämlich nichts. Weiß wer Rat?
Ich vermute, Du rufst diese Funktion auf, bevor das Bild geladen und CarToBM ausgeführt wurde. Zu diesem Zeitpunkt existiert CarContainer aber noch nicht. Bekommst Du keine entsprechende Fehlermeldung?

P.S.: Du solltest Dir angewöhnen alle Funtionen- und Variablennamen mit einem Kleinbuchstaben zu beginnen. Große Anfangsbuchstaben sind in AS3 nämlich für Klassen reserviert!
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist gerade online   Mit Zitat antworten
Alt 04-12-2011, 23:11   #4 (permalink)
Neuer User
 
Registriert seit: Dec 2011
Beiträge: 3
Herzlichen Dank euch beiden, das mit den Großbuchstaben werde ich in Zukunft berücksichtigen.

Es hat einen Grund, warum ich das geladene Bild "kompliziert" in ein Sprite packe: Ich will es später rotieren können, und zwar so, dass es sich um den Mittelpunkt dreht. Dazu packe ich es in einen Sprite Container, verschiebe es um die Hälfte der Größe nach oben und links und rotiere später den Container.

Zum zweiten Punkt: Die Funktion CarToBM wird erst aufgerufen, wenn das Bild geladen ist. Wenn ich nun in diese CarToBM einen weiteren EventListener packe:

PHP-Code:
addChild(CarContainer);            
CarContainer.addEventListener(Event.ADDED_TO_STAGEmoveCar); 
müsste doch die Funktion moveCar, die den Container verschiebt, wirklich erst aufgerufen werden, wenn sowohl das Bild geladen als auch der Container zur Bühne hinzugefügt wurde. Dem ist aber nicht so. Wisst ihr warum?

//edit: Bin selbst drauf gekommen: Der EventListener muss natürlich vor dem adden hinzugefügt werden...

Gruß,

Gisi

Geändert von gisinator (04-12-2011 um 23:26 Uhr)
gisinator ist offline   Mit Zitat antworten
Alt 04-12-2011, 23:26   #5 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
Zitat:
Zitat von gisinator
Es hat einen Grund, warum ich das geladene Bild "kompliziert" in ein Sprite packe
der Loader ist ein Container für das Bild das geladen werden soll
dann machst du ein abbild von Container samt Bild, (bmd.draw)
dieses packst du in den Container CarContainer (CarContainer.addChild(BM))
und diesen packst du wiederum in den container Car (this.addChild(CarContainer))
(ja, auch Car ist ein Container für das Bild darin)

also mir fällt kein einziger guter Grund ein, es so "kompliziert" zu machen

Zitat:
Zitat von gisinator
Die Funktion CarToBM wird erst aufgerufen, wenn das Bild geladen ist.
das würde ich mal stark bezweifeln, weil du (zumindest in dem gezeigten Code) nirgends prüfst, ob sie bereits ausgeführt wurde.

Zitat:
Zitat von gisinator
müsste doch die Funktion moveCar, die den Container verschiebt, wirklich erst aufgerufen werden, wenn sowohl das Bild geladen als auch der Container zur Bühne hinzugefügt wurde
ja, in dem Fall wird sie genau einmal aufgerufen, sobald das bild fertig geladen wurde, und somit der Container hinzugefügt wurde.
das heisst aber nicht, dass sie nicht schon vorher aufgerufen werden kann, und genau hier liegt ja dein Problem.

Zitat:
Zitat von gisinator
Dazu packe ich es in einen Sprite Container, ...
Zitat:
Zitat von thomas_E
PHP-Code:
addChild(bm); 
Zitat:
Zitat von gisinator
... verschiebe es um die Hälfte der Größe nach oben und links ...
Zitat:
Zitat von thomas_E
PHP-Code:
bm.= -bm.width/2;
bm.= -bm.height/2
Zitat:
Zitat von gisinator
und rotiere später den Container
PHP-Code:
var car:Car = new Car();
addChild(car);

addEventListener(Event.ENTER_FRAMEloop);
function 
loop(e:Event):void
{
    
car.+= 2;
    
car.rotation += 1;   //<--

__________________
greetz Thomas

plz RTFM & Coding Conventions

Geändert von thomas_E (04-12-2011 um 23:27 Uhr)
thomas_E ist gerade online   Mit Zitat antworten
Alt 04-12-2011, 23:39   #6 (permalink)
Neuer User
 
Registriert seit: Dec 2011
Beiträge: 3
Vielen Dank für die ausführliche und hilfreiche Antwort, klingt alles sehr logisch, was du erklärst. Werde meine komplizierte Umsetzung entsprechend umbauen, wieder was gelernt. Merci!
gisinator ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
MC aus Klasse heraus aufrufen magic_al ActionScript 3 16 29-11-2011 22:20
Sprite-Instanzen aus einer Klasse heraus löschen bzw. gezielt überschreiben! vortexghost ActionScript 3 6 31-08-2010 20:35
Aus Klasse heraus auf Bühnenobjekt zugreifen Randy ActionScript 3 3 15-10-2009 11:10
Klasse aus Klasse heraus ansprechen? echo5-7 ActionScript 2 5 11-04-2008 11:39
variable aus klasse heraus ändern nonverbla ActionScript 2 4 12-09-2007 12:01


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:42 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele