Zurück   Flashforum > Flash > ActionScript > Spielkonzepte und Spieleprogrammierung

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 09-01-2007, 10:42   #1 (permalink)
Neuer User
 
Benutzerbild von K-Grabowski
 
Registriert seit: Jan 2003
Ort: Arminia!!!! Bielefeld
Beiträge: 1.138
Richtige Tiefen bei Iso-Spiel mit unterschiedlich Großen Objekten

Hi,

hab gerade ein dickes Problem bei der Zeichenreihenfolge von Elementen bei einer Iso-Engine. Ich hoffe es gibt überhaupt eine Lösung.

Also ich möchte verschiedene Objekte darstellen, welche völlig unterschiedliche Breiten und Größen haben, unabhängig von der Tile-Size. Auch die Positionierung ist soll völlig unabhängig sein. Leider kommt es bei mir immer wieder zu aussetzern wo etwas nicht passt.

Vielleicht hat ja jemand ein paar Tipps für mich.

hier mal ne Skizze:
__________________
Wieviel hätte ich also für dieses Fahrzeug zu investieren???

Geändert von K-Grabowski (09-01-2007 um 11:20 Uhr)
K-Grabowski ist offline   Mit Zitat antworten
Alt 09-01-2007, 10:43   #2 (permalink)
Neuer User
 
Benutzerbild von K-Grabowski
 
Registriert seit: Jan 2003
Ort: Arminia!!!! Bielefeld
Beiträge: 1.138
Im Moment Vergleiche ich folgendermaßen, was allerdings das ergebnis aus einem verzweifelten Montag war:

ActionScript:
  1. import com.bb.zdf.einszweidrei.models.ingame.IMapObject;
  2. import com.bb.zdf.einszweidrei.Logger;
  3. /**
  4. * @author potq
  5. */
  6. class com.bb.zdf.einszweidrei.models.ingame.DepthComparator {
  7.    
  8.     public function DepthComparator() {
  9.        
  10.     }
  11.    
  12.     public function compare (o1:IMapObject, o2:IMapObject):Number {
  13.        
  14.         // returns the object which is drawn first to screen
  15.        
  16.        
  17.        
  18.         var xPos1:Number = o1.getX();
  19.         var xPos2:Number = o2.getX();
  20.        
  21.         var xSize1:Number = o1.getSizeX();
  22.         var xSize2:Number = o2.getSizeX();
  23.        
  24.         var ySize1:Number = o1.getSizeY();
  25.         var ySize2:Number = o2.getSizeY();
  26.        
  27.         var yPos1:Number = o1.getY();
  28.         var yPos2:Number = o2.getY();
  29.        
  30.         var yMax1:Number = yPos1 + ySize1;
  31.         var yMax2:Number = yPos2 + ySize2;
  32.         
  33.         var xMax1:Number = xPos1 + xSize1;
  34.         var xMax2:Number = xPos2 + xSize2;
  35.        
  36.         var zSize1:Number = o1.getSizeZ();
  37.         var zSize2:Number = o2.getSizeZ();
  38.        
  39.         var sameXRegion:Boolean;
  40.         if ((xMax1 > xPos2 && xPos1 < xPos2) || (xMax2 > xPos1 && xPos2 < xPos1)) {
  41.             sameXRegion = true;
  42.         } else {
  43.             sameXRegion = false;
  44.         }
  45.        
  46.         var sameYRegion:Boolean;
  47.         if ((yMax1 > yPos2 && yPos1 < yPos2) || (yMax2 > yPos1 && yPos2 < yPos1)) {
  48.             sameYRegion = true;
  49.         } else {
  50.             sameYRegion = false;
  51.         }
  52.        
  53.         if (sameXRegion) {
  54.             if (yPos1 < yPos2) {
  55.                
  56.                 return -1;
  57.             } else if (yPos1 > yPos2) {
  58.                
  59.                 return 1;
  60.             } else {
  61.                
  62.                 if (xPos1 < xPos2) {
  63.                     return -1;
  64.                 } else if (xPos1 > xPos2) {
  65.                     return 1;
  66.                 }
  67.                 return 0;
  68.             }
  69.         } else if (sameYRegion) {
  70.            
  71.                 if (xPos1 < xPos2) {
  72.                     return -1;
  73.                 } else if (xPos1 > xPos2) {
  74.                     return 1;
  75.                 } else {
  76.                     if (yMax1 < yMax2) {
  77.                         return -1;
  78.                     } else if (yMax1 > yMax2) {
  79.                         return 1;
  80.                     }
  81.                 }
  82.                 return 0;
  83.         } else {
  84.             if (yPos1 <= yPos2) {
  85.                 return -1;
  86.             } else if (yPos1 > yPos2) {
  87.                 return 1;
  88.             } else {
  89.                
  90.                 return 0;
  91.             }
  92.         }
  93.        
  94.    
  95.         
  96.     }
  97.    
  98.     
  99.    
  100.     
  101.     
  102. }
__________________
Wieviel hätte ich also für dieses Fahrzeug zu investieren???

Geändert von K-Grabowski (09-01-2007 um 10:45 Uhr)
K-Grabowski ist offline   Mit Zitat antworten
Alt 09-01-2007, 11:54   #3 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.147
Nur so eine Idee, wenn der Registrierungspunkt eines Objektes "ganz unten" ist, dann müsste man nur noch die _y vergleichen und das Objekt, das den größten _y Wert hat, ist ganz vorne.

Der Boden liegt komplett unt den Objekten.

Eine andere Möglichkeit wäre, sich am Boden zu orientieren und die Kacheln für Tiefenwertberechnungen zu nutzen in dem man die kacheln intdiziert und dann vergleich, auf welcher Kachel sich ein Objekt befindet, daraus wird dann die Tiefe (z-Koordinate) ermittelt.
Omega Psi ist offline   Mit Zitat antworten
Alt 10-01-2007, 09:24   #4 (permalink)
Neuer User
 
Benutzerbild von K-Grabowski
 
Registriert seit: Jan 2003
Ort: Arminia!!!! Bielefeld
Beiträge: 1.138
habs inzwischen gelöst.

Die untere linke ecke alleine reicht nicht bei verschieden großen Objekten. Das Geheimniss ist erstmal nachzuschauen ob die beiden objekte einen gemeinsamen x bereich haben. danach den mittelpunkt der beiden objekte für diesen bereich ausrechnen, und dann schauen welcher dieser beiden mittelpunkte den größeren abstand zum ursprung hat. Der größere Abstand wird zuletzt gezeichnet. Falls sie keinen gemeinsamen x-bereich haben, einfach das objekt zuerst zeichen das den kleineren x-wert hat.

ActionScript:
  1. import com.bb.zdf.einszweidrei.models.ingame.IMapObject;
  2. import com.bb.zdf.einszweidrei.Logger;
  3. import flash.geom.Point;
  4. /**
  5. * @author potq
  6. */
  7. class com.bb.zdf.einszweidrei.models.ingame.DepthComparator {
  8.    
  9.     public function DepthComparator() {
  10.        
  11.     }
  12.    
  13.     public function compare (o1:IMapObject, o2:IMapObject):Number {
  14.        
  15.         // returns the object which is drawn first to screen
  16.        
  17.         /*
  18.         var tl1:Point = o1.getIsoRect().topLeft.clone();
  19.         var tl2:Point = o2.getIsoRect().topLeft.clone();
  20.        
  21.         var bl1:Point = new Point(o1.getIsoRect().left + o1.getSizeX()/2 ,o1.getIsoRect().bottom);
  22.         var bl2:Point = new Point(o1.getIsoRect().left + o1.getSizeX()/2 ,o1.getIsoRect().bottom);
  23.         
  24.         var xMin1:Number = o1.getX();
  25.         var xMin2:Number = o2.getX();
  26.        
  27.         var xMax1:Number = xMin1 + o1.getSizeX();
  28.         var xMax2:Number = xMin2 + o2.getSizeX();
  29.         */
  30.        
  31.        
  32.         var x1:Number = o1.getX();
  33.         var x2:Number = o2.getX();
  34.        
  35.         var xMax1:Number = x1 + o1.getSizeX();
  36.         var xMax2:Number = x2 + o2.getSizeX();
  37.        
  38.         var intersectionMinX:Number;
  39.         var intersectionMaxX:Number;
  40.        
  41.         var p1:Point;
  42.         var p2:Point;
  43.        
  44.         var dist1:Number;
  45.         var dist2:Number;
  46.        
  47.        
  48.         var intersectsX:Boolean = (x2 >= x1 && x2 < xMax1) || (x1 >= x2 && x1 < xMax2);
  49.         if (intersectsX) {
  50.             // calc intersection
  51.             intersectsX = true;
  52.             intersectionMinX = Math.max(x1,x2);
  53.             intersectionMaxX = Math.min(xMax1, xMax2);
  54.             p1 = new Point(intersectionMinX + (intersectionMaxX - intersectionMinX)/2, o1.getY() + o1.getSizeY()/2);
  55.             p2 = new Point(intersectionMinX + (intersectionMaxX - intersectionMinX)/2, o2.getY() + o2.getSizeY()/2);
  56.            
  57.             dist1 = Math.sqrt(p1.x * p1.x + p1.y * p1.y);
  58.             dist2 = Math.sqrt(p2.x * p2.x + p2.y * p2.y);
  59.            
  60.            
  61.             // return value dependent on Intersection
  62.             if (dist1 < dist2) {
  63.                
  64.                 return -1;
  65.             } else if (dist1 > dist2) {
  66.                
  67.                 return 1;
  68.             }
  69.            
  70.             return 0;
  71.         }
  72.        
  73.        
  74.         // no intersection X
  75.         if (x1 > x2) {
  76.            
  77.             return 1;
  78.         } else if (x1 < x2) {
  79.            
  80.             return -1;
  81.         }
  82.        
  83.         return 0;
  84.        
  85.        
  86.        
  87.        
  88.         
  89.     }
  90.    
  91.     
  92.    
  93.     
  94.     
  95. }
__________________
Wieviel hätte ich also für dieses Fahrzeug zu investieren???

Geändert von K-Grabowski (10-01-2007 um 09:44 Uhr)
K-Grabowski 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 18:24 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele