HideEntitiy/ShowEntity richtig anwenden
Übersicht

NerleBetreff: HideEntitiy/ShowEntity richtig anwenden |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Bevor ich weiter ausführe, möchte ich dazu sagen, dass ich ausführlich die Boardsuche zu HideEntity und ShowEntity benutzt hatte, aber Klarheit konnte ich leider nicht gewinnen. Entweder bin ich der Einzige, der hier auf dem Schlauch steht, oder ich muss das Suchen neu lernen.
Ich würde gerne alles, das ausserhalb der CameraRange ist mit HideEntity verstecken. Verstehe ich das so richtig: VOR Beginn der Hauptschleife werden alle Objekte, die im Level auftauchen sollen geladen - und dann erstmal mit HideEntity ausgeblendet. IN der Hauptschleife müsste man dann mit z.B. EntityInView abfragen, ob sich ein Objekt gerade im Kamerablickwinkel aufhält ist oder nicht (kann man das mit gehideten Objekten überhaupt??), und falls es das tut, mit ShowEntity einblenden, und wenn es das nicht mehr tut, es wieder ausblenden? Was ich da nicht verstehe, ist die konkrete Art und Weise wie das gemacht wird. So wie ich das hier schildere müssten ja permanent(!) alle Objekte durchgeloopt und abgefragt werden, bestimmt ein riesiger (Rechen-)Aufwand. Wie macht man sowas? Mir fällt im Moment nichts anderes als ein, als so etwas (stupides Beispiel): Code: [AUSKLAPPEN] For x=1 To 200
If EntityInView (Modell(x),Camera) = 1 Then Show Entity Modell(x) Else HideEntity(x) EndIf Next Und das in der Hauptschleife - das stell ich mir wahnsinnig performanceraubend vor, das kann es doch (so) sicherlich nicht sein, oder? Dazu benutze ich für alle Objekte noch Types, also wäre es wohl nochmals langsamer. Eine zweite Möglichkeit die mir einfällt, wäre es, beim Laden der Level-Objekte einmal alle deren Position-Infos in schneller lesbare Konstanten oder ein DIM zu speichern, und künftig für die permanente Hide/ShowEntity-Abfrage in der Hauptschleife mit diesem zu arbeiten (also permanent mit der aktuellen Position der Spielfigur zu vergleichen), anstatt andauernd durch alle Objekt-Types (die ich in meinem Fall benutze) loopen zu lassen. Vielleicht ist das ja noch ein bisschen schneller? Da ich nämlich eine Top-Down-View benutze wäre eine weitere Möglichkeit, alles zu hiden, dass sich einfach nur etwas von der Hauptfigur entfernt befindet. Wie läßt sich das denn bewerkstelligen? Das einzige das mir einfällt, ist den Umraum um die Spielfigur fortwährend in bezug auf das Array abfragen zu lassen, anstatt pausenlos alle Objekte stur durchzugehen. Quasi Position Spielfigur Vergleich mit den im Array gespeicherten x/z-Angaben der Objekte, Entfernung plus/minus innerhalb 30, dann sichtbar - und erst dann genauere Prüfung durch die entsprechenden Types samt Objekt-Eigenschaften. Wäre das eine Möglichkeit, oder eher Nonsens? Oder wie läßt sich das denn noch, eventuell einfacher, bewerkstelligen? |
||
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du das ganze sowieso mit Types machst, kannst du diesen doch einfach ein zusätzlichen Field verpassen, in welchen steht ob das Entity im letzten Frame versteckt war oder nicht. Dann musst du die Funktionen nur noch aufrufen, wenn sich was ändert.
Alle Type-Einträge einmal pro Schleife durchzurauschen sollte sich auch nur auf Uralt-Rechnern bemerkbar machen. Wenn es sich um Meshes handelt kannst du dir das ganze übrigens sparen, die werden automatisch "versteckt" wenn sie nicht im Blickwinkel der Kamera sind. |
||
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans! Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was du vor hast macht nur Sinn wenn die Objekte die du ausblenden möchtest innerhalb vom CameraRange sind .
Außer dem muß du ja nicht gleich alle Ein/Ausblenden , kannst ja jedes Frame nur einen Teil berechnen . |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Versteckt ja.
Aber mit HideEntity wird noch viel mehr gemacht als einfach nur net gerendert. Kollision wird deaktiviert Animation wird pausiert Bei BlitzTerrains wird zb auch die Aktualisierung deaktiviert (also änderung der Vertexverteilung für die Details etc) Lichtquellen werden "freigegeben" wenn man sie hided Sprites richten sich nicht zur Kamera aus wenn sie gehided sind und vermutlich noch so einiges anderes, prinzipiell alles was in UpdateWorld gemacht wird. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Nerle |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das ist mein Befehl, und den brauch ich! ![]() Also stimmt denn so das Prinzip der Anwendung, so wie ich es mir oben vorstellte? Alles in eine Abfrage-Schleife packen, und diese wiederum in die Hauptschleife? Zitat: Wenn du das ganze sowieso mit Types machst, kannst du diesen doch einfach ein zusätzlichen Field verpassen, in welchen steht ob das Entity im letzten Frame versteckt war oder nicht. Dann musst du die Funktionen nur noch aufrufen, wenn sich was ändert.
Aber muss nicht dazu ebenfalls ständig durch alle Types geloopt werden? Ich steh da gerade etwas auf dem Schlauch - wie stelle ich denn fest, ob und wann sich etwas ändert? Ich müsste quasi immer noch jederzeit die Positionsdaten der Spielfigur mit allen Objektdaten vergleichen? Oder wie macht man das? *qualm* |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group