Probleme mit Types

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Apprauuuu

Betreff: Probleme mit Types

BeitragMo, Jun 20, 2005 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Ich arbeite grad an nem Mapeditor und hänge grad an der Verwendung mit Tyües fest!

Was ich haben will:
Man hat auf der linken Seite alle Maps stehen. Die Maps können beliebig viele "Untermaps" besitzen; das heißt, in einer Map namens Haus können noch je in die 3 verschiedene Geschosse unterteilt werden und jede Geschossmap hat noch die einzelnen Räume als Untermap (ich weiß nicht wer von euch jemals den RPG-maker benutzt hat.... Aber so wie es mit der Mapeinteilung da ist will ich es auch machen)


Ich dachte ich könnte das alles am besten mit Types lösen...
Nur stehe ich bei den Untermaps mit einer beliebigen ANzahl zimelich auf dem Schlauch, vor allem wenn diese ebenfalls Untermaps haben sollen Shocked

Bitte um eine Löseung + Erklärung
Das wär mal echt klasse Very Happy
Arbeitsstand:
Umprogrammierung von LOL³Warriors und LOL³Fighters in Bmax...
LOL³Fighters wird spielerisch noch mal ordentlich aufpoliert, um es Ligatauglich zu machen (zumindest für private Funligen von mir ^^)

Hip Teen

BeitragMo, Jun 20, 2005 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun, du könntest die Eigenschaft "Parentmap" einbauen. Ist das Null, ist es die oberste Schicht von ner Map (und wird links angezeigt). Hat es die Eigenschaft, wird es der Parentmap zugeordnet.

Apprauuuu

BeitragMo, Jun 20, 2005 21:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok!

Hab aber jetzt ein paar probs mit Types, da ich sie noch nie so benutzt habe

(min Beispiel bezieht sich jetzt auf ereignisse, welche verschiedene werte haben können, die beliebig oft vertreten sein können [z.b. soll das erste Ereignis einen portwert und 2 werte für die textbpox haben (falls der npc im rpg 2 mal was sagen soll)]).

Mein Code jetzt:
BlitzBasic: [AUSKLAPPEN]
Type ereignis
Field x
Field y
Field befehl$
Field port.port
Field box.box
End Type

Type port
Field x
Field y
End Type

Type box
Field inhalt$
End Type

Local ereignis.ereignis


ereignis = New ereignis
ereignis\x = 5
ereignis\y = 3
ereignis\port = New port
ereignis\port\x = 10
ereignis\port\y = 10
ereignis\box = New box
ereignis\box\inhalt = \"TEXT 111\"
ereignis\box = New box
ereignis\box\inhalt = \"Text 222\"


ereignis = New ereignis
ereignis\port = New port
ereignis\port\x = 10
ereignis\port\y = 10
ereignis\x = 5
ereignis\y = 3
ereignis\box = New box
ereignis\box\inhalt = \"AHHH!\"

For ereignis = Each ereignis
Print ereignis\x
Print ereignis\y
If ereignis\port <> Null Then Print ereignis\port\x
If ereignis\port <> Null Then Print ereignis\port\y
For ereignis\box = Each box
Print ereignis\box\inhalt
Next
Print
Next

WaitKey
End


Nun will ich, dass unten in der Schleife die 2 Eigenschfaten der Ereignisse geprintet werden und die jeweiligen portwerte und textboxdialoge!
Wenn ich nicht:
For ereignis\box = Each box
Print ereignis\box\inhalt
Next
drin habe, dann printet der nur den zuletzt veränderten Wert (also bei dem obigen Ereignis "Text 222" und nicht beide (also "Text 111" und "Text 222")...
Nun habe ich den Textboxtype auch in eine Schleife gesteckt, sodass der alles durchläuft, sodass das Prog. Beim oberen Ereignis die oberen beiden Textwerte und bei dem zweiten Ereignis nur den "Ahhhh"-wert ausgeben soll....
Nur gibt der jetzt Immer alle überhaupt vorhandenen Texte aus...

Kann mir jemand sagen wo da mein Verständnisproblem bei der Sache liegt ??
(ich hoffe man konnte anhand meiner komisch beschreibeen Erklärung irgdnwas kapieren o_O)
Arbeitsstand:
Umprogrammierung von LOL³Warriors und LOL³Fighters in Bmax...
LOL³Fighters wird spielerisch noch mal ordentlich aufpoliert, um es Ligatauglich zu machen (zumindest für private Funligen von mir ^^)
 

CodeMaster

BeitragMo, Jun 20, 2005 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja. Types sind globale Strukturen und keinesfalls mit eigenständigen Klassen oder Objekten zu verwechseln. Leider.
Das heißt, in dem gesamten Programm gibt es nur eine Liste namens "box".
In deinem Ereignis-Type hast du lediglich eine Instanz eines box-Elements gespeichert.
Abhilfe kannst du schaffen, indem du in das Type eine Bank lädst, in der du jeweils alle Handles der unterstellten Box-Elemente speicherst. Ist allerdings mit etwas Programmieraufwand verbunden.
Mal sehen, vielleicht progge ich in den nächsten Minuten mal ein Beispielcode.

[edit] Hier mal ein Beispiel zur Grundidee:BlitzBasic: [AUSKLAPPEN]
Type TObjectA
Field Name$
Field list_ObjectB%
End Type

Type TObjectB
Field Name$
End Type

Function TObjectA_Create.TObjectA( p_Name$ = \"\" )
Local l_ObjectA.TObjectA = New TObjectA
l_ObjectA\Name = p_Name
l_ObjectA\list_ObjectB = CreateBank()
Return l_ObjectA
End Function

Function TObjectA_Destroy( p_ObjectA.TObjectA )
For i = 1 To TObjectA_Count_ObjectB( p_ObjectA )
TObjectA_Delete_ObjectB( p_ObjectA, i )
Next
Delete p_ObjectA
End Function

Function TObjectA_Add_ObjectB( p_ObjectA.TObjectA, p_ObjectB.TObjectB )
ResizeBank( p_ObjectA\list_ObjectB, BankSize( p_ObjectA\list_ObjectB ) + 4 )
PokeInt( p_ObjectA\list_ObjectB, BankSize( p_ObjectA\list_ObjectB ) - 4, Handle( p_ObjectB ) )
End Function

Function TObjectA_Delete_ObjectB( p_ObjectA.TObjectA, index% )
;######
End Function

Function TObjectA_Count_ObjectB( p_ObjectA.TObjectA )
Return BankSize( p_ObjectA\list_ObjectB ) / 4
End Function

Function TObjectA_Get_ObjectB.TObjectB( p_ObjectA.TObjectA, index% )
Local l_ObjectB.TObjectB = Object.TObjectB( PeekInt( p_ObjectA\list_ObjectB, (index - 1) * 4 ) )
Return l_ObjectB
End Function

Function TObjectB_Create.TObjectB( p_Name$ = \"\" )
Local l_ObjectB.TObjectB = New TObjectB
l_ObjectB\Name = p_Name
Return l_ObjectB
End Function

Function TObjectB_Destroy( p_ObjectB.TObjectB )
Delete p_ObjectB
End Function



test1.TObjectA = TObjectA_Create( \"Element 1\" )
test1_u1.TObjectB = TObjectB_Create( \"Unterelement 1\" )
test1_u2.TObjectB = TObjectB_Create( \"Unterelement 2\" )
test1_u3.TObjectB = TObjectB_Create( \"Unterelement 3\" )
TObjectA_Add_ObjectB( test1, test1_u1 )
TObjectA_Add_ObjectB( test1, test1_u2 )
TObjectA_Add_ObjectB( test1, test1_u3 )

test2.TObjectA = TObjectA_Create( \"Element 2\" )
test2_u1.TObjectB = TObjectB_Create( \"Unterelement 1\" )
test2_u2.TObjectB = TObjectB_Create( \"Unterelement 2\" )
TObjectA_Add_ObjectB( test2, test2_u1 )
TObjectA_Add_ObjectB( test2, test2_u2 )

For j.TObjectA = Each TObjectA
Print j\Name$
For i = 1 To TObjectA_Count_ObjectB( j )
l.TObjectB = TObjectA_Get_ObjectB( j, i )
Print \" \" + i + \". \" + l\Name$
Next
Print
Next
Die ObjektB-Löschenfunktion hab ich noch nicht, da muss man einige Bytes in der Bank hin und her verschieben. Hatte ich keine Lust mehr zu Smile
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.

Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102

Apprauuuu

BeitragDi, Jun 21, 2005 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die ausführliche Hilfe Very Happy
hab vorher noch nie was von banks gehört und das jetzt hinbekommen Rolling Eyes
Arbeitsstand:
Umprogrammierung von LOL³Warriors und LOL³Fighters in Bmax...
LOL³Fighters wird spielerisch noch mal ordentlich aufpoliert, um es Ligatauglich zu machen (zumindest für private Funligen von mir ^^)
 

CodeMaster

BeitragDi, Jun 21, 2005 22:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Sagen wirs mal so: Wenn dein Projekt nicht *unbedingt* verschachtelte Types haben *muss*, kannst du es ja auch anders lösen. Denn dieser Aufwand lohnt sich für kleinere Sachen eigentlich nicht.

Ne Bank ist im Übrigen nix anderes als eine Liste von Zahlen, genauer gesagt von Bytes. Mal ein Beispiel: Du erstellst dir eine Bank mit 100 Bytes:BlitzBasic: [AUSKLAPPEN]
Bank = CreateBank(100)
Um jetzt in die Bank eine Integer-Variable zu speichern, brauchst du zuerst eine Position. Diese ist, da die Bank noch leer ist, 0.
Eine Integer-Variable verbraucht vier Bytes, das heißt, wenn du die Variable mittelsBlitzBasic: [AUSKLAPPEN]
PokeInt Bank, 0, Variable%
in die Bank legst, sind die Bytes 0, 1, 2 und 3 für diese Variable belegt. Die nächste Integer-Variable könntest du also erst ab Position 4 speichern (es ginge auch jede andere Position, aber damit würdest du eventuell die erste Integervariable zerstören).
Genauso funktioniert auch das Lesen aus einer Bank:BlitzBasic: [AUSKLAPPEN]
Variable% = PeekInt(Bank, 0)
In Peekint werden ab der Position 0 also die nächsten vier Bytes eingelesen und in Variable% als eine Integer-Zahl gespeichert.
Weiteres darüber erfährst du in derBlitzBase.[/syntax]
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.

Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102

Apprauuuu

BeitragFr, Jul 15, 2005 23:12
Antworten mit Zitat
Benutzer-Profile anzeigen
ARGHH!

Ich wollte jetzt auch in B+ in meinem Mapeditor mit Hilfe von Banks was machen, nur kommt da immernen Fehler:
"Bank cannot be Resized"

Um zu gucken, ob ich nicht irgendeinen Müll gebaut hab, hab ich mal einfach den Code von oben in B+ reinkopoiert und sogar da kommt nen Fehler, obwohl in B3d alles klapppt -.- (kann es daran liegen, dass ich von b+ nur die demo hab oder was soll das -.-??)


Kann mir da vielelicht jemand helfen??
Arbeitsstand:
Umprogrammierung von LOL³Warriors und LOL³Fighters in Bmax...
LOL³Fighters wird spielerisch noch mal ordentlich aufpoliert, um es Ligatauglich zu machen (zumindest für private Funligen von mir ^^)

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group