3D Objecte Verwalten mit Type oder dim? (Erledigt)
Übersicht

![]() |
BobBetreff: 3D Objecte Verwalten mit Type oder dim? (Erledigt) |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo ForenUser,
erst mal Hallo an alle. Ich bin ein Newbie in diesem Forum und im BlitzBasic Programmieren. Für mein erstes Projekt (ein Spaceshooter wie so oft) benötoge ich eine sinnvolle Möglichkeiten um alle Objekte die im All so rumschwirren zu verwalten. Für meine ersten Ggehversuche möchte ich 100 Zylinder (Raumminen) in meinem Universum verteilen. Hier mein Ansatz. (Auszug) Type S_OBJ ;space_object Field Obj ; Ein belibiges Object im All Geometrie Field FF$ ; Freund / Feind / Neutral oder was? Field Typ$ ; Schiff Raummine Station Satelit Asteroid usw Field bez$ ; Bezeichnung oder Name des Objects End Type For i = 0 To 99 a.s_obj = New s_obj a\Obj = CreateCylinder() NameEntity a\Obj,"UO "+i a\bez = "UO "+i EntityShininess a\Obj,1 EntityColor a\Obj,80,80,80 EntityPickMode a\Obj,2 PositionEntity a\Obj,Rnd(-1000,1000),10,Rnd(-1000,1000) RotateEntity a\Obj,Rnd(0,360),Rnd(0,360),Rnd(0,360) a\FF = "Unbekannt" a\typ ="Raummine" Next Soweit so gut. Ich kann nun durchs all Fliegen und sehe alle diese Objekte. Fahre ich mit der Maus nun über eins der Objekte, soll ein Rechteck um das Objekt gezeichnet werden. Genau hier beginnt mein Problem. Ich kann zwar ein Rechteck um das mit CameraPick gewählte Objekt zeichnen, kann es aber nicht identifizieren. Über welches meiner 100 Objekte habe ich den nun mein Rechteck gezeichnet? Lasse ich mir mit Print oder Text den Rückgabewert von CameraPick anzeigen, erscheint ein lange Integer Zahl, wahrscheinlich eine vom Systemgenerirte ID. Das Entity Handle halt. Wie kann ich darüber auf meinen Type Schliesen OHNE alle Objekt zu durchlaufen. ![]() Danke Bob. PS. Darüber soll der z.b. der Typ (als Raummine) angezeigt werden. Auch das ist bisher kein Problem. Als VB6 Umsteiger fällt mir zum Dim Befehl auf das es scheinbar kein 'Redim' gibt. Ich habe mich u.a. deshalb für Type entschieden. Wahrscheinlich ist das auch einfacher wenn z.b. Raummine 23 zerstört wird. Ich wüsste nicht wie ich das mit Dim hinbekomme. |
||
- Zuletzt bearbeitet von Bob am Mo, Jun 07, 2004 8:10, insgesamt einmal bearbeitet
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich weiss nicht ob es irgendwie geht ohne alle Objekte durchzulaufen. Aber bei 100 Objekten sind Types genug schnell finde ich.
Code: [AUSKLAPPEN] ent = CameraPick(x,y) For a.s_obj = each s_obj if a\Obj = ent .... endif Next PS: Die Arrays kann man in BB auch redimensionieren, jedoch mit dem selben Befehl wie man sie am Anfang auch erstellt. Einfach nochmal mit Dim. Code: [AUSKLAPPEN] Dim a(100) Dim a(200) Und die Arrays sind in BB immer Global, sind also auch in den Funktionen verfügbar. Folgedessen kann man sie am Anfang deklarieren und dann später in einer Funktion redimensionieren. |
||
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Jolinah,
danke für die Antwort. Bei 100 Objekten ist es tatsächlich schnell genug. Ich werd es mal mit 5000 probieren. Der Hinweis mit der Dim Anweisung ist gut zu wissen. Wass aber passier beim "Redimmen" mit den Daten die bereits in den alten Feldern enthalten sind. Sind die dann weg? (Gibt es ein Preserve) Wenn ja muss man wohl wieder mit nem Temp Dim Feld die Daten Zwischenspeichern. Das wäre mühselig. |
||
![]() |
tft |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo......
Types sind schon ganz nett. Aber wenn du wirklich fiele objecte verwalten wilst. Und auch langsamere Rechner berücksichtigen möchtest kommst du nicht an Dim vorbei. Für dein Problem mit der identivicirung gibt es eine interesante Lösung. Jedem Object kann mittels EntityName ein String zugewiesen werden. Du kanst jetzt in diesem String den Handler des TypeFeldes eintragen. Die Pickfunktion gibt den Handler des Objectes Zurück. Mit dem findest du den String. Damit extrahierst du den Typehandler und du kanst mit dem Object Befehl den richtigen Type eintrag setzen ohne durch die gesamte liste hangeln zu müssen. Sicher...diese erklärung ist ein bisschen müsam. Aber ich halte nichts dafon vertigen COde zu posten. Du suchst dier in der Deutschen Blitzhilfe am besten die Befehle raus die zu dieser erklärung passen (Namen können abweiche) und probierst ein wenig damit rum. Du kommst dann selber darauf. Ist zum lernen besser. Bei der Verwaltung von Dims ist es änlich, aber komplexer. Da du erst eine Liste mit Indices einarbeiten must. Das ist Später wichtig wenn du Sortieren must. Ansonsten gibt es ein Tutorial das sich damit beschäftigt. Benutze die Suche . "3D Space Game tut" Für konkrete Hilfen sonst immer Posten. Egal welche dummen Comments kommen. |
||
TFT
https://www.sourcemagic.ch Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!! |
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo tft, ![]() danke für die Antwort. Wie du in meinem Code erkennen kannst, habe ich die Funktion um ein entity zu benamen schon eingebeut. Ich werde den Code nun so Umschreiben das der Name gleich des Handels ist. Guter Tip. Was aber meinst du mit "Damit extrahierst du den Typehandler ..." Was soll ich den Extrahieren wen der Name = dem Handel ist? Oder meinst du eine type Umweandlung von String nach Integer? Wenn ja wie geht das? ![]() Danke Bob |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich mache das so .
Type X.TYpe Field Entity End Type global AlleXs.XType Hauptschleife Local X.XType Bei CameraPick Entity mit For Each suchen und einmal merken if MouseHit(1) then e=Pick ... X=FindXEntity(e) endif if x<>null then ShowXInfo(x) function FindXEntity.XType(Entity) local X.XType X=null for x.xtype=each xtype if x\Entity=Entity then return x next end function Damit fällt die suche kaum ins Gewicht ![]() |
||
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Markus,
hmmm. Auch nicht schlecht. Allerdings ziehe ich die Lösung von tft vor, (wenn Sie funktioniert) da dann überhaupt nicht mehr gesucht werden muss. Ich freu mich über jede Millisekunde die ich sparen kann. Es wird noch langsam genug werden. ![]() Gruß bob |
||
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nochmals Hallo und Danke an tft.
Es kalappt exakt wie von dir Beschrieben. Hurra. ![]() Keinerlei for each Schleife mehr nötig. Damit ist meines erachtens der TYPE dem DIM haushoch überlegen und auch vorzuziehen. Gruß Bob P.S. Wie kann man ein Thema alse Erledigt kennzeichnen? |
||
![]() |
tft |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi......
ich kann deiner euforie und zustimmen. Wenn es klappt fängt es an spass zu machen. Aber spätestens wenn du anfangen must deine Objecte in abhängigkeit zu ihrer Z Position mittels HideEntity und SchowEntity ein und auszuschalten. Oder sonstwie nach anderen Kriterien zusätzlich zu sortieren. Wirst du schnell herausfinden das Dim immer Schneller als Type ist. Aber versuch ein bisschen rum....fiel spass. |
||
TFT
https://www.sourcemagic.ch Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group