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

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Bob

Betreff: 3D Objecte Verwalten mit Type oder dim? (Erledigt)

BeitragSo, Jun 06, 2004 0:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Question

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

BeitragSo, Jun 06, 2004 1:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jun 06, 2004 3:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jun 06, 2004 6:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jun 06, 2004 11:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo tft, Very Happy

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? Shocked

Danke
Bob

Markus2

BeitragSo, Jun 06, 2004 12:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

Bob

BeitragSo, Jun 06, 2004 12:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Wink

Gruß
bob

Bob

BeitragSo, Jun 06, 2004 13:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Nochmals Hallo und Danke an tft.

Es kalappt exakt wie von dir Beschrieben.
Hurra. Razz
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

BeitragMo, Jun 07, 2004 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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 !!!!!!

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group