Verschachtelte Types

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Smily

Betreff: Verschachtelte Types

BeitragMi, Nov 01, 2006 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Eigentlich habe ich ja keine Großen Probleme damit, mit types umzugehen.
Bis jetzt habe ich aber auch nur "einfache" types gebraucht.
Für solche Types gibt es ja auch genug tuts.

Aber bei meinem Aktuellen Projekt brauche ich ein paar verschachtelte Types.
Und dafür konnte ich aber keine Tuts finden.

Um mal ein beispiel zu nennen:

Ich habe alle gegner für einen Weltraumshooter in einem Type gespeichert.

Code: [AUSKLAPPEN]
Type gegner
 Field X
 Field Y
 Field Typ
 Field Energy
 ...
End Type


und jetzt geh ich mal davon aus, dass jeder dieser gegner eine bestimmte Anzahl geschütztürme/waffen hat, die aber unabhängig vom gegner selbst sind.

Also bräuchte ich in dem Type für die gegner einen weiteren Type für die Waffen.

Hoffentlich versteht ihr was ich will ^^

Könnt ihr mir bitte dafür ein tut nennen oder es mir mal hier schnell erklären, wie ich sowas machen kann?

thx4help, Smily0412
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org
 

blitzpunk

BeitragMi, Nov 01, 2006 21:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich das jetzt richtig verstanden hast, hast du verschiedene Arten von Gegnern? (Also kleine,große,schnelle oder lahme Aliens?) Mach doch einfach für jeden Gegnertyp einen eigenen Typ!
Ewig währt am längsten

Holzchopf

Meisterpacker

BeitragMi, Nov 01, 2006 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Type gegner
 Field X
 Field Y
 Field Typ
 Field Energy
 Field Bewaffnung.Waffe
End Type

Type Waffe
 Field Parent.gegner
 Field wasauchimmer
End Type


Meinst du so? Bedenke allerdings, dass dann mit
[/code]For gegner.Bewaffnung = Each WaffeCode: [AUSKLAPPEN]


Jede Waffe durchgegangen wird, nicht nur die von diesem gegner.

MfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

pixelshooter

BeitragMi, Nov 01, 2006 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
darüber bin ich auch gestolpert. Am ende hab ich in die Unterobjekte Backlinks eingefügt, und in der Hauptschleife geguckt, ob sie zu dem Objekt gehören, das ich gerade bearbeite: Nicht sehr schön Confused

Smily

BeitragMi, Nov 01, 2006 21:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie bekomme ich das nun aber hin, dass BB nur die Waffen durchgeht, welche zu den einem gegner gehören?
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

BladeRunner

Moderator

BeitragMi, Nov 01, 2006 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
mit ql:Handle und ql:object.
Du legst in deinem Type ein Blitzarray für die Waffen an und speicherst die Handles der Waffen darin.
Dann kannst du durch das Array iterieren und per object gezielt auf die einzelnen Waffen zugreifen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

c64

BeitragDo, Nov 02, 2006 10:54
Antworten mit Zitat
Benutzer-Profile anzeigen
HI Smile 0412,

Also verschachtelte Types benutz ich fast ausschliesslich, und für das prob mit der Waffe bzw. die Waffen die ein Spieler hat kann man sich ja dann noch ein Array basteln und die WeapIDs reinpacken die zum Spieler gehören, hat kein Zusammenhang ? Smile hehe doch doch, unzwar mit diesem Code.

Ist aber nur zur veranschaulichung und für mich die beste Lösung, wer es anders macht ok. Ich hoffe es kann ein wenig helfen oder zumindest Denkansätze geben. Und da du schon Types gut kannst solltest du damit klar kommen aber ich habs dennoch ein wenig ausdokumentiert. Und auch mit meinem ansatz muss man alle Waffen durchgehen, aber wie gesagt es so erweiterbar das es auch dafür eine Lösung geben kann !!

[Idee]
Field AllWeapons[32] und dann immer die erstellte waffe in dieses Array speichern also die rückgabe ID , das Feld sollte dann in TPlayerClass stehen ) und beim aufruf von GL_add_PlayerWeapon () kann man ja dies Regeln lassen von der Function.
[/Idee]

PS: lass dich nicht von dem GL irretieren habs alles aus meiner Engine flink Konvertiert zu diesem Beispiel.


mfg.
Patrick
Betreten verboten! Kinder haften für ihre Eltern!

x-pressive

Betreff: Re: Verschachtelte Types

BeitragDo, Nov 02, 2006 13:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Smily0412 hat Folgendes geschrieben:
Aber bei meinem Aktuellen Projekt brauche ich ein paar verschachtelte Types. Und dafür konnte ich aber keine Tuts finden.

Seltsam, ich schon -gleich die erste Google-Suche liefert als ersten Treffer ein gutes Tutorial dazu: Klick mich Wink

In solchen Fällen benutze ich aber in der Regel keine verschachtelten Types (könnte ein Problem beim Löschen einzelner Instanzen geben), sondern verpasse einem Type einfach ein Feld, in dem ich das Handle einer anderen Type-Instanz speichern kann:

BlitzBasic: [AUSKLAPPEN]
Player\WeaponID% = Handle(WeaponObj)


Dann kannst du jederzeit die gesuchte Type-Instanz wieder ausfindig machen mit

BlitzBasic: [AUSKLAPPEN]
WeaponObj.TypeWeapon = Object.TypeWeapon (Player\WeaponID)
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL
 

c64

BeitragDo, Nov 02, 2006 13:29
Antworten mit Zitat
Benutzer-Profile anzeigen
@X-pressive, naja so ungefähr hab ichs auch, nur so kann der player halt nur eine Weapon bekommen oder bzw. man macht daraus n Array und speichert dort die einzelnen Handles aber ich habs so das die Waffe weiss zu welchem Spieler sie gehört. Sicher gibt es da eine unmenge an Lösungen ... Rom und so Smile .

Beispiel !!

Code: [AUSKLAPPEN]


;////////////////////////////////////////
;/
;/

Function GL_add_weapon2Player (Player_ID,Weap_Type=0)
                        
                        
       ; Weap (GUN !) type ist hier erstmal egal da es ja nur um Types geht
               
       weap             = GL_Create_WeaponObj ()
   
        WeaponOBJ\PlayerOBJ = Player_ID
   
       WeaponOBJ\Weap_Type = Rand(        5 )
   
       WeaponOBJ\Ammo       = Rand( 500,1000 )
                              
End Function

;/
;/
;////////////////////////////////////////


Aber wie gesagt die Function und die Playerclass kann man ja so erweitern dass der Player ein Weapon Array bekommt und man dort die waffen die er hat reinsetzt.

Was das löschen angeht ist auch alles kein Thema aber in meinem Beispiel oben hab ich dass erstmal nicht beachtet Wink.

mfg

Patrick
Betreten verboten! Kinder haften für ihre Eltern!

x-pressive

BeitragDo, Nov 02, 2006 14:22
Antworten mit Zitat
Benutzer-Profile anzeigen
c64 hat Folgendes geschrieben:
oder bzw. man macht daraus n Array und speichert dort die einzelnen Handles

Das wäre doch eigentlich recht praktisch. Der Player kann,sagen wir, bis zu zehn Waffen aufnehmen.

Dann könnte man dem Player-Type noch ein Feld \current_weapon% geben, das den Index der aktuell ausgewählten Waffe in seinem Repertoire angibt. Also z.B.

BlitzBasic: [AUSKLAPPEN]
Type TPlayer
Field current_weapon%
Field WeaponIDs[10]
End Type


und dann

BlitzBasic: [AUSKLAPPEN]
WeaponObj.TypeWeapon = Object.TypeWeapon (Player\WeaponIDs [Player\current_weapon] )
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

BladeRunner

Moderator

BeitragDo, Nov 02, 2006 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
nicht dass ich nicht genau das vorgeschlagen hätte ... Rolling Eyes
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

c64

BeitragDo, Nov 02, 2006 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
*Grins , haste auch Bladerunner nur ich habe dazu ein Beispiel geschrieben siehe 1. Post von mir. Um zu zeigen wie komplex man im prinzip mit Handle und Object arbeiten kann. Bzw. ich habe 2 Möglichkeiten angeboten 1* die Oben und 1* die mit dem Array Wink wobei ich die Oben bevorzuge da man dem Spieler XXXXX waffen zuordnen kann und in CurrentWeapon kann man das Handle der Waffe eintragen die der Player benutzt und nicht einen Array verweis wobei diese möglichkeit auch geht.


das Beispiel https://www.blitzforum.de/upload/file.php?id=684 .


mfg

Patrick
Betreten verboten! Kinder haften für ihre Eltern!

x-pressive

BeitragDo, Nov 02, 2006 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
@BladeRunner: doppelt hält eben besser Wink Ich weiss noch, das mich anfangs Handle und Object ein bisschen verwirrt haben, deshalb schadet es nicht, wenn man genauer darauf eingeht.
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

BladeRunner

Moderator

BeitragDo, Nov 02, 2006 23:36
Antworten mit Zitat
Benutzer-Profile anzeigen
ach, ihr habt ja recht...
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

tft

BeitragDo, Nov 02, 2006 23:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi...

wären verkettete Listen dazu nicht besser geeignet?
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

x-pressive

BeitragFr, Nov 03, 2006 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
tft hat Folgendes geschrieben:
wären verkettete Listen dazu nicht besser geeignet?

Verstehe nicht ganz, wie du das meinst. Eigentlich sind alle Beispiele hier ja "verkettete Listen" (Types an sich sind ja schon verkettete Listen).

Ich denke, es hat schon Vorteile, wenn man nur eine Referenz auf die Waffe im Player-Type speichert und nicht die ganze Instanz selbst. So bleibt die Waffe "unabhängig" und kann z.B. auch wieder fallengelassen und von einem anderen Player aufgenommen werden.
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

tft

BeitragSa, Nov 04, 2006 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi ....

x-pressive

sicher hast du recht. Aber ich habe die Erfahrung gemacht. Das alle Type deklarationen mangels Pointer auf die start Strucktur lediglich die Referenzen zurückgeben. Dadurch lassen sich Types nur bedingt verschachteln. Man kann zum Beispiel ein definertes Type das in verschiedenen verschachtelten Type definitionen vorkommt nicht expliziet mit Each durchblättern. Da werden dann alle Types der selben Definition durchgearbeitet. Das kann man eigentlich nicht gebrauchen. Sonst muss mein jedesmal eine Referenz einfügen zur erkennung wohin den das Type Feld nu gehört. Das widerspricht etwas dem allgemeinen verständniss.
Besonders ist mir das aufgefallen als ich angefangen habe den Code Editor in B3D zu Coden. Der Befehl HANDLE() gibt nur einen Index zurück. Daher muss man alle relevanten indizien mit einer Liste verketten um so nicht jedesmal die Masse an Deklarationen eines Types durchforsten zu müssen. Bei 100 Einträgen mag das egal sein. Aber schon bei 1000 macht sich das erheblich bemerkbar. Types sind foll tolll------ erlich. Ich verwende sie gerne dann wenn ich nicht weis wiefiele ich wirklich brauche. Aber sobalt es etwas Komplexter wird. Muss man mit externen verkettungen arbeiten. Fieleicht ist das in BMax ja nicht so......... in B3D jedenfals sind Types nicht wirklich genial gelöst. Es kann natürlich auch sein das ich einfach etwas übersehen habe. Und mich einfach nur dumm angestellt habe.
Wenn das Thema weiter geht... poste ich mal etwas Code.

PS: auf alle Rechtschreibfehler erhebe ich (C) Anspruch
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

BladeRunner

Moderator

BeitragSa, Nov 04, 2006 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Types sind in Bmax wesentlich flexibler, da man sich selbst um die Archivierung derselben kümmert.
D.h. in jeder Liste sind nur noch die Einträge die für dich relevant sind.
(und es gibt beliebig viele Listen Wink )
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

pixelshooter

BeitragSa, Nov 04, 2006 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, so ne lösung ist ja wohl nix:
Code: [AUSKLAPPEN]
type parent
field hallo
end type

type child
field childhallo
field parent.parent
end type

[...]

for i.parent = each parent
print i\hallo
for j.child = each child
if j\parent = i
print j\childhallo
endif
next
next

Dass man also, wenn man die Oberklasse durchgeht, man also dadrin erst mal jeweils alle mgl Unterobjekte durchgeht, und guckt, ob die auch zu dem gerade angewählten Oberobjekt gehören.
a) langsam
b) braucht speicher
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc

Bob

BeitragSo, Nov 05, 2006 13:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

also ich löse das Problem immer mit Banks
Da Banks zur Laufzeit ja verändert erden können kan ein Gegner belibig viele Waffen haben.

Das ganze hat zwar den Nachteil eines aufwendigeren Verwaltungs Overhead ist abe sehr Flexibel.
Die Bank ist vom Type Integer und speichert die Handle der Waffen.

Code: [AUSKLAPPEN]

Type gegner
 Field X
 Field Y
 Field Typ
 Field Energy
 Field wBank  ; Waffen Bank
 Field Bez$
End Type

Type Waffe
 Field Bez$   
 Field Parent.gegner
 Field Energy
 Field BankPos ; Position inerhalb der Bank
End Type

Global FDG.Gegner
Global Gds.Gegner


g.Gegner  = New Gegner
g\bez = "Fluch der Galaxis"
g\x = 50
g\y = 100
g\typ =1
g\energy = 250

GDS = G


g.Gegner  = New Gegner
g\bez = "Grobasch der Sternenschlaechter"
g\x = 400
g\y = 100
g\typ =1
g\energy = 250

FDG = G


Dim wArr$(6)
wArr$(0) = "Laserkanone"
wArr$(1) = "Plasmakanone"
wArr$(2) = "Disrupter"
wArr$(3) = "Torpedowerfer"
wArr$(4) =  "Partikelschleufder"
wArr$(5) =  "Antimaterie Impulsgeber"
wArr$(6) =  "Ionenkanone"




For i = 0 To 99
   w.waffe = New Waffe
   w\bez = warr(Rand(0,6))
   If Rand(0,1) = 0 Then
      w\Parent = FDG
   Else
      w\Parent = Gds
   EndIf
   w\Energy = Rand(10,250)
   AddWaffeToGegner(w)
Next



ShowWaffen GDS
ShowWaffen FDG



Function ShowWaffen(G.Gegner)
   Local B
   Local BS
   Local w.Waffe
   Local wHnd
   DebugLog ""
   DebugLog "Gegner: " + g\bez
   DebugLog "--------------------------"
   B = g\wBank
   BS = BankSize(g\wBank) - 4
   For I = 0 To BS Step 4
      whnd = PeekInt(B,I)
      w = Object.Waffe(wHnd)
      DebugLog "Name der Waffe: " + w\bez + "  energy: " + w\energy + "  Pos: " + w\bankPos
   Next
End Function




w.waffe = First Waffe
DeleteWaffe W
w.waffe = Last Waffe
DeleteWaffe W
w.waffe = First Waffe
For i = 0 To 2
   W.Waffe = After w
Next
deleteWaffe W

      

Function AddWaffeToGegner(w.Waffe)
   Local G.Gegner
   G = w\Parent
   If g\wBank = 0 Then  g\wBank = CreateBank(0)
   Local BS = BankSize(g\wBank)
   ResizeBank g\wBank, BS+4
   PokeInt g\wBank, BS,Handle(w)
   w\BankPos = BS
End Function


Function DeleteWaffe(w.waffe)
   Local G.Gegner
   G = w\Parent
   Local BS = BankSize(g\wBank)
   DebugLog " Bankzieze von " + g\bez + " " + BS
   
   ;Wenn die Waffe die erste Waffe in der Bank ist .....
   If w\BankPos = 0 Then
   DebugLog "Erste Waffe von " + g\bez + " wird gelöscht  Pos: " + w\Bankpos     
     CopyBank g\wBank,4,g\wBank,0,BS-4
   ;Wenn die Waffe die letzte Waffe in der Bank ist .....
   ElseIf w\BankPos = BS Then
      DebugLog    "Letze Waffe von " + g\bez + " wird gelöscht  Pos: " + w\Bankpos     
       ResizeBank g\wBank ,BS-4 :<<<<<LÖSCHEN
   ;Wenn die Waffe irgendwo in der Bank ist .......
   Else
      DebugLog "Eine Waffe von " + g\bez + " wird gelöscht   Pos: " + w\Bankpos     
       CopyBank g\wBank, 0, g\wBank,  0, w\BankPos-4
       CopyBank g\wBank, w\BankPos,  g\wBank, w\BankPos,BS -w\BankPos
   EndIf
   ResizeBank g\wBank, BS-4
   Delete W
End Function



EDIT:
Obiger Code ist nicht ganz korrekt wie mir grade aufgefallen ist.
Die Stelle die Entfernt werden kann ist makiert.
Eigentlich kann sogar der gesamte Elseif Block der ensprechenden Stelle gelöscht werden. Eine Resize Bank wird ja am Ende der Function sowieso durchgeführt.
  • Zuletzt bearbeitet von Bob am Mo, Nov 06, 2006 9:32, insgesamt 2-mal bearbeitet

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group