Verschachtelte Types
Übersicht

![]() |
SmilyBetreff: Verschachtelte Types |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
pixelshooter |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
![]() |
Smily |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
HI ![]() 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 ? ![]() 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-pressiveBetreff: Re: Verschachtelte Types |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@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 ![]() 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 ![]() mfg Patrick |
||
Betreten verboten! Kinder haften für ihre Eltern! |
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 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 |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
nicht dass ich nicht genau das vorgeschlagen hätte ... ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
*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 ![]() das Beispiel https://www.blitzforum.de/upload/file.php?id=684 . mfg Patrick |
||
Betreten verboten! Kinder haften für ihre Eltern! |
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
@BladeRunner: doppelt hält eben besser ![]() |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 !!!!!! |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group