arbeiten mit Dims und types

Übersicht BlitzBasic Blitz3D

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

erforderlich

Betreff: arbeiten mit Dims und types

BeitragSo, Apr 10, 2005 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo,
ich bin immer noch an meinem Level-ausleser dran.
Nachdem mich in meinem letzten Thread alle wegen meinen nichtvorhandenen Kenntnissen im Zusammenspiel von Types und Dims fertiggemacht haben, frage ich jetzt einfach mal ob mir jemand, hmm ja, eigentlich schon beinahe ein Tutorial schreiben könnte. Ich bräuchte ein detailliert beschriebenes Beispiel, was als Lösung zu meinem Problem benutzbar sein sollte.
Hier steht mein Problem geschrieben.
https://www.blitzforum.de/view...mp;start=0

hier nochmal die korrektere Fragegestellung:
zitat:
"nochmal klipp und klar:

Ich habe einen Schalter und eine Tür mit einem array. Logischerweise wird es immer genau so viele Schalter wie Türen geben.
Nun habe ich in einer For schleife die dateien geladen. z.B. :
Code:

door_anzahl = 1
dim door_dim(door_anzahl)
for i=0 to door_anzahl
door_dim(i) = findchild(map, "door"+i)
next



somit hätte ich alle tür objekte asuber geordnet rausgefischt.
Auf die glecihe Weise auch die Schalter..
Nun will ich in der Hauptschleife die aktionen für alle Objekte mit einer "0" hintendran (z.B.: door_dim(0)) mit anderen Objekten mit einer "0" als anhang vergleichen(z.B.: schalter_dim(0)). Wie kann ich dafür ein komfortable Lösung finden..?
Kann ja sein das ich plötzlich ne Tür mehr rein mache, dann erhöhe ich eben die Anzahl werte, un eine Tür wird mehr geladen..(geladen wird sie sowieso, aber eine neue Tür in den Dim reingebracht..)
Nun soll door_dim(0) nich mit schalter_dim(1) agieren, sondern sich auf schalter_dim(0) beziehen
Das will ich auf eine komfortable Weise Handeln.. Mir is auf den ersten Schlag "For" dazu eingefallen...scheint aber keine Lösung darzubieten..
So, das war jetzt aber ehrlich eine seeehr ausführliche Beschreibung meines Problems..
Ich hoffe dann mal auf Hilfe"
(auszug aus dem Thread)
Danke für eure hoffentlich vorhandene Hilfe...
Ich muss unbedingt weiter kommen!! Wink
Bei unbeantworteten Fragen bitte nich beleidigt meinen Thread vollspammen sondern höflcih Fragen. Danke
tschüss

Jolinah

BeitragSo, Apr 10, 2005 15:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit einer For-Schleife sollte das schon möglich sein. Dann gehst du halt wie beim laden wieder alle durch:

Code: [AUSKLAPPEN]

For i = 0 to door_anzahl - 1
  If schalter_dim(i) = true  ;wenn Schalter eingeschaltet
    If door_dim(i) = false    ;wenn Tür zu..
      door_dim(i) = true      ;Tür aufmachen etc.
    Endif
  Else                               ;wenn Schalter aus
    If door_dim(i) = true     ;wenn Tür auf..
      door_dim(i) = false     ;Tür zumachen
    Endif
  Endif
Next


Das ganze könnte man aber mit Types auch machen:

Code: [AUSKLAPPEN]

Type door
  Field open
  Field schalter.schalter
End Type

Type schalter
  Field status
  Field door.door
End Type

;Laden
door_anzahl = 10
For i = 0 to door_anzahl - 1
  s.schalter = new schalter
  s\status = 0
  s\door = null

  d.door = new door
  d\open = 0
  d\schalter = s

  s\door = d
Next

;Updaten
For s.schalter = each schalter
  if s\status = true
    if s\door\open = false
      s\door\open = true
    endif
  else
    ...
  endif
Next



Naja kommt zwar etwa aufs selbe, aber so hast du jeden Schalter direkt mit ner Tür verbunden weil jeder Schalter Type eine Tür haben kann und jede Tür einen Schalter in dem Fall.

Edit: Ist halt nur Pseudo, aber so schwer sollte das eigentlich nicht sein Wink
 

erforderlich

BeitragSo, Apr 10, 2005 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
ich bräuchte den teil:
Zitat:
Type door
Field open
Field schalter.schalter
End Type

Type schalter
Field status
Field door.door
End Type


und den Teil:
Zitat:
For i = 0 to door_anzahl - 1

mal näher erklärt.

wenn das "-1" nicht ausschlaggebend ist, war ich auch schon so weit und es hat nicht geklappt.

könntest du, oder jemand anders, hier nicht ein kleines sample erstellen? das wäre überaus nett.

Jolinah

BeitragSo, Apr 10, 2005 16:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja das -1 ist nur da weil man bei dims immer bei 0 anfängt zu zählen. Und wenn man ein dim macht mit der grösse 10 dann hat es die Elemente 0 - 9.


Zu den Types:
Man kann in einem Type referenzen auf andere Typen haben. Genauso wie du Int, Strings etc. da drin haben kannst gehen halt auch andere (und auch dieselben) Types.

In dem Fall hat halt eine Tür ein zugehöriger Schalter und ein Schalter eine zugehörige Tür. Wenn du dann die Tür für einen Schalter ansprechen willst kannst du das so machen:

Code: [AUSKLAPPEN]

schalter\tuer\variable_von_tuer


Wenn jede Tür und jeder Schalter in deinem Level einen eigenen Namen hat dann muss halt in die Level-Datei mitgespeichert werden welche Tür zu welchem Schalter gehört usw.

Beim Laden lädst du dann die Objekte mit ihren Namen. Nach dem Laden gehst du halt nochmal jeden Schalter durch. Für jeden Schalter gehst du jede Tür durch und prüfst ob sie den Namen hat den du gespeichert hattest. Wenn dies der Fall ist so gehört die Tür zum Schalter und du kannst dann dem Schalter diese Tür zuordnen:

Code: [AUSKLAPPEN]

Type schalter
  Field name              ;Name des Schalters
  Field targetname     ; Name des Ziels (Türname)
  Field target.door     ; Das Ziel selber (Tür)
  Field status            ;Ein/Aus
End Type

Type door
  Field name         ;Name der Tür
  Field status         ;geöffnet/geschlossen
End Type

;Schalter Laden
For i = 0 to schalter_anzahl - 1
  s.schalter = new schalter
  s\name = ReadString(file)       ;Name auslesen
  s\targetname = ReadString(file)   ;Zielname auslesen
  s\target = null    ;Ziel kennen wir noch nicht da noch nicht geladen..
  s\status = ReadByte(file)  ;Status auslesen
Next

'Tueren laden
For i = 0 to door_anzahl - 1
  d.door = new door
  d\name = ReadString(file)    ;Name auslesen
  d\status = ReadByte(file)      ;Status auslesen
Next

'Alle Schalter durchgehen
For s.schalter = each schalter
  For d.door = each door
    if s\targetname = d\name     ;Ziel des Schalters entspricht dieser Tür
      s\target = d     ;Ziel auf diese Tür setzen
    Endif
  Next
Next



Dann hat jeder Schalter entweder Null (wenn die Tür nicht gefunden wurde) oder ein Tür Objekt auf das er dann zugreifen kann:

Code: [AUSKLAPPEN]

s.schalter = first schalter
if s\target <> null
  print s\target\name
endif
 

erforderlich

BeitragSo, Apr 10, 2005 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
so
Zitat:
For i = 0 to schalter_anzahl - 1
s.schalter = new schalter
s\name = ReadString(file)
...

kann das doch gar nich funktionieren, denke ich.
weil der name ja wieder überschrieben wird. Deshalb spreche ich auch von Dims. Aber wenn man das mischt kommt man in einen Code-dschungel.
Aber sonstens ganz gute Ansätze.
warum das
Zitat:
Type schalter
Field name ;Name des Schalters
Field targetname ; Name des Ziels (Türname)
Field target.door

2 mal?

danke vielmals für deine Hilfe! Ich hoffe du weist auch mit Dims weiterzuhelfen. Wink

Jolinah

BeitragSo, Apr 10, 2005 20:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Name wird nicht überschrieben Wink

Code: [AUSKLAPPEN]

s.schalter = new schalter


Die Zeile erstellt von dem Type jedesmal ein neues Objekt. Die ganzen Objekte werden dann in einer Art Liste gespeichert auf die man per For Each Schleife halt zugreifen kann (jedes Objekt in der Liste).

Einen Type kannst du dir als Vorlage vorstellen. Types beschreiben was für Eigenschaften (Fields) ein Objekt hat. Damit gibts aber noch keine Objekte, die müssen erst noch erstellt werden. Und jedes dieser Objekte hat dann diese Eigenschaften die man per \ abrufen kann:

Code: [AUSKLAPPEN]

s.schalter = new schalter   ;Neues Objekt mit den Eigenschaften von schalter erstellen
s\name = "Bla"    ;Das name Field des Objekts s ändern


s ist dann ein Handle (zeiger) welches auf das neu erstellte Objekt zeigt.
Wenn s überschrieben wird existiert das alte Objekt aber immer noch:

Code: [AUSKLAPPEN]

s.schalter = new schalter
s = new schalter


Beim ersten mal zeigt s auf das erste neu erstellte Objekt. Bei der zweiten Zeile wieder auf das neu erstellte Objekt. Das alte existiert aber noch nur hat man keine Variable mehr womit man darauf zugreifen kann.
Aus diesem Grund gibts dann die For Each Schleife womit du wieder auf jedes Objekt zugreifen kannst.

s kann aber auch Null sein, das bedeutet s zeigt auf kein Objekt mehr (weil es gelöscht wurde etc.) und darf nicht mehr für Zugriffe auf die Fields benutzt werden.

----

Bei name und targetname habe ich das $ vergessen, es sollten Strings sein. Das targetname hat nur den zweck herauszufinden welche Tür zu dem Schalter gehört. target selber ist dann wieder ein Objekt vom Type door und kein String. Allein mit dem String kannst du ja auf den Status der Tür nicht zugreifen, per Objekt aber schon.

In diesem Fall sagen wir dann nur dass target auf die entsprechende Türe zeigen soll, womit du deren Eigenschaften abfragen/ändern kannst. Das Objekt selber gibt es ja schon und muss nicht neu erstellt werden.

Hoffe ich konnte dir weiterhelfen Very Happy
Types sind zu beginn nicht ganz einfach zu verstehen, aber wenn man sie verstanden hat sind sie sehr leicht zu handhaben. Wenn du Types beherrscht sollte dir der Einstieg in die OOP wie bei BlitzMax zum Beispiel auch leichter fallen.
 

erforderlich

BeitragSo, Apr 10, 2005 20:18
Antworten mit Zitat
Benutzer-Profile anzeigen
danke. Du hilfst mir sehr weiter.

Zitat:
s.schalter = new schalter
s = new schalter


das habe ich allerdings nicht verstanden Confused
Eine neues objekt von einem neuen Objekt?

Ansonsten:
du bist einer der User, die noch wirklich helfen wollen!
Danke nochmal Wink

Jolinah

BeitragSo, Apr 10, 2005 20:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei normalen Variablen sagst du ja z.Bsp:

Code: [AUSKLAPPEN]

name$ = "Bla"
fl# = 1.3
i% = 10


etc.

Das .schalter ist eigentlich genau das selbe, nur halt für Types.

Code: [AUSKLAPPEN]

s.schalter = null


Damit hast du s als schalter definiert statt als String oder Float etc.
So eine Objekt Variable zeigt dann auf ein Objekt, bzw. nicht wenn es Null ist.

Code: [AUSKLAPPEN]

new Typename


Erstellt ein neues Objekt vom angegebenen Type und gibt das Handle (zeiger) zurück.

Code: [AUSKLAPPEN]

s.schalter = new schalter
s = new schalter


- s als Schalter definieren
- Neues Objekt vom Type schalter erstellen und resultat in s speichern
- s ist schon definiert, kann wiederverwendet werden
- Neues Objekt vom Type schalter erstellen und wieder in s speichern

Somit hast du 2 Objekte aber nur noch 1 Variable

Code: [AUSKLAPPEN]

For s = each schalter
  Print s\name
Next


Damit kannst du dann die beiden Objekte in der Liste durchgehen da s in jedem Schleifendurchlauf auf das nächste Objekt zeigt bis alle durchgegangen sind.

Code: [AUSKLAPPEN]

Delete s


Löscht das Objekt worauf s zeigt.

Es gibt noch mehr Befehle wie First, After, Last etc. kannst du ja in der Onlinehilfe schauen.


PS: Es kommt darauf an wieviel Zeit ich hab, jeder hier hat ja auch noch ein Leben neben dem Programmieren und da ist es halt normal das nicht jeder alles immer so ausführlich erklären mag. Vorallem nicht wenn das Thema dann schon tausend mal durchgekaut wurde. Types sind zwar auch schon sehr oft erklärt worden aber was mit OOP oder ähnlichem zu tun hat erklär ich immer gerne Wink

Ich finde einfach mit OOP geht alles viel leichter wenn man es erstmal begriffen hat.
 

erforderlich

BeitragMo, Apr 11, 2005 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
<a name="frage">Tach!</a>
also, ich habe das Auslesen vorgenommen. Klappt prima.
hier ist das was ich erreichen will mal detailliert gemalt:

http://home.arcor.de/shorty.hanfmann/raum.jpg

wenn der spieler im bereich ist, soll die Tür aufgehen...
den bereich habe ich festgelegt

BlitzBasic: [AUSKLAPPEN]
For i = 0 To map\door_anzahl
auto_door_schalter_unten.auto_door_schalter_unten_t = New auto_door_schalter_unten_t
auto_door_schalter_unten\instance = FindChild(map\map_obj,\"unten_\"+(i))
EntityType auto_door_schalter_unten\instance, c_checkdoor
EntityAlpha auto_door_schalter_unten\instance, 100
EntityParent auto_door_schalter_unten\instance, 0
auto_door_schalter_unten\name = \"door_\"+(i)

auto_door_schalter_unten\x = EntityX(auto_door_schalter_unten\instance)
auto_door_schalter_unten\y = EntityY(auto_door_schalter_unten\instance)
auto_door_schalter_unten\z = EntityZ(auto_door_schalter_unten\instance)

auto_door_schalter_unten\bereich_x_min = EntityX(auto_door_schalter_unten\instance)-(MeshWidth(auto_door_schalter_unten\instance))
auto_door_schalter_unten\bereich_x_max = EntityX(auto_door_schalter_unten\instance)+(MeshWidth(auto_door_schalter_unten\instance))
auto_door_schalter_unten\bereich_y_min = EntityY(auto_door_schalter_unten\instance)

auto_door_schalter_unten\bereich_y_max = EntityY(auto_door_schalter_unten\instance)+(MeshHeight(auto_door\instance))

auto_door_schalter_unten\bereich_z_min = EntityZ(auto_door_schalter_unten\instance)-(MeshDepth(auto_door_schalter_unten\instance)*2)
auto_door_schalter_unten\bereich_z_max = EntityZ(auto_door_schalter_unten\instance)+(MeshDepth(auto_door_schalter_unten\instance)*2)

Next

soll ich meinen bisherigen code mal posten?
ich mach's einfach mal:
BlitzBasic: [AUSKLAPPEN]
Function map_update()


For map.map_t = Each map_t
For auto_door.auto_door_t = Each auto_door_t
For auto_door_schalter_unten.auto_door_schalter_unten_t = Each auto_door_schalter_unten_t
For auto_door_schalter_oben.auto_door_schalter_oben_t= Each auto_door_schalter_oben_t





If EntityY(auto_door\instance)=>EntityY(auto_door_schalter_oben\instance) Then

doorway$ = \"down\"
door_animate=0

EndIf

If EntityY(auto_door\instance)<EntityY(auto_door_schalter_oben\instance) Then


If door_animate=1 Then





If EntityX(player)>auto_door_schalter_unten\bereich_x_min And EntityX(player)<auto_door_schalter_unten\bereich_x_max Then
If EntityY(player)>auto_door_schalter_unten\bereich_y_min And EntityY(player)<auto_door_schalter_unten\bereich_y_max Then
If EntityZ(player)>auto_door_schalter_unten\bereich_z_min And EntityZ(player)<auto_door_schalter_unten\bereich_z_max Then

doorway$ = \"up\"



EndIf
EndIf
EndIf

EndIf

EndIf
;EndIf

If doorway$ = \"up\" Then
If auto_door_schalter_unten\name = auto_door\name Then
TranslateEntity auto_door\instance, 0, 4, 0
EndIf
ElseIf doorway$ = \"down\" Then

If (EntityX(player)<auto_door_schalter_unten\bereich_x_min)=1 Or (EntityX(player)>auto_door_schalter_unten\bereich_x_max)=1 Or (EntityZ(player)<auto_door_schalter_unten\bereich_z_min)=1 Or (EntityZ(player)>auto_door_schalter_unten\bereich_z_max)=1 Or (EntityY(player)<auto_door_schalter_unten\bereich_y_min)=1 Or (EntityY(player)>auto_door_schalter_unten\bereich_y_max)=1 Then


If auto_door_schalter_unten\name = auto_door\name Then
TranslateEntity auto_door\instance, 0, -3, 0
EndIf




Else


If EntityY(auto_door\instance)<EntityY(auto_door_schalter_oben\instance) Then
doorway$ = \"up\"
EndIf
EndIf

If EntityY(auto_door\instance)=<EntityY(auto_door_schalter_unten\instance) Then
doorway = \"none\"
door_animate=1
EndIf

EndIf


Next
Next
Next



Next

End Function
  • Zuletzt bearbeitet von erforderlich am Do, Apr 14, 2005 22:45, insgesamt 2-mal bearbeitet
 

erforderlich

BeitragDo, Apr 14, 2005 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
ähhem, ich bräuchte wirklich mal Hilfe Wink
-> s.o. (letzter Beitrag)
Danke, für die die mir helfen ^^

Firstdeathmaker

BeitragDo, Apr 14, 2005 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Dein Code ist nicht sehr übersichtlich. Die langen Namen der Typzuweisungen sind sehr schlimm, mach daraus lieber etwas kürzeres.

2. Ist das dein ganzer Code? Wo ist die deklaration des Typefields?

3. Ich würde das ganze etwas anders angehen, eben wie oben beschrieben, die Türen direkt mit den entsprechenden Schaltern verlinken.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

erforderlich

BeitragDo, Apr 14, 2005 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
1. man kann den Code verstehen wenn man will
2. Ich möchte das jez irgendwie hinbekommen: d.h. soetwas komplexes was ich vorher nich gecheckt habe, peil ich theoretisch schlechter, als wenn jemand anhand meines Anfangs ein praktisches beispiel abgibt Wink

soo...Jolinah !!! , deine Hilfe is gefragt Laughing Ich weis das du mir helfen wirst Wink
sonst tu ich weinen Crying or Very sad ^^

Firstdeathmaker

BeitragDo, Apr 14, 2005 20:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Meine Kommentare sollten kein Angriff, sondern konstruktive Kritik sein. Wenn man seinen eigenen Code nicht unter kontrolle hat (vom Layout her) dann wird man da auch schwer durchblicken (So ist jedenfalls meine Erfahrung).


Nun zu deinem Problem:

Meinen zweiten Punkt hast du nicht wirklich beantwortet, wenn du noch nichteinmal weist wie man mit Types anfängt solltest du nicht sofort großes damit vorhaben und dann, weil du verzweifelst, hier nach Hilfe schreien dass dir das einer macht. Ich gebe dir nen Tipp wie ich das immer mache:

1. Nix verstehen
2. Mir das Problem rauspicken und schauen ob ich ein kleines Testprogramm damit zustande bekomme.
3. So lange an dem Testprogramm fummeln und probieren bis es funktioniert.
4. Die gewonnenen Erkenntnisse in das Hauptprogramm einfließen lassen und zufrieden sein es alleine geschafft zu haben.


Falls du dir beim Thema Types noch zu unsicher bist, schaue dir in der Onlinehilfe die Tut´s dazu an oder auch meines, wo ich versuche die Grunddinge noch etwas anders zu erklären:
Link


Versuch zu verstehen, nicht einfach nur sagen: Kann das einer für mich machen.

MFG
FDM
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

erforderlich

BeitragDo, Apr 14, 2005 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Die Online-Hilfe teile kenn ich schon
2. du sollst mir das nich machen. mir nur die funktion um so etwas zu erreichen zeigen. (wie man diese types untereinander unterprüft, etc...)
3. ich sehe das als beleidigung an, nix konstruktive kritik
4. ich kann nich proggen, ich machs nur notbedingt, weil ich keinen Programmierer habe und meine 3d-Modelle testen will. Ausserdem will ich mal in einen eigenen geilen level, wenn auch statisch, rumlaufen...
da käme mir diese Auslese programm schon zu gute Wink
5. dann erklär doch mal wie man das aus meinen Ansätzen her vergleichen kann. schreib doch mal eine Funktion die werte eines Types mit dem werten ausserhalb des Types vergleicht und wenn se "true" sinn, auf einenen anderen, dazugehörigen, Type effekt hat... mach das ma, dann hast du mein Problem gelöst, un ers dann kannst du dich vor mir behaupten. Laughing
6. So gehe ich meine Probleme auch an. Das is ja erst ein Test programm. Rolling Eyes
7. Wenn du nicht wirklich was zu meiner fragestellung hinbezutragen hast, sondern nur in kurz-gefassten Antworten rumpöbeln willst, dann schick PNs, bitte...

Firstdeathmaker

BeitragDo, Apr 14, 2005 23:27
Antworten mit Zitat
Benutzer-Profile anzeigen
So, das konnte ich nicht auf mir sitzen lassen. Auch wenn du den Code warscheinlich nicht verstehen wirst, er macht folgendes:

Wenn du mit der Spielerperspektive die kleine Kugel berührst (Steuerung Pfeiltasten) welche den Effektradius darstellt, verfärbt sich der Würfel. Der Würfel stellt in diesem Falle die Tür da, das verfärben müsste man nur noch durch "Tür öffnen" ersetzten und fertig.

BlitzBasic: [AUSKLAPPEN]
Graphics3D 800,600
SetBuffer BackBuffer()

Type tuer
Field mesh
Field status
End Type

Type ausloeser
Field x#
Field y#
Field z#
Field r#;Radius des Türeffektbereiches in dem der Effekt für die Tür ausgelöst wird
Field mesh
Field abklingzeit
Field effektobjekt.tuer
End Type




Global Spielermesh=CreateCube()
camera=CreateCamera(Spielermesh)

CameraRange camera,0.01,100

PositionEntity Spielermesh,0,0,-4

;Erstellt eine Tür
tuer.tuer=New tuer
tuer\mesh=CreateCube()
tuer\status=0

;Erstellt den Auslöser der Tür an 0,0,1 mit Auslöseradius von 0.5
b.ausloeser=New ausloeser
b\x=2
b\y=0
b\z=-2
b\r=0.1
b\mesh=CreateSphere()
PositionEntity b\mesh,b\x,b\y,b\z
ScaleEntity b\mesh,b\r,b\r,b\r
b\effektobjekt.tuer=tuer



Repeat
;steuerung des Spielers
If KeyDown(200) MoveEntity Spielermesh,0,0,0.1
If KeyDown(208) MoveEntity Spielermesh,0,0,-0.1
If KeyDown(203) MoveEntity Spielermesh,-0.1,0,0
If KeyDown(205) MoveEntity Spielermesh,0.1,0,0
check_ausloeser_mit_spieler()
RenderWorld()
Flip
Until KeyHit(1)
End





Function check_ausloeser_mit_spieler()
For a.ausloeser=Each ausloeser
If InKugel(a\x,a\y,a\z,a\r,EntityX(Spielermesh),EntityY(Spielermesh),EntityZ(Spielermesh)) And a\abklingzeit<MilliSecs();Prüft ob sich die Spielerposition innerhalb des Auslöseobjektradius befindet
a\effektobjekt\status=1-a\effektobjekt\status;Ändert den Status der Tür. Könnte ebenso etwas anderes an der Tür ändern, b.z.w. nur das Öffnen/Schließen initialisieren.
If a\effektobjekt\status
EntityColor a\effektobjekt\mesh,100,100,255
Else
EntityColor a\effektobjekt\mesh,100,255,100
EndIf
a\abklingzeit=MilliSecs()+1000

EndIf
Next
End Function


Function InKugel(kugel_mx#,kugel_my#,kugel_mz#,kugel_r#,x#,y#,z#)
Return (Sqr((kugel_mx-x)^2+(kugel_my-y)^2+(kugel_mz-z)^2)<kugel_r)
End Function



www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Jolinah

BeitragDo, Apr 14, 2005 23:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab jetzt auch mal sowas gemacht. Ursprünglich wollte ich nur mit einem kleinen Beispiel wie Firstdeathmaker helfen....

Aus eigenem Interesse, weil ich sowas noch nie gemacht habe, hab ich es dann bisschen weiter entwickelt Wink. So dass man die Türen nun tatsächlich öffnen und schliessen kann. Zusätzlich hab ich verschiedene Sachen eingebaut wie:

- Türen schliessen automatisch nach ner gewissen Zeit wieder
- Trigger bleiben ne Weile deaktiviert so das sich der Status der Tür nicht dauernd wieder verändert.
- Unterschiedliche Geschwindigkeiten fürs öffnen und schliessen

Die Trigger hab ich so gemacht: Es sind blöcke wie die Türen selber auch. Wie bei den Türen kollidiert man auch bei Triggern. Nur ist der Alphawert des Triggers 0, also unsichtbar. Sobald man kollidiert wird dann die Tür geöffnet und der Trigger ganz versteckt mittels HideEntity, so dass Kollisionen ausgeschaltet werden. Wenn der Trigger dann resettet wird das Entity wieder eingeblendet (ShowEntity). So merkt man also gar nicht dass da irgendwas ist.


Da es erforderlich helfen könnte, hier der Download inklusive gut kommentiertem Sourcecode Wink

http://zehr.de/blitz3d/maploader.zip


PS: Hab jetzt damit man die Trigger zum Testen sieht Alpha auf 0.2 gemacht. Und steuern kann man den Player mit Maus und A,W,S,D oder Pfeiltasten.
 

erforderlich

BeitragFr, Apr 15, 2005 22:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Tach!
@ hot-bit:
Ja so seh ich das auch Wink

@firstdeathmaker:
geht doch Wink Ne, ma ellich: "thx" Jez versteh ich das ein bischen besser.
aber warum musst du (wie viele andere User auch) einen immer direkt beleidigen??
Zitat:
Auch wenn du den Code warscheinlich nicht verstehen wirst, er macht folgendes:

ich bin halt noch nich so weit un durch samples un tutorials lernt man eben am besten Wink Die OH tuts sinn zuuu einfach, will hier ja schon etwas höheres gestalten..

@Jolinah
Cooles Tutorial, auch wenn ich einzel-Teile meiner Methode (falls ich sie je umgesetzt bekommen sollte) besser fände, weil z.B. Höhen der Tür (also wie hoch sie aufgehen soll etc. -> kann ja auch ma ne kaputte Tür sein, die z.B. nich ganz aufgeht..) direkt im 3d-Programm zu erstellen sind. Ich denke ich wechsle aber zu deiner Kollisionsmethode -> viel einfacher gehalten + wirkungsvoll + kann im 3d programm die Tastfäche erstellen (individuelle Größen). Also danke nochmals Wink
werde mich dann bald mal an die Arbeit machen Wink

Jolinah

BeitragSa, Apr 16, 2005 1:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo, das mit den Türen ist klar. Am besten wär halt so ein Format wie BSP wo verschiedenste Werte mitgespeichert werden können. Alternativ kann man auch zu jedem Mesh eine zusätzliche Datei beilegen. Statt nur Anzahl der Türen und Trigger speichert man dann halt noch für jedes Entity zusätzliche Infos. Z.Bsp mit ner Ini:

Code: [AUSKLAPPEN]

[Map]
doors=20
triggers=20
monster=10

[door1]
open_speed=0.5
close_speed=0.3

[door2] - [doorxxx]

[trigger1] - [triggerxxx]

[monster1] - [monsterxxx]


Und die liest man dann halt zu jeder Map mit ein.
 

erforderlich

BeitragSa, Apr 16, 2005 10:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Jez hast du mich BSP maps neugierig gemacht..bekomm ich mehr infos? Wink

Das mit ner externen Datei finde ich nicht so gut.zu schwer zu verwalten.
ich lese die meshs aus der map aus und entscheide anhand des namens welche eigenschaften sie haben soll...hoffentlich geht mit ner BSP map mehr...klär mich mal auf... Wink

edit:
Bin jetzt fertig damit. Ohne dein Tutorial hätte ich es nie geschafft.
Danke nochmals! Allerdings ich habe das jez so gemacht, das der Cube keine Kollision hat, wie du, sondern eine Area aufstellt, in die man reintreten kann. So fällt einem die Tür nich vor der Nase zu und es is immer noch simpel gehalten. (wie auf dem Bild oben)
Ausserdem kann ich jez mit Millisecs() umgehen Wink un ich hab das mit den Types in Types verstanden!!
 

erforderlich

BeitragSa, Apr 16, 2005 15:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Tach...
beim einlesen:
BlitzBasic: [AUSKLAPPEN]
For i = 0 To map\door_anzahl
auto_door_taster.auto_door_taster_t = New auto_door_taster_t
auto_door_taster\instance =
FindChild(map\map_obj,\"door_taster_\"+ Str(i))
EntityParent auto_door_taster\instance, 0
;EntityAlpha auto_door_taster\instance, 0
auto_door_taster\reset_delay = 500
;HideEntity auto_door_taster\instance

auto_door_taster\name = \"door_\"+ Str(i)
;ab hier downwards (kenne gerade das deutsche wort nich :lol: )
auto_door_taster\tasterwidth = MeshWidth(auto_door_taster\instance)
auto_door_taster\tasterheight = MeshHeight(auto_door_taster\instance)
auto_door_taster\tasterdepth = MeshDepth(auto_door_taster\instance

auto_door_taster\b_x_min=
EntityX(auto_door_taster\instance)-((auto_door_taster\tasterwidth))
auto_door_taster\b_x_max=
EntityX(auto_door_taster\instance)+((auto_door_taster\tasterwidth))

auto_door_taster\b_y_min=
EntityY(auto_door_taster\instance)
auto_door_taster\b_y_max=
EntityY(auto_door_taster\instance)+(auto_door_taster\tasterheight*2)

auto_door_taster\b_z_min=
EntityZ(auto_door_taster\instance)-(auto_door_taster\tasterdepth*2)
auto_door_taster\b_z_max=
EntityZ(auto_door_taster\instanc+(auto_door_taster\tasterdepth*2)


Next

wieso kann das nich funtzen Wenn ich 2 verschieden große Taster habe? es kommt immer nur ein Wert dabei raus. da kann das eine Teil halb so groß sein wie dsa andere, übernimmt aber seine min_x, bzw. max_x (usw...) bereiche... Der Vorgeber der verwendeten Werte scheint das Objekt des ersten Durhlaufs zu sein.
tschüss

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group