Entity Exist?
Übersicht

![]() |
NightPhoenixBetreff: Entity Exist? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich bin gerade an einer Stelle angekommen wo ich mich frage ob es möglich ist abzufragen ob eine "Memory ID" existiert.
Um's mal zu verdeutlichen: Ich lade ein Object mit "Mesh=CreateCube()", folglich bekommt es eine ID (bsp: 1234567890). Ein anderes Object wählt dieses durch die KI als Ziel aus und speichert dessen ID. Wird jetz "Mesh" zerstört und fragt das andere Object trotzdem dessen position ab gibts ja einen Programmabturz. Gibt es eine Möglichkeit nur anhand der ID 1234567890 herauszufinden ob das Object noch existiert, ohne dass ein Programmabsturz vorfällt? Sowas wie "EntityExist" wäre praktisch, was im Fall des existierens ne 1 zurückliefert ![]() Jemand ne Idee? MfG. |
||
![]() |
Lord_Vader |
![]() Antworten mit Zitat ![]() |
---|---|---|
Arbeite mit types.
Da kannste dann für jedes objekt bzw player bzw figur wie auch immer ein mesh laden. In den typeeintrag schreibst du dann die lebenspunkte z.B. players\health=0..100.0 Wenn es auf 0 abgesunken ist kannst du ja das mesh einfach ausblenden. |
||
![]() |
NightPhoenix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich arbeite mit Types und ich glaube du hast mein Problem ganz und garnicht erfasst ![]() Ich würde gern wissen ob eine ID Nummer noch existiert. Ich schreibe: Code: [AUSKLAPPEN] Mesh=Createcube()
freeentity mesh aber ich weiß nicht genau wann das objekt gelöscht wird, also brauch ich ne routine die abfragt, egal zu welchem zeitpunkt, auch wenns ein Jahr nach dem löschen ist: "Existiert dass Objekt Mesh?" Sprich sowas wie Code: [AUSKLAPPEN] EntityExist(ID)
Wäre ja kein Problem wenn es sich nicht um gelöschte Types handeln würde und ein anderer Typ-Eintrag die ID eines gelöschten gespeichert hat und auf diese später mit Code: [AUSKLAPPEN] EntityDistance abfragen will.
|
||
- Zuletzt bearbeitet von NightPhoenix am Do, Mai 28, 2009 14:41, insgesamt 2-mal bearbeitet
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du könntest ja alle Meshs in einem Type speichern, der als einziges Field einfach nur eben dieses Mesh hat. Das Mesh löschen machst du dann in einer Funktion (da es ja leider keine Type-methoden gibt), die erst das Mesh freigibt und dann die Type-Instanz. Alle noch vorhandenen Verweise auf die Type-Instanz sollten dann null sein. | ||
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2 |
![]() |
Lord_Vader |
![]() Antworten mit Zitat ![]() |
---|---|---|
Aber wieso sollte man ein mesh löschen wenn jemand tot ist oder ein spieler tot ist?
Wenn es singleplayer ist ok. Aber selbst dann kannste types verwenden und die meshes darin speichern. Ich versteh nich wozu das gut sein soll ![]() |
||
![]() |
NightPhoenix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Genauso mach ich es momentan Dee, nur speichert ein NPC2 zu dem Zeitpunkt wo NPC1 noch existierte dessen ID.
Nun wird der NPC1 gelöscht und NPC2 fragt nun folgendes: Code: [AUSKLAPPEN] If EntityDistance(pp\ZielID,pp\Mesh)>(wb\Speed#)*(60*wb\dauer/1000)+pp\ScaX#/2 Then
ZielID ist in dem Fall NPC1 pp\Mesh ist NPC2 Ich hoffe man versteht mich nun ![]() |
||
- Zuletzt bearbeitet von NightPhoenix am Do, Mai 28, 2009 14:46, insgesamt einmal bearbeitet
![]() |
Lord_Vader |
![]() Antworten mit Zitat ![]() |
---|---|---|
AHHH Warum löscht du denn erst das mesh?
Mach dochn type mit health drin und frag erst ab ob er noch lebt. Dann isses der selbe effekt ohne sich ein kopf drüber zu zerbrechen. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du könntest das Ziel als Verweis auf einen Type-Eintrag speichern. Dann wird z.B. Einheit\Ziel\Mesh = 0 falls der Mesh gelöscht wird oder simpler Einheit\Ziel = Null falls das Ziel-Objekt gelöscht wurde.
Um heraus zu finden ob die ID noch existiert, müsste man jedes Objekt durchgehen und damit vergleichen, mit vielen Types könnte das dauern, mit einfachen Variablen (zu) viel Schreibarbeit. |
||
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) |
![]() |
NightPhoenix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann stell dir das doch mal im realen Leben vor:
Du suchst ein Haus, fährst zu dem haus, es existiert. Nächstes Jahr fährst du wieder zu dem Haus, es ist also deine pp\ZielID, du kommst an und es ist nicht mehr da, weil es schon lange vorher abgerissen wurde. So nun will ich dich sehen was du mit dem MAV in deinem Kopf anfängst ![]() *edit* Genauso funktioniert das alles momentan, aber ich suche immernoch nach einer Lösung für den Programmaufhänger mit 2 For-Each Schleifen. Ich dachte mir, benutz ich halt ne while oder repeat schleife mit "after" für die Types, aber wenn der Type Eintrag nicht existiert, man schon beim letzten Type eintrag ist und jetzt nochmal after macht, gibts ja auch ein MAV, weils kein after mehr gibt. *ok ich hab ne Lösung |
||
- Zuletzt bearbeitet von NightPhoenix am Do, Mai 28, 2009 14:59, insgesamt einmal bearbeitet
![]() |
Lord_Vader |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich verstehe dein problem. Ich weis nur nich warum du es nichtmal versuchst wie ich es geschrieben habe?
Warum suchst du auch nach meshes? Du könntest vllt die koordinaten abfragen, ok. Bei mir würde das DING/PLAYER/WHATEVER einen typeeintrag bekommen, wenn das mesh getroffen wird sinkt health oder ist sofort tot, kannste dir ja aussuchen ist latte. Dann fragt der nächste "abschiesser" erst ab ob der noch lebt. Dann isses scheiss egal ob dein mesh noch da is ![]() Zu deinem MAV: Ja wenn health 0 ist ist er tot. Dann im laufe der nächsten schleife setzte dir ne funktion rein die erstmal alle toten löscht... |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich markiere die zu löschenden Types an beliebigen stellen im Programm, und führe das eigentliche Löschen am Ende ihrer Update-Funktion durch; damit hat man kein trouble mit Null objekten, kann aber auch feststellen ob ein Objekt eigentlich schon tot ist (um weitere Wechselwirkung zu vermeiden). | ||
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) |
![]() |
NightPhoenix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja so mach ich es ja auch Lord_Vader ![]() Nur genau darum Code: [AUSKLAPPEN] Dann fragt der nächste "abschiesser" erst ab ob der noch lebt. gehts die ganze Zeit.
So ein Befehl wie Code: [AUSKLAPPEN] EntityExist(Mein Ziel) mit Rückgabe=1 wenn er noch "lebt" wäre genau das was ich brauche und genau daran sitze mich grad auch. Hab aber grad ne Idee.
Also ich hab schon den ganzen Schnickschnack wie HP, Schilde, Waffen, usw. alles in Types stehen. |
||
![]() |
Lord_Vader |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ähm? Ok nochmal erkläre ich es nicht. Xeres hatte übrigens die gleiche idee wie ich nur später gepostet.
Kannst dir ja mal selber ein wenig gedanken machen. |
||
![]() |
Smily |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du kannst ja einfach eine Variable Setzen, wenn dein Entity gelöscht wird.
Wenns komplexer wird, dann kann man sich mit einem Workaround abhelfen: Code: [AUSKLAPPEN] Type deletedEntity
field entId endType function entityexist for a.deletedentity = each deletedentity if a\entid = deletedentity return 0 next return 1 endfunction function freeentity2(entity) freeentity entity a.deletedentity = new deletedentity a\entid = entity end function Ich habe ewig nichts mehr mit bb gemacht, ich hoffe die syntax stimmt in etwa noch ![]() Grüße, Smily |
||
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets "Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!" stummi.org |
![]() |
NightPhoenix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke an alle...
Unglaublich... der Debugger war anscheinend schuld. Ich hatte bereits ein funktionierendes "ZielID zurücksetzen wenn Ziel getötet wurde" eingebaut, dennoch stürzte mein Programm mit nem MAV ab. Wieso? Weil der Spieler gleich 0 war, sobald der Debugger an ist. Konflikt bei: Code: [AUSKLAPPEN] If EntityDistance(pp\ZielID,pp\Mesh)
...wenn der Spieler das Ziel ist. Sobald der Debugger aus ist funktioniert aber alles ohne Probleme und der Spieler wird nie gleich 0. Mir scheint es so als ob er die neuen Werte erst zu spät erfasst? Das Spielermesh wird die Schleife davor gewechselt und anschließend liefert das programm mit Debugger gleich 0. Ist der Debugger aus ergibt der selbe Vorgang keine 0, sondern alles funktioniert so wie es soll. Ich glaub nicht so richtig, dass der Debugger dran schuld ist, aber irgendwie spricht vieles dafür ![]() |
||
Omenaton_2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Diese Problematik behandele ich meinem neuen Spiel (und in dem alten Vulpec Mutations auch) so :
Jedes Objekt oder Einheit (damit meine ich jetzt zum Beispiel ein Raumschiff mit allen Eigenschaften, inklusive Grafik - also nicht einfach nur ein Mesh) hat seine viele, viele (ich glaube im Moment habe och schon über 300 Variablen) Werte in einem Type drin. Ich vergebe bei Erschaffung auch eine einmalige ID-Nummer die in der Zukunft bei allen Berechnungen intern als Name des Objektes dient. So springe ich diese dann an wenn nötig. Das ist die Referenz zur Identifizierung und Verwaltung. Es gibt ein Field, das "SchonDestroyed" heißt. Kann JA (1) oder NEIN (0) sein. Wird ein Objekt zerstört, setze ich die Variable "SchonDestroyed" auf JA. Rutinen, die mit allen Objekte arbeiten ignorieren andere Objekte, wenn sie schon als zerstört markiert sind. Der Grund für diese Variable ist, daß ein Raumschiff bei seiner Zerstörung nicht unbedingt augenblicklich zerstört und damit gelöscht wird. Die Zerstörung kann eine paar sekündiger Vorgang sein. Zum Beispiel erst brennt das Schiff und dreht sich wie wild, fallen Trümmer ab und dann erst explodiert es. Deshalb kann das Objekt noch nicht ganz gelöscht werden. Aber schon während dieser Zeit, soll durch diese SchonDestroyed Field (zum Beispiel) der KI von anderen Schiffen mitgeteilt werden, daß dieses Schiff nicht weiter beachtet werden sollte, weil es zum baldigen Tode verurteilt ist. Jetzt komme ich zu dem Punkt der deine Frage konkret angeht. Ich gehe in einem Loop alle anderen KI gesteuerten Objekte durch und falls Eines dieses gerade Zersrtörte als Ziel haben sollte, wird dieses Zieleintrag gelöscht (spätestens bevor das Zielobjekt total gelsöcht wird). Sollten andere Schiffe Fight oder Move Tasks haben die das zerstörte Schiff als Grund hatten, werden diese Tasks befreit und die Schiffe sind wieder frei verfügbar für andere Aufgaben. (und das SchonDestroyed Flag verhindert es, daß die freigewordenen Einheiten das gerade gelöschte Ziel sich erneut als Ziel aussuchen.) So funktioniert es bei mir. |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
*senfdazugeb*
Ich machs folgendermassen: (nagut, eigentlich im 2D-Bereich mit FreeImage, ist aber adaptierbar) Code: [AUSKLAPPEN] Function FreeEntityEx( pEntity )
FreeEntity pEntity pEntity = 0 End Function Und dann natürlich immer FreeEntityEx statt FreeEntity aufrufen. Und vor jedem Zugriff auf das Entity prüfst du einfach, ob das Handle ungleich 0 ist... mfG Edit: Mist, totaler Quatsch! BB3D unterstützt ja keine Referenzen, dass heisst das Handle würde nicht genullt =/ was wiederum bedeutet, dass das ganze nicht als Funktion geschrieben sein kann, aberCode: [AUSKLAPPEN] FreeEntity Entity: Entity=0 ist ja nicht wesentlich schwieriger umzusetzen ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group