Entity = Instanz usw?

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

sonicfire

Betreff: Entity = Instanz usw?

BeitragFr, Sep 15, 2006 15:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Servus!

Kann ich einer Entity Variablen mit auf den Weg geben?

z.b. MeinKlotz.Breite = 60?

Ich bin ein bisschen OO-arbeiten gewohnt, und Instanzen handling usw fehlt mir hier ein bisschen...

Zum Beispiel vermisse ich solche Schlüsselwörter wie "You" oder "Me" um auf Instanzen zugreifen zu können. Habe gerade ein Problem das ich via Types mehrere Entities auf dem Schirm habe, aber keine Ahnung, wie ich über die Entities Variablen der Types abfragen kann.... vermutlich würfel ich das ein wenig durcheinander, keine Ahnung... mhh Confused

Als Beispiel: Ich habe drei Kisten im Level. Mit EntityPick kann ich z.b. eine Kiste die andere "scannen" lassen und mir zurückgeben, ob das auch eine Entity vom Typ "Kiste" ist , oder nicht. Aber wie gehts weiter? Ich kann ja dann nicht "gefundeneEntity.Breite = xyz" sagen!

Bin noch etwas verwirrt! Smile
~sonic
 

Ava

Gast

BeitragFr, Sep 15, 2006 16:08
Antworten mit Zitat
Du könntest beispielsweise das ObjektHandle des zum Entity gehörendem Types dem Entity als Name übergeben. Wenn Du das Entity pickst, dann kannst Du über den Namen (bzw. das darin gespiecherte Handle) auf das Type-Objekt casten und zugreifen.

Eine von verschiedenen Möglichkeiten.

Eine andere wäre, das Entity im Type zu verlinken und dann mit For Each die Type Liste nach dem Entity abzusuchen.

usw...

Christoph

BeitragFr, Sep 15, 2006 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau dir mal types an. Diese Form der Variablenverarbeitung ist am nächsten am OOP dran.

ql:type

Blitzcoder

Newsposter

BeitragFr, Sep 15, 2006 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Also so wie entity.breite gehts bei B3D nicht. Alles was geht, sagen diese befehle:
Code: [AUSKLAPPEN]
EntityAutoFade
EntityBlend
EntityBox
EntityCollided
EntityColor
EntityClass
EntityDistance
EntityFX
EntityInView
EntityName
EntityOrder
EntityParent
EntityPick
EntityPickMode
EntityPitch
EntityRadius
EntityRoll
EntityShininess
EntityTexture
EntityType
EntityVisible
EntityX
EntityY
EntityYaw
EntityZ
ExtractAnimSeq


Ich nehme onehin immer z.B. für Gegner Types, in denen sowohl das Mesh, als auch Engergie, evtl. Grösse, Kraft etc. gespeichert sind. So:
Code: [AUSKLAPPEN]

Type gegener
    field x,y
    field mesh
    field sizex, sizey
end type


In etwa.

MfG Blitzcoder
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)
 

sonicfire

BeitragFr, Sep 15, 2006 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke erstmal für alle Antworten!! Smile

Ava hat Folgendes geschrieben:
Du könntest beispielsweise das ObjektHandle des zum Entity gehörendem Types dem Entity als Name übergeben. Wenn Du das Entity pickst, dann kannst Du über den Namen (bzw. das darin gespiecherte Handle) auf das Type-Objekt casten und zugreifen.

Eine von verschiedenen Möglichkeiten.

Eine andere wäre, das Entity im Type zu verlinken und dann mit For Each die Type Liste nach dem Entity abzusuchen.

usw...


Da fehlts mir dann doch an ...öhm... Sachverstand... "auf das Type-Objekt casten" ? Embarassed

Momentan ist es so das ich eine For Each Type - Schleife habe, und von dort aus inaktive Entities (innerhalb eines Types) scanne lassen (sie selbst scannen "um sich herum") und sollen bei anderen Entities .....ja, Werte setzen... das Problem ist nur, das müsste innerhalb des Types geschehen....puah, schwer zu erklären Laughing
~sonic
 

Ava

Gast

BeitragFr, Sep 15, 2006 17:11
Antworten mit Zitat
Schau Dir mal diese zwei Befehle an:

Handle
Object

+ Ava +
 

Dreamora

BeitragFr, Sep 15, 2006 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
sonicfire hat Folgendes geschrieben:
Danke erstmal für alle Antworten!! Smile

Ava hat Folgendes geschrieben:
Du könntest beispielsweise das ObjektHandle des zum Entity gehörendem Types dem Entity als Name übergeben. Wenn Du das Entity pickst, dann kannst Du über den Namen (bzw. das darin gespiecherte Handle) auf das Type-Objekt casten und zugreifen.

Eine von verschiedenen Möglichkeiten.

Eine andere wäre, das Entity im Type zu verlinken und dann mit For Each die Type Liste nach dem Entity abzusuchen.

usw...


Da fehlts mir dann doch an ...öhm... Sachverstand... "auf das Type-Objekt casten" ? Embarassed

Momentan ist es so das ich eine For Each Type - Schleife habe, und von dort aus inaktive Entities (innerhalb eines Types) scanne lassen (sie selbst scannen "um sich herum") und sollen bei anderen Entities .....ja, Werte setzen... das Problem ist nur, das müsste innerhalb des Types geschehen....puah, schwer zu erklären Laughing


Erm du redest von OO Erfahrung, scheinst aber noch nicht einmal die Struct Grundzüge zu verstehen? (Type entspricht einer Struct)
Und wenn es sich nicht einfach erklären lässt, versuchst du vermutlich eine recht simple sache extrem kompliziert zu lösen ^^
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

sonicfire

BeitragFr, Sep 15, 2006 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Thanks! Werd leider noch nicht so ganz schlau draus...

EDIT : Naja, sollte nicht grosskotzig klingen, letztendlich habe ich kaum Erfahrung damit. Das sollte nichts weiter heissen, als das ich vom GameMaker (v. Mark O.) komme *lach* ... jetzt wird´s richtig peinlich Wink
Aber das Type quasi eine Struct ist, weiss ich! *G*
~sonic
 

Dreamora

BeitragFr, Sep 15, 2006 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Versuche Mal zu erklären, was du genau erreichen willst.

Normalerweise macht man es so das man einen Type macht, wo man eine Referenz auf das "3D Objekt" speichert in einem Field.

Das You und Me existiert auch in Blitz, nur musst du Funktionen schreiben, die das You und Me erst bestimmen, so wie es 3DGS intern auch macht.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

sonicfire

BeitragFr, Sep 15, 2006 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
Versuche Mal zu erklären, was du genau erreichen willst.

Normalerweise macht man es so das man einen Type macht, wo man eine Referenz auf das "3D Objekt" speichert in einem Field.

Das You und Me existiert auch in Blitz, nur musst du Funktionen schreiben, die das You und Me erst bestimmen, so wie es 3DGS intern auch macht.


Ich versuchs mal. Ich habe hier so eine Art Weltraum-Level. Dort bewegt man sich hin und her und kann "Teleporter-Einheiten" plazieren. (Nenn ich´s mal einfach so).

Jedes mal wenn ich so eine Einheit plaziere, mach ich das über
Code: [AUSKLAPPEN]

tporters.type_tpstand = New type_tpstand
tporters\entity = CopyEntity(tpstand) ; 3ds mesh
tporters\x = EntityX(camera)
tporters\y = EntityY(camera)
tporters\z = EntityZ(camera)
tporters\state = 0 ; 0=off, 1=active


So. Jetzt möchte ich überprüfen, ob eine Einheit die andere erreichen / "sehen" kann. Und zwar via EntityPick. Das Problem ist nun, ich würde es gerne so machen, das wenn ich drei von diesen Einheiten plaziert habe, das sich dann so eine Art... nennen wir es "Kraftfeld" zwischen diesen Einheiten bildet / aufbaut (später per 3d Linien zeichnen(?)).

Dazu muss ich also jeweils testen, ob mind. drei Einheiten existieren (und später auch noch: ob der Abstand zwischen denen nicht zu groß ist).

Aber da ich ja nun diese Einheiten per Types plaziere...öhm ,ja... bin ich mir noch nicht so ganz sicher wie ich das überprüfen kann und was noch viel wichtiger ist , wie ich dann einen Wert eines Feldes eines dieser Einheiten mit einem neuen Wert belegen kann (tporters\state = 1) ! Smile

Das ist es im großen und ganzen!

Würde mir liebend gerne globale "You" und "Me" Funktion definieren, aber da weiss ich absolut nicht wie das gehen soll

Embarassed
~sonic
 

Ava

Gast

BeitragFr, Sep 15, 2006 17:55
Antworten mit Zitat
Wo da jetzt genau das Problem liegen soll, habe ich noch immer nicht
verstanden. *lächel*


Du hast das Entity direkt im Type gespeichert, also kannst Du sowohl auf das
Entity als auch das Objekt zugreifen, wenn Du sie in einer Schleife durchgehst.

Wenn Du nun überprüfen möchtest, ob eines Deiner Teleporterdinger ein
anderes in sichtbarer Reichweite hast, dann verschachtelst Du einfach zwei
For Each Schleifen und überprüfst das. Wink

Und wie Du einem Objekteintrag einen neuen Wert zuweisst, das hast Du
doch selber schon geschrieben... hmm... nun bin ich etwas verwirrt! Very Happy


+ Ava +
 

sonicfire

BeitragFr, Sep 15, 2006 18:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Öhm Shocked Laughing

Okay, dann versuch ich´s mal so:
Code: [AUSKLAPPEN]

For tporters.type_tpstand = Each type_tpstand
      EntityPickMode tporters\entity,0 ; dont pick myself
      chkent = EntityPick(tporters\entity,1000) ; scan for other teleporters
      If chkent

         ???!?!? :)
                        chkent.? chkent.state = ? das geht ja eben nicht *G*

      EndIf
                EntityPickMode tporters\entity,1
~sonic
 

Ava

Gast

BeitragFr, Sep 15, 2006 18:07
Antworten mit Zitat
Code: [AUSKLAPPEN]


For  a.type_tpstand  =  each  type_tpstand


    For  b.type_tpstand = each  type_tpstand
   

          If  a <> b  Then


;        und hier kannste dann Deine Teleporterdinger auf
         Entfernung und Sichtbarkeit usw. vergleichen


          EndIf


    Next


Next




Betrachte es als Pseudocode, da ich lange nicht mehr mit B3D gearbeitet
habe und Flüchtigkeitsfehler somit kaum ausschliessen kann. *lächel*


+ Ava +



[/edit]

EntityVisible ist im Übrigen für diese Aufgabe glaube ich besser geeignet, als PickEntity.
 

sonicfire

BeitragFr, Sep 15, 2006 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit EntityVisible ist echt eine gute Idee!
Danke!
Obwohl ich jetzt immer noch verwirrt bin *G*

If a<>b? Warum zwei Types? Surprised
~sonic
 

Dreamora

BeitragFr, Sep 15, 2006 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil du 2x alle types durchgehst und ja nicht willst, das der Teleporter sich selbst auch betrachtet und das ist nur dann der fall wenn a <> b ist (da a und b alle Elemente des Types sein werden)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

sonicfire

BeitragFr, Sep 15, 2006 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ööööhm...okay! Das heisst auch wenn ich mir neue Teleporter erstelle bzw. im Level plaziere soll ich jedesmal einen neuen Type ...öhm... instanziieren? Confused

Weil bis dato war es ja teleporters.type_tpstand... quasi .... seufz *G* Very Happy
~sonic
 

Ava

Gast

BeitragFr, Sep 15, 2006 18:54
Antworten mit Zitat
Du scheinst mir echt ein Meister im Verwirrung stiften zu sein, hm? *smile*

sonicfire hat Folgendes geschrieben:

Jedes mal wenn ich so eine Einheit plaziere, mach ich das über
Code: [AUSKLAPPEN]

tporters.type_tpstand = New type_tpstand
tporters\entity = CopyEntity(tpstand) ; 3ds mesh
tporters\x = EntityX(camera)
tporters\y = EntityY(camera)
tporters\z = EntityZ(camera)
tporters\state = 0 ; 0=off, 1=active



Scheint mir, als würdest Du das bereits tun... also jedesmal ein neues Objekt
Deines Types zu erstellen, wenn ein neues Teledings ins Spiel kommt. Rolling Eyes
 

sonicfire

BeitragFr, Sep 15, 2006 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ava hat Folgendes geschrieben:
Du scheinst mir echt ein Meister im Verwirrung stiften zu sein, hm? *smile*

sonicfire hat Folgendes geschrieben:

Jedes mal wenn ich so eine Einheit plaziere, mach ich das über
Code: [AUSKLAPPEN]

tporters.type_tpstand = New type_tpstand
tporters\entity = CopyEntity(tpstand) ; 3ds mesh
tporters\x = EntityX(camera)
tporters\y = EntityY(camera)
tporters\z = EntityZ(camera)
tporters\state = 0 ; 0=off, 1=active



Scheint mir, als würdest Du das bereits tun... also jedesmal ein neues Objekt
Deines Types zu erstellen, wenn ein neues Teledings ins Spiel kommt. Rolling Eyes


Naja, wie sollte ich es auch anders machen? Smile
tporters ist quasi ein Container für all meine aufgestellten Teleporter! Oder habe ich das mit den Types auch noch nich so ganz gerafft? Hmm. Laughing
~sonic
 

Ava

Gast

BeitragFr, Sep 15, 2006 19:35
Antworten mit Zitat
tporters ist in diesem Fall lediglich eine Variable, die auf das letzte erstellte type_tpstand Objekt zeigt. Smile

Der Container (ich denke, damit meist Du die Liste, die alle type_tstand Objekte speichert?) wird von Blitz automatisch verwaltet und ist immer vorhanden. Sobald Du ein Objekt dieses Types erstellst, wandert es in diese Liste - wenn Du das Objekt deletest, dann wird es aus der Liste entfernt.

Du kannst diese Liste mit For Each durchlaufen lassen, wobei die angegebene Variable (in meinem Beispiel a und b) wieder quasi nur Pointer auf den Eintrag in der Liste ist, an deren Position sich die Schleife gerade befindet.

LaLaLa

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group