Objekt->Variabel viele Verknüpfungen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Firstdeathmaker

Betreff: Objekt->Variabel viele Verknüpfungen

BeitragDi, März 08, 2005 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe ein Problem, auf dass ich sehr oft stoße, aber noch keine sehr tolle Lösung gefunden habe:

Wenn man ein Objekt definiert hat, sagen wir z.B. ship, und diesem jetzt eine vorher nicht definierte Anzahl an Waffen geben möchte, die jeweils auch aus einem Objekt bestehen, wie stellt man das am besten an? Die einzige Methode die mir einfällt, wäre die, dass ich in jeden Waffentype schreibe ob und wo die nächste zu finden wäre, aber das ist mir irgendwie zu unsauber. Ich versuch es mal zu beschrieben:

BlitzBasic: [AUSKLAPPEN]
Type raumschiff
Field x
Field y
Field weapon.weapon
End Type

Type weapon
Field ID
Field relative_x;bezeichnet die Abschussposition des Schusses relativ zum raumschiff
Field relative_y
Field nextweapon
End Type



Weiß jmd wie man das besser lösen könnte?

Ich hab schon überlegt mit Blitzarray´s zu arbeiten, aber die legt man ja vorher auch schon fest, womit sie also nicht mehr variabel viele sein könnten:

BlitzBasic: [AUSKLAPPEN]
Type raumschiff
Field x
Field y
Field waffen[5] ;< Problem
End Type
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Bob

BeitragDi, März 08, 2005 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Firstdeathmaker,

dies ist leide einer der größten Schwachstellen von BB.
Es lassen sich nur unzureichende oder gefrickelte Objekthirachien bilden.
Wenn es nun wirklich sein muss das dein Schiff eine variable Anzahl von Waffen haben soll, würde ich im Type Schiff einen Waffenbank anlegen.
In Der Bank speicherst du die Handles der Waffen.

Type Schiff
Field X,Y,USW
Field wBank
End Type

Der Handel der Waffe wird dann in die Bank eingetragen. (LONG Wert 4 Byte)
Bei einem Entfernen der Waffe aus dem Schiff, kannst du den Eintrag mittels CopyBank ausfiltern und Löschen. Das geschieht mit maximal 3 CopyBank Befehlen.
Angenommen du hast 10 Waffen und willst Waffe 7 Löschen. Kopier die Bank von Pos 1 bis 6 in eine Temp Bank. Dann Position 8 bis 10 auch rein Kopieren. ResizeBank der WaffenBank durchführen und TempBank nach Waffenbank Kopieren.
Ist ein bißchen Overhed aber es ist eine der wenigen sinnvollen Methoden um vom übergeordneten Objekt alle Unterobjekkt zu verwalten.

Ich wünsche mir Collections.

Gruß Bob
 

Darren

BeitragDi, März 08, 2005 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
So ein ähnliches problem habe ich auch zur zeit. Ich habe einen waypointeditor und jeder waypoint hat bei mir childs die mit ihm verbunden sind bis jetzt hab ich das aus 1 child begrenzt jetzt will ich aber unbegrenzt childs haben. Bis jetzt habe ich immer einen zeiger auf einen anderen typeeintrag gezeigt. Aber dafür muss man ja auch in dem container sorgen.
MFG Darren
 

BIG BUG

BeitragDi, März 08, 2005 19:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Am Ende dieses Threads ist ein Beispiel, wie solche Fälle (zwar etwas umständlicher) abgebildet werden können.
https://www.blitzforum.de/viewtopic.php?t=1052
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)
 

Dreamora

BeitragDi, März 08, 2005 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Idee:

Es gibt die inoffiziellen B3D Befehle handle und object. Wenn ihr die zusammen mit einer Bank im Type nutzt ist das alles garkein Problem Smile


Zuerst packt ihr den Handle des Types in die Bank rein und wenn ihr ihn zurück bekommst, könnt ihr diesen über Object wieder zurückholen.

Für genauere Informationen müsst ihr lediglich www.blitzbase.de konsultieren.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Bob

BeitragDi, März 08, 2005 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

Es gibt die inoffiziellen B3D Befehle handle und object. Wenn ihr die zusammen mit einer Bank im Type nutzt ist das alles garkein Problem


Na sag ich doch.


Hier mal ein Test. Sollte Funktionieren

BlitzBasic: [AUSKLAPPEN]
Type raumschiff 
Field x
Field y
Field Waffen
End Type

Type weapon
Field relative_x;bezeichnet die Abschussposition des Schusses relativ zum raumschiff
Field relative_y
End Type

Const BYTE_SIZE = 4


;Dein Raumschiff
R.Raumschiff = New Raumschiff
r\x = 400
r\Y = 300
r\Waffen = CreateBank(0) ;Bankgröße erstmal 0
MyShip = Handle(r)

;10 Gegner
For i = 0 To 9
r\x = Rand(800)
r\Y = Rand(600)
r\Waffen = CreateBank(0) ;Bankgröße erstmal 0
Next


CreateWaffe(MyShip,-10,0)
CreateWaffe(MyShip, 10,0)
CreateWaffe(MyShip, -20,0)
CreateWaffe(MyShip, 20,0)


ShowWaffen MyShip

deleteWaffe MyShip,2
ShowWaffen MyShip

;Funktion um neue Waffe zu erstellen und Sie dem Beitzer zuzuordnen
Function CreateWaffe(SchiffHND,X,Y)
;Besitze auswählen
R.Raumschiff = Object.Raumschiff(SchiffHND)
;Bank Vergrößern
Local Size = BankSize(r\Waffen)
ResizeBank r\Waffen,Size+BYTE_SIZE
w.weapon = New weapon
w\relative_x = X
w\relative_Y = Y
PokeInt r\Waffen,Size,Handle(w)
End Function


;Function um eine Waffe zu Löschen
Function DeleteWaffe(SchiffHND,WaffenNr)
;Besitze auswählen
R.Raumschiff = Object.Raumschiff(SchiffHND)
Local Pos =Waffennr * BYTE_SIZE
w_HND = PeekInt(r\Waffen,Pos)
Local Size = BankSize(r\Waffen)
Local tmpBank = CreateBank(size-4) ;Neue Bank mit 1nem Speicherplatz kleiner als die Originale Bank
;Wo befindet sich die Waffe inerhalb der Bank?
If Pos = 0 Then ; Erste Waffe
CopyBank R\Waffen , Pos + BYTE_SIZE , TmpBank, 0, Size-BYTE_SIZE
ElseIf Pos = Size -BYTE_SIZE ;Letzte Waffe
CopyBank R\Waffen , 0 , TmpBank, 0, BankSize(TmpBank)
Else ;Weder erste noch letzte Waffe
CopyBank R\Waffen , 0, TmpBank, 0, Pos
CopyBank R\Waffen , Pos+BYTE_SIZE, TmpBank, Pos, Size -Pos -BYTE_SIZE
EndIf
ResizeBank r\Waffen, Size -BYTE_SIZE
CopyBank tmpBank,0 ,R\Waffen,0,BankSize(tmpBank)
FreeBank tmpBank
w.weapon = Object.weapon(w_HND)
Delete w.weapon
End Function


;Function um alle Waffen eines Raumschiffs anzuzeigen
Function ShowWaffen(SchiffHND)
R.Raumschiff = Object.Raumschiff(SchiffHND)
Local Size = BankSize(r\Waffen)

DebugLog \"Waffenliste für Schiff \" +Handle(r)

For i = 0 To Size / Byte_SIZE - 1
whnd = PeekInt(r\Waffen,i * Byte_Size)
w.Weapon = Object.Weapon(whnd)
DebugLog \"Waffe Nr. \" + i + \" X | Y \" + w\relative_x + \" \" + w\relative_Y
Next
DebugLog \" \"

End Function

Firstdeathmaker

BeitragDi, März 08, 2005 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, verstehe. Und dadurch dass man die Bank an die Variable "Waffen" übergeben kann ist für jedes Schiff eine eigene Bank erstellbar?

Genau das habe ich gesucht. Vielen Dank!
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group