Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 01-07-2011, 14:21   #1 (permalink)
Neuer User
 
Registriert seit: Dec 2010
Beiträge: 18
Question Childadrray sortieren

Hallo liebe Community!
Ich habe ein komisches Problem!

Ich füge in einem Loop Objekte zum Stage hinzu:

Code:
var iso:IsoBox;
for(var i:int=1; i<roomy+1; i++)
{
	for(var j:int=1; j<roomx+1; j++)
	{
		iso = new IsoBox();
		iso.addEventListener(MouseEvent.CLICK, isoclicked);
		iso.setSize(cellSize, cellSize, 1);
		iso.styleType = RenderStyleType.SHADED;
		iso.fill = new SolidColorFill(0xFFFFFF, 1);
		iso.moveBy(j*cellSize, i*cellSize, 1);
		iso.name = i + " " + j;
		room.roomScene.addChild(iso);
		room.roomScene.render();
	}
}
Und danach ein anderes Objekt:

Code:
_core._myself.setSize(cellSize, cellSize, cellSize);
_core._myself.sprites = [prsxplu];
var myselfx:int = 0;
var myselfy:int = 0;
if(roomdoory == -1){
	myselfy = 0;
}else{
	myselfy = roomdoory + 1;
}
if(roomdoorx == -1){
	myselfx = 0;
}else{
	myselfx = roomdoorx + 1;
}
_core._myself.moveTo(myselfx * cellSize, myselfy * cellSize, 0);
room.roomScene.render();
room.roomScene.addChild(_core._myself);
(Das kursiv gescrhiebene ist nicht weiter wichtig!)

Wenn ich nun die Reihenfolge der Childs des Stages ausgebe, kommt
widererwartens folgende Ausgabe:

Code:
var count:int = 0;
while(count <= room.roomScene.numChildren)
{
	trace(room.roomScene.children[count]);
	count++;
}
Ausgabe:
Code:
[IsoBox]
[IsoBox]
[IsoBox]
[IsoSprite]
[IsoBox]
[IsoBox]
...
[IsoBox]
[IsoBox]
[IsoBox]
Das dick geschriebene ist das zuletzt eingefügte Objekt!
Zudem wird das Objekt wenn ich das Projekt debugge unter allen anderen Objekten angezeigt:



Kann mir da jemand helfen?

Danke!
Chris.
PHPChris ist offline   Mit Zitat antworten
Alt 01-07-2011, 15:26   #2 (permalink)
+ Zimt & Zucker
 
Registriert seit: Mar 2006
Ort: hinterm Mond gleich links
Beiträge: 2.041
Ich kenne mich mit der as3isolib nicht aus (danke das du das gleich dazu geschrieben hast )

ich sehe das Problem in der vermutlich automatisch durchgeführten z-sortierung der Bibliothek:

all deine isoBoxen verschiebst du um 1 auf der z achse
dein _core._myself dingens bleibt auf 0.
__________________
anbei Grüße vom milchreis: Viva la [Silb]
"Selbst wenn uns nur noch der Zynismus treibt, wir werden trotzdem einfach immer weiter gehen!"

[Von null auf Flash in einem Klick.] <<< klick
milchreis ist offline   Mit Zitat antworten
Alt 01-07-2011, 16:14   #3 (permalink)
Neuer User
 
Registriert seit: Dec 2010
Beiträge: 18
Hallo,
danke für deine Antwort und sorry dass ich das nicht vorher gesagt habe.

Ich habe jetzt alle möglichen Varianten ausprobiert, per moveBy das Objekt
vor alle anderen Objekte zu krigen, jedoch ändert sich nur die Höhe des Objektes.

Wie kann ich ein Objekt in einer child-Liste über allen anderen anzeigen?
PHPChris ist offline   Mit Zitat antworten
Alt 01-07-2011, 16:25   #4 (permalink)
+ Zimt & Zucker
 
Registriert seit: Mar 2006
Ort: hinterm Mond gleich links
Beiträge: 2.041
Zitat:
Zitat von PHPChris Beitrag anzeigen
Hallo,
jedoch ändert sich nur die Höhe des Objektes.
ja logisch ändert sich die Höhe, denn das ist ja der Wert, den du änderst.
__________________
anbei Grüße vom milchreis: Viva la [Silb]
"Selbst wenn uns nur noch der Zynismus treibt, wir werden trotzdem einfach immer weiter gehen!"

[Von null auf Flash in einem Klick.] <<< klick
milchreis ist offline   Mit Zitat antworten
Alt 01-07-2011, 16:32   #5 (permalink)
Neuer User
 
Registriert seit: Dec 2010
Beiträge: 18
Zitat:
Zitat von PHPChris Beitrag anzeigen
Wie kann ich ein Objekt in einer child-Liste über allen anderen anzeigen?
Siehe Zitat...
Das mit dem logisch sein finde ich logischerweise auch logisch
PHPChris ist offline   Mit Zitat antworten
Alt 01-07-2011, 17:59   #6 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
@PHPChris, scheinbar gibbet grundsätzlich Probleme mit dem Z-Sorting in ISO-Engines
das hier hilft dir vielleicht weiter, oder die Sorting-funktion ebenfalls für deine Zwecke umschreiben
Issue 10 - as3isolib - depth sorting algorithm not sorting properly in various scenarios - ActionScript 3 Isometric Library - Google Project Hosting
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist offline   Mit Zitat antworten
Alt 01-07-2011, 18:39   #7 (permalink)
+ Zimt & Zucker
 
Registriert seit: Mar 2006
Ort: hinterm Mond gleich links
Beiträge: 2.041
Thomas war wieder schneller.
Ich hab mir jetzt mal ddiese bibliothek runtergeladen und etwas ruprobiert:
PHP-Code:
package 
{
    
import as3isolib.display.IsoView;
    
import as3isolib.display.primitive.IsoBox;
    
import as3isolib.display.scene.IsoGrid;
    
import as3isolib.display.scene.IsoScene;
    
import as3isolib.geom.IsoMath;
    
import as3isolib.geom.Pt;
    
import eDpLib.events.ProxyEvent;
    
import flash.display.Sprite;
    
import flash.events.Event;
    
import flash.events.MouseEvent;
    
    
/**
     * @author milchreis
     */
    
public class Main extends Sprite 
    
{
        private const 
CELL_SIZE:Number 40;
        private var 
scene:IsoScene;
        private var 
viewport:IsoView;
        private var 
grid:IsoGrid;
        private var 
a:IsoBox;
        
        public function 
Main():void 
        
{
            if (
stageinit();
            else 
addEventListener(Event.ADDED_TO_STAGEinit);
        }
        
        private function 
init(e:Event null):void 
        
{
            
removeEventListener(Event.ADDED_TO_STAGEinit);
            
// entry point
            
            
grid = new IsoGrid();
            
grid.showOrigin false;
            
grid.cellSize CELL_SIZE;
            
grid.setGridSize(1010);
            
            
scene = new IsoScene();
            
scene.addChild(grid);
            
            
viewport = new IsoView();
            
viewport.setSize(stage.stageWidthstage.stageHeight);
            
viewport.centerOnPt(new Pt(200200));
            
viewport.addScene(scene);
            
addChild(viewport);
            
            var 
b:IsoBox;
            for (var 
i:int 010; ++i)
            {
                for (var 
j:int 010; ++j)
                {
                    
= new IsoBox();
                    
b.setSize(CELL_SIZECELL_SIZE5);
                    
b.CELL_SIZE;
                    
b.CELL_SIZE;
                    
scene.addChild(b);
                }
            }

            
            
= new IsoBox();
            
a.setSize(1010CELL_SIZE);
            
a.5//wenn a.z < 5, dann gibt's Probleme
            
scene.addChild(a);
            
            
            
            
scene.render();
            
            
stage.addEventListener(MouseEvent.MOUSE_DOWNonDown);
        }
        
        private function 
onDown(e:MouseEvent):void 
        
{
            var 
p:Pt = new Pt(mouseXmouseY);
            
IsoMath.screenToIso(p);
            
trace(p);
            
a.p.x;
            
a.p.y;
            
scene.render();
        }
        
    }
    

Eigentlich soll sich der große Block dorthin bewegen, wo die Maus ist.
Aber irgendwie habe ich jetzt auf die Schnelle die Transformation in den isometrischen Raum nicht auf die Reihe bekommen. (mal oben links bissel rumklicken)

Es wird aber deutlich, das die z Position der Figur, wie oben schon geschrieben, entscheidend für das Ergebnis ist.

Wenn du die Höhe der Spielfigur auf einen Wert kleiner 4 änderst kommt Murks raus. Ist auch klar, denn 3dimensional gesehen würden beide Teile dann ineinander stecken. Das lässt sich aber nicht darstellen.

Das die isolib dann gerade falsch rum darstellt, ist nicht schön, das stimmt schon.

Es gilt also was man irgendwann in der Schule mal gelernt hat: "Wo ein Körper ist, kann kein zweiter sein."
Angehängte Dateien
Dateityp: swf isoLibas3n.swf (45,0 KB, 8x aufgerufen)
__________________
anbei Grüße vom milchreis: Viva la [Silb]
"Selbst wenn uns nur noch der Zynismus treibt, wir werden trotzdem einfach immer weiter gehen!"

[Von null auf Flash in einem Klick.] <<< klick
milchreis ist offline   Mit Zitat antworten
Alt 01-07-2011, 22:53   #8 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
habs mir nochmal durch den Kopf gehen lassen
Zitat:
Das die isolib dann gerade falsch rum darstellt, ist nicht schön, das stimmt schon.
naja, was heisst falsch herum, wenn du den Block bei z<5 plazierst, verdeckt er nicht nur teile der Kachel, in der er "drinsteckt", sondern wird wiederrum teilweise von der Kachel verdeckt.
a verdeckt b und b verdeckt a. (zumindest stellenweise) wie willst du das auflösen?
Bei Boxen wirst du das noch "relativ" einfach berechnen können, sobald du dir aber die Schuhe seines verdeckten Männchens anschaust läuft das imho auf Techniken wie Ray-Tracing oder Depth-Buffering in einer 3D-Engine hinaus.

@PHPChris
mein Tipp wäre, dein Männchen 0.5 Pixel über dem Boden schweben zu lassen.
Code:
_core._myself.moveTo(myselfx * cellSize, myselfy * cellSize, 1.5); //1 px Bodenfliese + 0.5 px Levitation
diese Lösung sollte das Problem mit dem geringsten Aufwand zufriedenstellend lösen; Einfacher als jetzt an der Sorting-Routine rumzuschrauben.
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist offline   Mit Zitat antworten
Alt 01-07-2011, 23:12   #9 (permalink)
+ Zimt & Zucker
 
Registriert seit: Mar 2006
Ort: hinterm Mond gleich links
Beiträge: 2.041
Zitat:
Zitat von thomas_E Beitrag anzeigen
a verdeckt b und b verdeckt a. (zumindest stellenweise) wie willst du das auflösen?
eben das wollte ich deutlich machen.

Zitat:
Zitat von thomas_E Beitrag anzeigen
mein Tipp wäre, dein Männchen 0.5 Pixel über dem Boden schweben zu lassen.
hatte ich auch erst gedacht, dann wollte ich es aber lieber nochmal probieren. (siehe meinen code oben)

dort scheint soweit alles glatt zu gehen, wenn die z Position gleich der Bodenhöhe ist. (in meinem Fall 5, bei Chris 1)

so lange also kein ineinander eindringen statt findet, ist die Idometrie wohl in trockenen Tüchern
__________________
anbei Grüße vom milchreis: Viva la [Silb]
"Selbst wenn uns nur noch der Zynismus treibt, wir werden trotzdem einfach immer weiter gehen!"

[Von null auf Flash in einem Klick.] <<< klick
milchreis ist offline   Mit Zitat antworten
Alt 02-07-2011, 14:36   #10 (permalink)
Neuer User
 
Registriert seit: Dec 2010
Beiträge: 18
So!
Danke für alle Antworten!
Es klapp jetzt einigermassen.

Aber:
Wenn ich einen Tween benutze tritt der Fehler weiterhin auf:

Code:
Tweener.addTween(_core._myself, { x:targetX, y:targetY, delay:speed * i , time:speed, transition:"linear" } );
Mache ich etwas falsch?

Ich habe es schon mit folgendem probiert:

Code:
Tweener.addTween(_core._myself, { x:targetX, y:targetY, z:1.5, delay:speed * i , time:speed, transition:"linear" } );
Danke für Eure Hilfe!
PHPChris ist offline   Mit Zitat antworten
Alt 02-07-2011, 14:50   #11 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
das die Figur komplett verdeckt ist?
wie hast du das mit dem rendern eingerichtet? ENTER_FRAME? dann versuch mal folgendes:
PHP-Code:
stage.addEventListener(Event.EXIT_FRAMEreRender);
function 
reRender(e:Event):void
{
    
room.roomScene.render()

afaik sollte das nach allen ENTER_FRAME Events ausgeführt werden, also auch nach dem Zeitgeber von Tweener.

wo genau ist der Registrierungspunkt der Figur? unten?
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist offline   Mit Zitat antworten
Alt 02-07-2011, 14:57   #12 (permalink)
Neuer User
 
Registriert seit: Dec 2010
Beiträge: 18
Thumbs up

Du bist mein Mann!
Danke für die Hilfe!

Hat geholfen xD

-Lösung-

-> Alle IsoBoxen auf z = 1 setzen
-> Das IsoSprite (Die Figur) auf z = 1.5 setzen (Sodass sie schwebt)
-> Wenn man einen Tweener benutzt den Loop nicht mit ENTER_FRAME sondern mit EXIT_FRAME verwenden!

Code:
var isoBox:IsoBox = new IsoBox();
//Eingenschaften
isoBox.z = 1;
Code:
var isoSprite:IsoSprite = new IsoSprite();
//Eigenschaften
isoSprite.z = 1.5;
Code:
stage.addEventListener(Event.EXIT_FRAME, reRender);

function reRender(e:Event):void
{
	isoScene.render();
}
THX an milchreis & thomas_E

Chris.

Geändert von PHPChris (02-07-2011 um 14:58 Uhr)
PHPChris ist offline   Mit Zitat antworten
Alt 02-07-2011, 15:04   #13 (permalink)
+ Zimt & Zucker
 
Registriert seit: Mar 2006
Ort: hinterm Mond gleich links
Beiträge: 2.041
Jetzt bin ich verwirrt, schließlich sind doch deine IsoBoxen 1 hoch, oder?
Wenn man die in eine Höhe von (z Position) 1 setzt, dannn müsste man sich doch, um wirklich über ihnen zu sein, auf z = 2 stellen.

Warum sind überhaupt die Boxen auf z = 1?

@Thomas, das ist interessant, ich konnte mir bisher nie einen konkreten Anwendungsfall für ExitFrame überlegen.
__________________
anbei Grüße vom milchreis: Viva la [Silb]
"Selbst wenn uns nur noch der Zynismus treibt, wir werden trotzdem einfach immer weiter gehen!"

[Von null auf Flash in einem Klick.] <<< klick
milchreis ist offline   Mit Zitat antworten
Alt 02-07-2011, 15:05   #14 (permalink)
Neuer User
 
Registriert seit: Dec 2010
Beiträge: 18
Du das weiss ich auch nicht :/
ICh bin nur froh dass es funzt
PHPChris ist offline   Mit Zitat antworten
Alt 02-07-2011, 15:34   #15 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
Zitat:
Warum sind überhaupt die Boxen auf z = 1?
Zitat:
Du das weiss ich auch nicht :/
ICh bin nur froh dass es funzt
rofl
Edit: je öfter ich das lese, desto mehr schmeiss ich mich weg
ich meinte eigentlich auch, dass die boxen bei z=0 bleiben sollten, damit deren Oberkante bei z: 1 liegt, aber wenn es so für ihn funzt, wieso debattieren?

Zitat:
@Thomas, das ist interessant, ich konnte mir bisher nie einen konkreten Anwendungsfall für ExitFrame überlegen.
im nachhinein, bin ich mir auch nicht mehr ganz sicher, ob der Rendervorgang noch im selben Frame durchgeführt (eher dargestellt) wird, oder ob die Grafik nun der Datenlage um 1 Frame hinterherhinkt, aber ich denke, das ist verschmerzbar.
__________________
greetz Thomas

plz RTFM & Coding Conventions

Geändert von thomas_E (02-07-2011 um 18:23 Uhr)
thomas_E ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
actionscript, child, children, reihenfolge, sortieren

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
xml sortieren Waldmensch ActionScript 3 2 08-07-2010 21:50
XML sortieren bruce_wayne ActionScript 3 3 29-03-2008 16:42
xml sortieren chanel Flash Einsteiger 8 01-11-2006 19:12
Sortieren Mondo PHP und MySQL 8 23-01-2004 18:34
MC´s neu sortieren marcom ActionScript 1 2 21-10-2002 15:18


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

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


Copyright ©1999 – 2012 Marc Thiele