Objekte an richtiger Stelle zeichnen

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

jeykey

Betreff: Objekte an richtiger Stelle zeichnen

BeitragSo, Apr 12, 2009 19:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich arbeite momentan an einen RPG Spiel und stehe nun vor folgenden Problem:

Ich habe eine große Menge von NPC's. Nun kommt es aber vor, dass z.B sich ein NPC auf der Karte etwas tiefer befindet als ein anderer, und trotzdem hinter dem oberen gezeichnet wird, da die Zeichenroutine einfach nur stur alle NPC's abarbeitet. Ich hatte schon diverse Lösungen dafür, aber die schienen mir alle zu langsam, u. a das Sortieren der Objekte nach der y Position vor jeden Zeichenvorgang.

Ich bin ziemlich sicher, dass man so etwas eleganter und vor allen schneller lösen kann, aber irgentwie komm ich im Moment einfach nicht drauf^^. Ich hoffe jemand kennt das Problem oder kann mir einen Denkansatz geben.

Mfg jeykey

Xeres

Moderator

BeitragSo, Apr 12, 2009 19:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie hast du die Karte und die NPCs realisiert?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

jeykey

BeitragSo, Apr 12, 2009 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Karte ist eine Speicherbank, wo Kollisionen Tiles etc. drin steht.
Und für die NPC's verwende ich ne TList.

Xeres

Moderator

BeitragSo, Apr 12, 2009 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Das sortieren nach y Position klingt doch nicht mal schlecht. Hast du mal gemessen, wie viele Millisekunden du dabei brauchst?

Edit
Bei 20 NPCs brauche ich eine unmessbar kleine Zeitspanne, für 200 NPCs 3 Millisekunden - ist schnell genug finde ich. Kannst du natürlich trotzdem z.B. nur jeden zweiten Schleifendurchlauf ausführen lassen.
Beispielcode:
Code: [AUSKLAPPEN]
SuperStrict


Type TNPCs
   Global list:TList = CreateList()
   
   Field x:Int, y:Int, Leben:Int, Mana:Int
   
   Method New()
      list.AddLast(Self)
   End Method
   
   Function DrawList()
      Print("- - - - - - -")
      For Local npc:TNPCs = EachIn TNPCs.list
         Print(npc.y)
      Next
   End Function
   
   Function SortY:Int(o1:Object, o2:Object)
      Local n1:TNPCs = TNPCs(o1)
      Local n2:TNPCs = TNPCs(o2)
      Return n1.y - n2.y
   End Function
   
End Type

For Local i:Int = 0 To 20
   Local npc:TNPCs = New TNPCs
   npc.x = Rand(0, 800)
   npc.y = Rand(0, 600)
   npc.leben = Rand(10, 100)
   npc.Mana = Rand(10, 100)
Next

Local Start:Float = MilliSecs()
TNPCs.DrawList()
TNPCs.list.Sort(True, TNPCs.SortY)
TNPCs.DrawList()
TNPCs.list.Sort(False, TNPCs.SortY)
TNPCs.DrawList()
Local Dauer:Float = (MilliSecs() - Start)
Print("2 mal sortiert in " + Dauer + " ms")
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

matze-t

BeitragSo, Apr 12, 2009 21:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Was du auch machen könntest:

Sortier die NPCs, wenn du sie erstellst, also wenn des Spiel lädt. Wenn später welche dazu kommen, musst du sie halt einordnen.
Wenn ein NPC dann bewegt wird, prüfst du, ob du ihn nach oben/unten in der Liste verschieben musst. Da die NPCs wahrscheinlich nicht quer über die Karte hüpfen musst du die auch nicht weit verschieben. Wenn du sie dann zeichnest, musst du einfach nur die Liste durchgehn.

Ich progg bloß nicht mit BlitzMax, weiß also nicht ob man das gut realisieren kann und kann keinen Code posten. Hoff es bringt trotzdem was.
 

jeykey

BeitragMo, Apr 13, 2009 13:24
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, ich habe jetzt etwas herumprobiert um habe folgende Lösung gefunden:

Im großen und ganzen funktioniert es so:

Ich habe ein Array mit der Größe der y Auflösung des Bildschirms in Pixel. Jeder Eintrag in diesen Array ist ein Verweis auf eine Liste. In jeder Liste werden nun die Objekte gespeichert, welche die gleiche y-Position haben würden. Diese y-Position ist natürlich nicht die korrekte y-Position, sondern die y-Position auf dem Bildschirm, die vorher ausgerechnet wurde.

Ist diese y-Position außerhalb der Array Größe, oder kleiner als 0, wird das Objekt aus der Liste wieder entfernt, bzw. nicht eingetragen. Somit müssen auch weniger Objekt gezeichnet werden.

Nun überprüft jedes Objekt automatisch ob sich seine "Zeichenposition in y" ändert und schaut nach, ob es von einer Liste in die andere verschoben werden muss, bzw wieder aus dem Listenarray raus muss.

Das ganze läuft bei mir einwandfrei:
5000 NPC's
Auflösung: 1024 * 768
Kartengröße 100 * 100 Felder, wobei 1 Feld = 32 Pixel

Mein Pc:
1, 8 Ghz, 2 Gb Ram

Danke für eure Ideen
mfg jeykey

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group