Entity Exist?

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

NightPhoenix

Betreff: Entity Exist?

BeitragDo, Mai 28, 2009 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

Jemand ne Idee?

MfG.

Lord_Vader

BeitragDo, Mai 28, 2009 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Mai 28, 2009 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich arbeite mit Types und ich glaube du hast mein Problem ganz und garnicht erfasst Wink

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

D2006

Administrator

BeitragDo, Mai 28, 2009 14:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Mai 28, 2009 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy

NightPhoenix

BeitragDo, Mai 28, 2009 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
  • Zuletzt bearbeitet von NightPhoenix am Do, Mai 28, 2009 14:46, insgesamt einmal bearbeitet

Lord_Vader

BeitragDo, Mai 28, 2009 14:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Xeres

Moderator

BeitragDo, Mai 28, 2009 14:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

NightPhoenix

BeitragDo, Mai 28, 2009 14:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink


*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

BeitragDo, Mai 28, 2009 14:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

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...

Xeres

Moderator

BeitragDo, Mai 28, 2009 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

NightPhoenix

BeitragDo, Mai 28, 2009 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja so mach ich es ja auch Lord_Vader Wink (toller Name =)
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

BeitragDo, Mai 28, 2009 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ä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

BeitragDo, Mai 28, 2009 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

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

BeitragDo, Mai 28, 2009 15:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Confused
 

Omenaton_2

BeitragFr, Mai 29, 2009 10:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Holzchopf

Meisterpacker

BeitragFr, Mai 29, 2009 12:30
Antworten mit Zitat
Benutzer-Profile anzeigen
*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 Wink

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group