listing nearest entities to the camera
Blitz3D Forums/Blitz3D Beginners Area/listing nearest entities to the camera
| ||
| I have 100 entities and I want to display a list ('Text' is fine for now) of the top 10 entities closest to the camera. My entities are contained in a Type and have an 'ID' field that is set during creation (For i = 1 to 100, entity\ID = i, etc). Not sure if that is the most efficient way to sort through them... but regardless I can't get my head around this. The list needs to be updated according to where the camera is at all times. |
| ||
| I would create a type to sort the distances. This type should be able to hold a distance, and some reference to the entity. Each frame update/main loop, clear the list that contains the distances. Loop through all entities, and add their distance to the list. But before adding a new distance to the list, first check at what point in the list it should be inserted. Loop through the list. If one of the distances in the list is bigger than the new one, insert the new one right before the one in the list, and leave the loop. If the list contains no distances, or all distances in the list are smaller than the new distance, the new distance should be placed at the end of the list. |
| ||
| Thanks Warner! This works but I am having trouble listing each entity on a new line... the text is all on the same line on the Y axis. |
| ||
| Info$="This door is locked"+Chr(13) ;The text message Info$=Info$+"You need the Green Key" ;Second line of text using the +Chr(13) will make another line of text...hope this helps... |
| ||
| Well, I think Chr$(13) would only work with text files. It could also be Chr$(13)+Chr$(10) or even Chr$(0), can't exactly remember. I usually try them all out, and then forget again. Maybe I don't understand the problem correctly, but you are printing everything to the screen after the sorting is completed, right ? And -just to eliminate that option- you are using the 'y' parameter of Text ? |
| ||
Here is my code. What a horrible mess eh? Thanks everyone for the help.
Type listitem
Field name$
Field dist#
Field id
End Type
Type enemy
Field mesh
Field name$
Field id
End Type
For i = 1 To 50
e.enemy = New enemy
e\mesh = CreateCube()
e\id = i
PositionEntity e\mesh,Rnd(-5000,5000),Rnd(-100,100),Rnd(-5000,5000)
e\name = "Enemy"
Next
Repeat
......
For e.enemy = each enemy
If EntityDistance(camera, e\mesh) < 1000
this.listitem = New listitem
this\name$ = e\name
this\dist = EntityDistance (camera,e\mesh)
this\id = e\id ;
addtolist(this.listitem)
Delete this
EndIf
Next
Flip
Until KeyHit (1)
End
Function addtolist(this.listitem)
Text 10,10,this\name+" - "+this\id+" - "+this\dist+Chr$(13)
;Text3D(font2,-500,0,this\name+" - "+this\id+" - "+this\dist,0)
End Function
|
| ||
| Here is the code I wrote to try things out, hopefully it helps: |
| ||
| Warner it works flawlessly and taught me a great deal. Thank you so much for taking the time to suss that out. |