Überprüfen ob ein Entity "existiert"
Übersicht

![]() |
AnniXaBetreff: Überprüfen ob ein Entity "existiert" |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hiho,
Gibt es eine möglichkeit zu prüfen ob ein entity existiert? also ob es ein entity zu einem handle gibt? der grund ist das folgende funktion mir manchmal erzählen will: "entity does not exist´s" eigentlich kann das aber doch garniht sein oder? wenn es kein entity "hitted" gibt, wie kann dann mit EntityCollided etwas anderes als 0 ermittelt worden sein? naja da ich deswegen recht genervt bin, möchte ich nun einfach prüfen ob hitted als entity existiert. Code: [AUSKLAPPEN] hitted = EntityCollided (schuss, 2) If hitted <> 0 Then Print hitted FreeEntity hitted EndIf |
||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Versuch mal statt
Code: [AUSKLAPPEN] hitted <> 0 Code: [AUSKLAPPEN] Not hitted Müsste aber eigentlich trotzdem gehen... |
||
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn eine Variable kein handle enthält (also = 0) wurde auch kein Entity geladen/erstelllt. Dein Entity "hitted" ist immer dann 0 wenn keine Kollision stattfand, also musst du das überprüfen bevor du etwas mit einem nicht-existenten Objekt anfangen möchtest. | ||
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) |
![]() |
AnniXa |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: Wenn eine Variable kein handle enthält (also = 0) wurde auch kein Entity geladen/erstelllt. Dein Entity "hitted" ist immer dann 0 wenn keine Kollision stattfand, also musst du das überprüfen bevor du etwas mit einem nicht-existenten Objekt anfangen möchtest.
genau das mache ich doch eigentlich mit "If hitted <> 0 Then" ... bzw wenn eine kolision stattgefunden hat, muss hitted ja auch was sinvolles enthalten oder? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn eine Kollsion stattgefunden hat, enthält hitted ein Entity... Also eine Zahlenfolge. Ich vergleiche hier (in einem älteren Code) das zurückgelieferte Entity mit den Einträgen des Ziel-Types um den richtigen Eintrag heraus zu finden.
In welcher Zeile kommt denn der Object does not exist Fehler? Vielleicht ist irgendeine Aktion aus der <> 0 Abfrage ausgeklammert? |
||
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) |
- Zuletzt bearbeitet von Xeres am So, März 29, 2009 16:20, insgesamt einmal bearbeitet
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzBasic Hilfe hat Folgendes geschrieben: Es wird die Identität eines kollidierten Objekts zurückgeliefert. Wird 0 zurückgeliefert, dann gab es keine Kollision. |
||
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7 |
![]() |
AnniXa |
![]() Antworten mit Zitat ![]() |
---|---|---|
ja es ist defintiv diese zeile innerhalb der if bedingung:
FreeEntity hitted |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab mal eben das Standard-beispiel von EntityCollided![]() Code: [AUSKLAPPEN] Graphics3D 640, 480, 0, 2
SetBuffer BackBuffer() timer = CreateTimer(60) camera = CreateCamera() RotateEntity camera, 45, 0, 0 PositionEntity camera, 0, 15, - 10 light = CreateLight() RotateEntity light, 45, 0, 0 sphere = CreateSphere(32) EntityType sphere, 1 EntityRadius sphere, 1 PositionEntity sphere, 0, 11, 0 cube = CreateCube() EntityType cube, 2 EntityColor cube, 0, 100, 0 PositionEntity cube, 0, - 5, 0 ScaleEntity cube, 10, 10, 10 cylinder = CreateCylinder(32) EntityType cylinder, 2 EntityColor cylinder, 255, 0, 0 PositionEntity cylinder, 0, 7, 0 ScaleEntity cylinder, 2, 2, 2 Collisions 1, 2, 2, 2 While Not KeyDown(1) x# = 0 y# = 0 z# = 0 If KeyDown(203) = 1 Then x# = - 0.1 If KeyDown(205) = 1 Then x# = 0.1 If KeyDown(208) = 1 Then z# = - 0.1 If KeyDown(200) = 1 Then z# = 0.1 MoveEntity sphere, x#, - 0.1, z# col = CountCollisions(sphere) For i = 1 To col Entity = CollisionEntity(sphere, i) If Entity <> 0 Then FreeEntity(Entity) EndIf Next UpdateWorld RenderWorld Flip(0) WaitTimer(timer) Wend End |
||
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) |
![]() |
AnniXa |
![]() Antworten mit Zitat ![]() |
---|---|---|
danke Xeres für deine mühen, ![]() dein beispiel funktioniert super, wenn ich es auf mein programm übertrage wieder das gleiche problem. ersetze ich das FreeEntity(hitted) beispielweise gegen: MoveEntity(hitted,0,-1,0) gibt es keinerlei probleme, da ich das einfach nicht checke, mach ich das nun einfach so das die betroffenen objekte an irgendeine position teleportiert werden,(0,-1000,0) und dann eine schleife immer fragt welche objekte sich an dieser position befinden und sie dann entfernt. zwar sehr untoll, aber ich sitze schon den ganzen tag an dem problem :O das ist frustriedend ![]() |
||
![]() |
AnniXa |
![]() Antworten mit Zitat ![]() |
---|---|---|
okay nun habe ich es hinbekommen, erklären kann ich es mir aber so richtig nicht...
ich habe nun FreeEntity(entity) einfach in eine funktion "ausgelagert", Code: [AUSKLAPPEN] ... hitted = EntityCollided (schuss, 2) If hitted <> 0 Then Print hitted Wegmachen(hitted) EndIf ... function Wegmachen(entity) FreeEntity(entity) end function Kurioserweise geht es nun ... |
||
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke für den Tipp, hatte neulich das gleiche Problem. Komischerweise zeigt der Debugger auf eine Stelle, die ein paar Zeilen darüber liegt. | ||
Starfare: Worklog, Website (download) |
![]() |
faeX |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nur ein kleiner Schönheitsfehler, aber ich denke Programmierer sollten auf ein gepflegtes Englisch achten ![]() Die Vergangenheitsform von hit ist hit, nicht hitted ![]() Nicht zu verwechseln mit hide, hid, hidden ![]() |
||
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zu deiner Ausgangsfrage: Nein, es gibt leider Gottes keine Funktion von wegen "EntityExists()". | ||
MrKeks.net |
![]() |
AnniXa |
![]() Antworten mit Zitat ![]() |
---|---|---|
![]() ![]() ![]() |
||
![]() |
Chester |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mal abgesehen davon, dass FreeEntity nur das Objekt an sich löscht und nicht die gesamte EntityStruktur.
Sprich: Man kann es weiterhin transformieren und z.B. als Pivot verwenden, das Handle wird nicht zurückgesetzt. Nur im Debug Modus kommt "Entity does not exist" wenn man mit dem Handle was "anfängt". Mit Hilfe der Blitz3d+.dll gibt es die Möglichkeit festzustellen, ob das Objekt an sich noch existiert: Code: [AUSKLAPPEN] Function EntityExists%(entity%)
; benötigt mindestens zwei Entitys If entity% = 0 Then Return False If BP_GetNextEntity(entity%)<>0 Then If BP_GetLastEntity%(BP_GetNextEntity%(entity%)) = entity Then Return True EndIf If BP_GetLastEntity(entity%)<>0 Then If BP_GetNextEntity(BP_GetLastEntity(entity%)) = entity Then Return True EndIf End Function |
||
![]() |
coolo |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn es diese Dll noch geben würde ![]() Der Download link ist leider down ![]() |
||
http://programming-with-design.at/ <-- Der Preis ist heiß!
That's no bug, that's my project! "Eigenzitate sind nur was für Deppen" -Eigenzitat |
![]() |
Chester |
![]() Antworten mit Zitat ![]() |
---|---|---|
Habs mal hochgeladen: https://www.blitzforum.de/upload/file.php?id=5210 | ||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dafür braucht man nicht mal eine DLL. Im englischen Codearchiv gibt es dazu eine Funktion (man braucht jedoch dazu noch eine decls - die Hinweise zur Funktion beachten!).
Das ganze ist hier zu finden. Zum ursprünglichen Problem: Das sollte an sich nicht geschehen - kann es sein, dass du das Entity per FreeEntity löschst, aber dazwischen nicht UpdateWorld aufrufst? Ich kann mir nämlich vorstellen, dass der Kollisionseintrag bei EntityCollided weiterhin besteht, auch wenn das zurückgegebene Entity bereits gelöscht wurde. Erst wenn UpdateWorld aufgerufen wird, würde dann die Kollisionsliste aktualisiert. Das ist der einzige Grund, den ich mir im Moment vorstellen kann - versuch mal, hinter das FreeEntity ein UpdateWorld zu hängen. Wenn es dann geht, kennst du ja immerhin die Fehlerursache und kannst dich dann daran setzen, das ganze sauberer zu lösen. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group