|
Beiträge: 8 Registriert: Sep 2011
| 26.09.2011, 21:14
Hi ich bin noch relativ neu beim Flash proggen und versuche jetzt schon eine weile einen weg zu finden wie ich aus meiner Klasse den Inhalt von ein paar variablen in ein Textfeld bekomme.
Über die suche hab ich das mit dem getChildByName gefunden aber noch nicht hinbekommen das es klappt.
ActionScript:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | package
{
import flash.display.*;
import flash.events.Event;
public class item extends MovieClip
{
public var itemname:String;
public var itemid:int;
public var att:int;
public var def:int;
public var inslot:int;
public var slot:int;
public var beschreibung:String;
public var menge:int;
public var pic:Loader;
public var _myMC:MovieClip;
public function dingklick(e)
{
if(stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event=null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
//ab jetzt sind stage und root verfügbar, ab jetzt kannst du damit arbeiten
_myMC = root.getChildByName("tooltip") as MovieClip
}
}
}
|
als fehler kommt :
Zeile 31 1061: Aufruf für eine möglicherweise nicht definierte Methode getChildByName über einen Verweis mit statischem Typ flash.display:DisplayObject.
hoffe mir kann da jemand helfen
Danke schonmal. |
Geändert von Tic2k am 26.09.11 um 21:15 Uhr | |
|
Werbung |
Beiträge: 0 Registriert: Feb 2016
| |
|
Beiträge: 147 Wohnort: Qo'noS Registriert: Nov 2009
| 27.09.2011, 22:13
Du musst root als MovieClip casten:
ActionScript:1 | _myMC= MovieClip(root).getChildByName("tooltip") as MovieClip;
|
Loading comments... |
|
|
Beiträge: 8 Registriert: Sep 2011
Themenautor/in
| 27.09.2011, 23:22
okay hab das so geändert und nun gehts nicht weiter weil das event nicht ausgelöst wird. Das Feld ist auch schon auf der Bühne bevor die function darauf zugreift.
und in das textfeld schreiben müsste dann mit
ActionScript:1 | _myMC.text="beschreibung";
|
gehen oder? |
|
|
Beiträge: 147 Wohnort: Qo'noS Registriert: Nov 2009
| 28.09.2011, 21:47
Ja, das geht.
Und ändere einfach das Event auf das du achtest.
Von "ADDED_TO_STAGE" zu "ADDED".
Dann musst du nur noch überprüfen ob das Target des Events wirklich dein Item ist.
ActionScript:1 2 3 4 5 6 7 8 | private function init(e:Event = null):void
{
if (e.target == this && this.stage)
{
this.removeEventListener(Event.ADDED, init);
//Mach hier was du willst.
}
}
|
Loading comments... |
|
Werbung |
Beiträge: 0 Registriert: Feb 2016
| |
|
Beiträge: 8 Registriert: Sep 2011
Themenautor/in
| 29.09.2011, 12:41
auch mit
ActionScript:1 | addEventListener(Event.ADDED, init);
|
scheint es so als ob das event nie ausgelöst wird.
ist immer "null"
Müsste ich im Hauptscript dafür noch irgendwas machen oder auf etwas achten? |
|
|
Beiträge: 147 Wohnort: Qo'noS Registriert: Nov 2009
| 29.09.2011, 12:51
Na must natürlich eine Item instanz zur Anzeigeliste im Hauptskript hinzufügen. Über "addChild()" oder "addChildAt()"Loading comments... |
|
|
Beiträge: 8 Registriert: Sep 2011
Themenautor/in
| 29.09.2011, 13:03
das objekt wird dort so erstellt.
Ist zwar noch nicht schön aber soll erstmal nur funktionieren.
ActionScript:1 2 3 4 5 6 7 | ding[i]=new item();
ding[i].pic = new Loader();
addChild( ding[i].pic );
ding[i].pic.load( new URLRequest( (i+1)+".png" ) );
ding[i].pic.x=200+(i*64);
ding[i].pic.y=200;
ding[i].pic.addEventListener(MouseEvent.CLICK, ding[i].dingklick);
|
ich denke mal du meinst das oder? |
Geändert von Tic2k am 29.09.11 um 13:05 Uhr | |
|
|
Beiträge: 147 Wohnort: Qo'noS Registriert: Nov 2009
| 29.09.2011, 19:41
Ich habe da einige Vorschläge das noch zu optimieren:
1. Wenn die Item Klasse keine Zeitleiste benötigt, verwende Sprite statt MovieClip als erweiterte Klasse um Speicherplatz einzusparen.
2. Konventionsgemäß werden Klassennamen groß geschrieben ;)
3. Überschreibe den Konstruktor wenn Aktionen ausgeführt werden sollen, sobald eine Klasse instanziert wird.
4. Erstelle eine private Methode "init()", die im Konstruktor aufgerufen wird. Code im Konstruktor wird vom Compiler nicht optimiert, sonstiger Code schon.
5. Eigenschaften werden normalerweise Gekapselt, d.h: Die Variablen werden als private deklariert und öffentliche getter/setter erstellt. Dadurch erhält man mehr Kontrolle, kann schreibgeschützte Elemente erstellen und man kann gegebenenfalls sofort eine Aktion ausführen wenn der Wert einer Eigenschaft geändert wird.
Zuerst sehen wir uns die Klasse "Item" an:
ActionScript:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | package
{
import flash.display.Loader;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.net.URLRequest;
public class Item extends Sprite //Item großgeschrieben, wie in der Checkliste vorher besprochen
{
//Variablen werden als "private" deklariert"
private var itemname:String;
private var itemid:int;
private var att:int;
private var def:int;
private var inslot:int;
private var slot:int;
private var beschreibung:String;
private var menge:int;
private var pic:Loader;
private var _myMC:MovieClip;
public function Item(i:int) //Der Konstruktor hat keinen Rückgabewert, nicht einmal "void"
{
init(i);
}
private function init(i:int):void
{
pic = new Loader();
this.addChild(pic);
pic.load(new URLRequest((i+1)+".png"));
this.x = 200 + (i * 64);
this.y = 200;
this.addEventListener(MouseEvent.CLICK, dingClick);
}
private function dingClick(e:MouseEvent):void
{
//Das ADDED event entfällt, da man ein DisplayObject nur anklicken kann wenn es sichtbar auf der Bühne ist.
_myMC= MovieClip(root).getChildByName("tooltip") as MovieClip;
//Sonstiger Code der ausgeführt werden soll wenn das Item angeklickt wird.
}
public function set itemName(value:String):void
{
itemname = value;
}
public function get itemName():String
{
return itemname;
}
public function set itemId(value:int):void
{
itemid = value;
}
public function get itemId():int
{
return itemid;
}
//Das ganze geht jetzt mit allen Variablen weiter die du öffenlich zugänglich machen möchtest. Mit _myMC und pic solltest du das aber nicht machen oder zumindest den setter weglassen um die Eigenschaft für die Öffentlichkeit schreibgeschützt zu machen.
}
}
|
So, und jetzt zu der Schleife:
ActionScript:1 2 3 | var item:Item = new Item(i);
this.addChild(item);
dings[i] = item;
|
So das wars...Loading comments... |
|
|
Beiträge: 8 Registriert: Sep 2011
Themenautor/in
| 30.09.2011, 09:57
Schonmal danke für die verbesserungen. Ich denke mal ich habe das soweit umgesetzt und verstanden.
Aber
wirft bei mir diesen Fehler aus:
TypeError: Error #1006: addChild ist keine Funktion.
at MethodInfo-331()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()
Wenn ich aber das "this" weglasse läuft es schonmal alles wie es soll bis auf das Hauptproblem leider.
Die ausgabe sieht erstmal so aus zum testen:
ActionScript:1 2 3 4 5 6 7 | private function dingClick(e:MouseEvent):void
{
//Das ADDED event entfällt, da man ein DisplayObject nur anklicken kann wenn es sichtbar auf der Bühne ist.
_myMC= MovieClip(root).getChildByName("tooltip") as MovieClip;
//Sonstiger Code der ausgeführt werden soll wenn das Item angeklickt wird.
_myMC.text="Zeig mir was";
}
|
Und hier bekomme ich dann wieder:
TypeError: Error #1009: Der Zugriff auf eine Eigenschaft oder eine Methode eines null-Objektverweises ist nicht möglich.
at Item/dingClick()
Ich hoffe du kannst mir da noch weiterhelfen. |
|
|
Beiträge: 147 Wohnort: Qo'noS Registriert: Nov 2009
| 30.09.2011, 10:49
Ah, verwende statt root einfach "stage" und lass MovieClip weg.Loading comments... |
|
|
Beiträge: 8 Registriert: Sep 2011
Themenautor/in
| 30.09.2011, 11:15
ActionScript:1 | _myMC= stage.getChildByName("tooltip") as MovieClip;
|
bringt leider die selbe Fehlermeldung |
|
|
Beiträge: 147 Wohnort: Qo'noS Registriert: Nov 2009
| 30.09.2011, 11:20
Bitte lade einmal dein gesamtes Projekt hoch, damit ich mir das mal ansehen kann. Ich möchte nämlich auch einen gesamten Überblick haben.Loading comments... |
|