Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 06-12-2002, 12:44   #1 (permalink)
-------------------------
 
Benutzerbild von Marpfei
 
Registriert seit: Jul 2002
Ort: Zürich
Beiträge: 159
MX:Eigenschaft einer Klasse ansprechen

Hi,

ich bin komplett neu auf dem OO-Gebiet und habe hier mal ne Klasse kreiert und versuche jetzt auf die Eigenschaft eines Objektes zuzugreifen - aber es funzt nicht.

Das Objekt ist als MC auf die Hauptebene 'attached' (raum), in dem ich unter anderem das Objekt 'p' mit Koordinaten gefüllt habe.

Jetzt versuche ich diese Koordinaten über

trace(this.raum.p[0]);

anzusprechen, und es gibt mir 'undefined' aus.

Bitte nicht lachen - ich glaube, ich habe da etwas Grundsätzliches nicht verstanden. Kann mir jemand einen hilfreichen Wink geben?

Marpfei

Variable _level0.raum = [Objekt #27, Klasse 'Poly3D'] {
p:[Objekt #28, Klasse 'Array'] [
0:[Objekt #29, Klasse 'Vertex'] {
x:-5000,
y:4000,
z:6500,
ox:-5000,
oy:4000,
oz:6500,
sx:0,
sy:0
},
1:[Objekt #30, Klasse 'Vertex'] {
x:5000,
y:4000,
z:6500,
ox:5000,
oy:4000,
oz:6500,
sx:0,
sy:0
}
Marpfei ist offline   Mit Zitat antworten
Alt 06-12-2002, 12:46   #2 (permalink)
Trainman
 
Benutzerbild von Hamster2k
 
Registriert seit: Sep 2001
Ort: Wien, Österreich
Beiträge: 1.324
hmm... was spuckt er aus, wenn du
trace(this.raum.p[0].x);
eingibst?
__________________
So much to learn and so little time.

Ich liebe dieses Forum!!
Hamster2k ist offline   Mit Zitat antworten
Alt 06-12-2002, 13:14   #3 (permalink)
-------------------------
 
Benutzerbild von Marpfei
 
Registriert seit: Jul 2002
Ort: Zürich
Beiträge: 159
Tut leid - Tippfehler!

Natürlich meinte ich:

trace(this.raum.p[0].x);

Ich findes es nur komisch. Ich habe die Objekte und kann sie mir auflisten lassen - nur ansprechen kann ich sie nicht. Habe ich da was falsch gemacht?

Ist es vielleicht das x, das als reservierter Name das ganze durcheinander bringt? Aber ich habe x, y, z schon so oft verwendet, und es kam zu keinen Ungereimtheiten.

Marpfei
Marpfei ist offline   Mit Zitat antworten
Alt 06-12-2002, 13:17   #4 (permalink)
Markus Raab
 
Benutzerbild von derRaab
 
Registriert seit: Aug 2001
Ort: Berlin Friedrichshain
Beiträge: 928
trace( this.raum.p[0]["x"] );
derRaab ist offline   Mit Zitat antworten
Alt 06-12-2002, 13:43   #5 (permalink)
-------------------------
 
Benutzerbild von Marpfei
 
Registriert seit: Jul 2002
Ort: Zürich
Beiträge: 159
Hallo der Raab,

ich habe es mit deiner,

trace( this.raum.p[0]["x"] );

und anderen Variationen versucht. Er gibt mir immer 'undefined' zurück.

Kann ich diese Eigenschaften vielleicht anders ansprechen?

Marpfei
Marpfei ist offline   Mit Zitat antworten
Alt 06-12-2002, 14:04   #6 (permalink)
nerdig working
 
Benutzerbild von michael
 
Registriert seit: Jul 2001
Ort: Hamburg
Beiträge: 5.832
ich denke da stimmt irgendetwas in deiner klassendefinition nicht.
normalerweise kommt man mit einer derartigen syntax ja ans ziel:
ActionScript:
  1. function Vertex (x, y, z, ox, oy, oz, sx, sy)
  2. {
  3.     this.x = x;
  4.     this.y = y;
  5.     this.z = z;
  6.     this.ox = ox;
  7.     this.oy = oy;
  8.     this.sx = sx;
  9.     this.sy = sy;
  10. }
  11. p = [];
  12. p[0] = new Vertex (-5000, 4000, 6500, -5000, 4000, 6500, 0, 0);
  13. p[1] = new Vertex (5000, 4000, 6500, 5000, 4000, 6500, 0, 0);
  14.  
  15. trace(this.p[0].x) // gibt -5000 zurück
  16. trace(this.p[1].x) // gibt 5000 zurück
  17.  
gruss
michael

Geändert von michael (06-12-2002 um 14:06 Uhr)
michael ist offline   Mit Zitat antworten
Alt 06-12-2002, 14:34   #7 (permalink)
-------------------------
 
Benutzerbild von Marpfei
 
Registriert seit: Jul 2002
Ort: Zürich
Beiträge: 159
Die Klasse, die ich verwende habe ich aus einem Lehrbuch und bin dabei sie für meine Bedürfnisse umzuschreiben. Ich habe hier extern in einer as-Datei die Objekte definiert (Vertex, Poly3D) und mit der Funktion 'addVertex' schiebe ich die neuen Punkte in das Array p rein. Die Funktion ist unten angegeben.

function Vertex(x,y,z) {
this.x = x;
this.y = y;
this.z = z;
this.ox = x;
this.oy = y;
this.oz = z;
this.sx = 0;
this.sy = 0;
}

function Poly3D(x,y,z) {
this.p = new Array();
this.f = new Array();
this.xpin = x;
this.ypin = y;
this.zpin = z;
this.scale = 100;
}

Poly3D.prototype.addVertex = function(x,y,z) {
this.p.push( new Vertex(x,y,z));
}


Diese Schleife liegt in einem MC (XML-Loader), den ich als Objekt mit #initclip in die Hauptzeitleiste 'attached' habe.

for (i=-1; ++i<anzahlPunkte; ) {
var pXYZ = punkte[i].split(",");
_root.raum.addVertex(Number(pXYZ[0]), Number(pXYZ[1]), Number(pXYZ[2]));
}


Ist das nicht das selbst wie du mir gerade gezeigt hast?

Marpfei
Marpfei ist offline   Mit Zitat antworten
Alt 06-12-2002, 15:47   #8 (permalink)
Trainman
 
Benutzerbild von Hamster2k
 
Registriert seit: Sep 2001
Ort: Wien, Österreich
Beiträge: 1.324
also
ActionScript:
  1. function Vertex(x,y,z) {
  2. this.x = x;
  3. this.y = y;
  4. this.z = z;
  5. this.ox = x;
  6. this.oy = y;
  7. this.oz = z;
  8. this.sx = 0;
  9. this.sy = 0;
  10. }
  11.  
  12. function Poly3D(x,y,z) {
  13. this.p = new Array();
  14. this.f = new Array();
  15. this.xpin = x;
  16. this.ypin = y;
  17. this.zpin = z;
  18. this.scale = 100;
  19. }
  20.  
  21. Poly3D.prototype.addVertex = function(x,y,z) {
  22. this.p.push( new Vertex(x,y,z));
  23. }
  24. hui = new poly3d(0,0,0);
  25. hui.addvertex(10,10,0);
  26. trace(hui.p[0].x);
gibt ordnungsgemäß "10" zurück
der fehler liegt irgendwo anders...
__________________
So much to learn and so little time.

Ich liebe dieses Forum!!
Hamster2k ist offline   Mit Zitat antworten
Alt 06-12-2002, 16:01   #9 (permalink)
nerdig working
 
Benutzerbild von michael
 
Registriert seit: Jul 2001
Ort: Hamburg
Beiträge: 5.832
hm entweder hast du ein timingproblem (trace aufgerufen bevor klasse deklariert wurde)
oder ein pfad-problem duch #initclip.

wenn p und dessen inhalte innerhalb von #initclip - #endinitclip erzeugt werden ist der pfad zum tracen von der hauptzeitleiste nicht mehr this.raum.p[0].x sondern this.p[0].x


gruss
michael
michael ist offline   Mit Zitat antworten
Alt 06-12-2002, 16:42   #10 (permalink)
-------------------------
 
Benutzerbild von Marpfei
 
Registriert seit: Jul 2002
Ort: Zürich
Beiträge: 159
Also, wenn ich euch nerve, dann sagt es! (Warscheinlich bekomme ich dann eh keine Antworten mehr).

Timingproblem ist es, glaube ich, keines. Ich habe hier das MC (loadXML), mit dem ich die Koordinaten aus dem XML in die Arrays p und l im _root.raum schiesse.

ActionScript:
  1. #initclip
  2. function Loader() {
  3.     this.neueDaten = new XML();
  4.     this.neueDaten.ignoreWhite = true;
  5.     this.neueDaten.pfad = this;
  6.     this.neueDaten.onLoad = this.onXMLLoad;
  7.     this.XMLgeladen = "";
  8. }
  9. Loader.prototype = new MovieClip();
  10. Object.registerClass("loader", Loader);
  11.  
  12. // Diese Methode ruft die Ladefunktion auf
  13. Loader.prototype.ladeDaten = function(uri) {
  14.     this.neueDaten.load(uri);
  15. };
  16.  
  17. // Hier werden die Daten geladen und geparst
  18. Loader.prototype.onXMLLoad = function(stat) {
  19.     var raumArt, zielWand, punkte, linien, anzahlPunkte, anzahlWaende;
  20.     var display = this.pfad.anzeige;
  21.     if (stat) {
  22.         this.XMLgeladen = true;
  23.         // trace(this.firstChild.attributes.model);
  24.         raumArt = this.firstChild.attributes.model;
  25.         zielWand = this.firstChild.attributes.target;
  26.         var punkte = this.firstChild.childNodes[0].firstChild.nodeValue.split(";");
  27.         var linien = this.firstChild.childNodes[1].firstChild.nodeValue.split(";");
  28.         anzahlPunkte = punkte.length;
  29.         anzahlLinien = linien.length;
  30.         anzahlWaende = anzahlPunkte/2;
  31.         // Koordinaten in Zwischenvariable - dann in die p- und l-Arrays schreiben
  32.         for (i=-1; ++i<anzahlPunkte; ) {
  33.             var pXYZ = punkte[i].split(",");
  34.             _root.raum.addVertex(Number(pXYZ[0]), Number(pXYZ[1]), Number(pXYZ[2]))
  35.         }
  36.         for (i=-1; ++i<anzahlLinien; ) {
  37.             var lAB = linien[i].split(",");
  38.             _root.raum.addLine(Number(lAB[0]), Number(lAB[1]));
  39.         }
  40.     } else {
  41.         display.text = "Datenübertragungsfehler";
  42.     }
  43. };
  44. #endinitclip

Aber den Aufruf mache ich in der Hauptzeitleiste:

ActionScript:
  1. #include "3DClasses.as"
  2. raum = new Poly3D(0,0,0);
  3. var initObjekt = {
  4.     _x:750,
  5.     _y:550
  6. };
  7. this.attachMovie("zeichenflaeche","zf",49,initObjekt);
  8. this.createEmptyMovieClip("pad",50);
  9. this.loadXML.ladeDaten("XMLRaum/ccc.xml");
  10. trace( _root.raum.p[0].x);
  11. //zeichneLinie(raum.p,_root.pad);
  12. this.stop();

Vor allem verstehe ich nicht, dass er mir die Klasse im Variablen-Fenster anzeigt und im Programm nicht findet? Mir geht es ja nur darum, aus der Klasse 'raum' in dem Array 'p' das erste Teil anzusprechen. Und ich habe es sogar von _root aus probiert. Er zeigt mir immer nur 'undefined'.


Variable _level0.raum = [Objekt #32, Klasse 'Poly3D'] {
p:[Objekt #33, Klasse 'Array'] [
0:[Objekt #34, Klasse 'Vertex'] {
x:-5000,
y:4000,

Auf jeden Fall Danke für Eure vielseitige Hilfe!

Marpfei
Marpfei ist offline   Mit Zitat antworten
Alt 06-12-2002, 19:25   #11 (permalink)
Neuer User
 
Registriert seit: Jun 2001
Ort: www
Beiträge: 24
Marpfei, doch es sieht nach einem kleinen Timing-Problem aus: du rufst

trace( _root.raum.p[0].x);

direkt nach

this.loadXML.ladeDaten("XMLRaum/ccc.xml");

auf - da sind die Daten aber noch nicht geladen, d.h. der Wert ist 'undefined'. Probiere einfach mal zum Testen das trace() in den onLoad Handler zu verschieben:

ActionScript:
  1. Loader.prototype.onXMLLoad = function(stat) {
  2.         var raumArt, zielWand, punkte, linien, anzahlPunkte, anzahlWaende;
  3.         var display = this.pfad.anzeige;
  4.         if (stat) {
  5.              ...
  6.         } else {
  7.                 display.text = "Datenübertragungsfehler";
  8.         }
  9.            trace( _root.raum.p[0].x); // <- trace hierher verschoben
  10.  
  11. };

Im Ausgabefenster zeigt er dir das deshalb richtig an, weil, wenn du (mit 2-3 Sekunden später) nachschaust, sind die XML-Daten da und der Handler wurde aufgerufen! Nur wenn du gaaaanz schnell das Ausgabefenster öffnet würdest, könntest du auch hier in der Tat ein 'undefined' sehen

hoffe es klappt.
kiriko ist offline   Mit Zitat antworten
Alt 09-12-2002, 08:23   #12 (permalink)
-------------------------
 
Benutzerbild von Marpfei
 
Registriert seit: Jul 2002
Ort: Zürich
Beiträge: 159
Klappt!

Ihr hattet wirklich recht. Es war ein Timingproblem. Mir war nur nicht klar, dass das Programm, wenn es eine Methode einer Klasse von der Hauptzeitleiste aufruft, gleich im Code weitermacht, ohne erst diese Methode vollständigt auszuführen.

Mir ist das ehrlich gesagt nocht nicht ganz klar, was das Programm jetzt wirklich macht, wenn es da zwischen Ebenen, Funktionen, Klassen, Methoden und Frames hin und herspringt. Für mich ist meist das grösste Problem, herauszufinden, wo das Programm gerade den Code ausführt.

Weiss vielleicht jemand eine Quelle, wo genau dieser Sachverhalt genau erklärt wird? - also zB. welcher Code zuerst ausgeführt wird, wenn in einem Programm in verschiedenen Ebenen im selben Frame Code liegt.

Danke allen für die Hilfe!

Marpfei
Marpfei 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



Alle Zeitangaben in WEZ +1. Es ist jetzt 15:35 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele