Objekte an richtiger Stelle zeichnen
Übersicht

jeykeyBetreff: Objekte an richtiger Stelle zeichnen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
jeykey |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Die Karte ist eine Speicherbank, wo Kollisionen Tiles etc. drin steht.
Und für die NPC's verwende ich ne TList. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
matze-t |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group