Überprüfen ob ein Entity "existiert"

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

AnniXa

Betreff: Überprüfen ob ein Entity "existiert"

BeitragSo, März 29, 2009 15:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, März 29, 2009 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Xeres

Moderator

BeitragSo, März 29, 2009 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

AnniXa

BeitragSo, März 29, 2009 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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?

Xeres

Moderator

BeitragSo, März 29, 2009 16:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE 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

BeitragSo, März 29, 2009 16:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, März 29, 2009 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
ja es ist defintiv diese zeile innerhalb der if bedingung:

FreeEntity hitted

Xeres

Moderator

BeitragSo, März 29, 2009 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mal eben das Standard-beispiel von EntityCollided etwas abgeändert, siehe selbst ob's funktioniert:
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

AnniXa

BeitragSo, März 29, 2009 16:49
Antworten mit Zitat
Benutzer-Profile anzeigen
danke Xeres für deine mühen, Very Happy
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 Rolling Eyes

AnniXa

BeitragSo, März 29, 2009 17:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, März 29, 2009 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Apr 02, 2009 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur ein kleiner Schönheitsfehler, aber ich denke Programmierer sollten auf ein gepflegtes Englisch achten Very Happy

Die Vergangenheitsform von hit ist hit, nicht hitted Wink (das Verb ist unregelmäßig).
Nicht zu verwechseln mit hide, hid, hidden Very Happy

Mr.Keks

BeitragFr, Apr 03, 2009 9:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu deiner Ausgangsfrage: Nein, es gibt leider Gottes keine Funktion von wegen "EntityExists()".
MrKeks.net

AnniXa

BeitragFr, Apr 03, 2009 12:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Arrow faeX, stimmt. aber ich neige leider sehr häufig dazu Nonstandard worte zu nutzen.

Arrow Mr.Keks schade, sowas sollte es geben Sad

Chester

BeitragFr, Apr 03, 2009 13:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Apr 03, 2009 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn es diese Dll noch geben würde Rolling Eyes
Der Download link ist leider down Sad
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

BeitragFr, Apr 03, 2009 16:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Habs mal hochgeladen: https://www.blitzforum.de/upload/file.php?id=5210

Noobody

BeitragFr, Apr 03, 2009 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group