Datenverwaltung mit Types bzw. Untertypes (Gelöst)
Übersicht

BackbufferBetreff: Datenverwaltung mit Types bzw. Untertypes (Gelöst) |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo zusammen,
ich programmiere gerade einen space-shooter und hab auch schon ein bisschen was geschafft. Bevor ich jedoch weiter mache, wollte ich meinen Code überarbeiten und optimieren. Dabei bin ich auf folgendes Problem gestoßen: Ich verwalte die Schiffe als types, was soweit auch funktioniert. Allerdings hätte ich gern innerhalb eines types ein field definiert, das wiederum mehrere Variablen enthält. Das heißt: statt Field mass, speed, size, usw hätte ich lieber Field class, und irgendwo anders steht dann ein einziges mal (und nicht für jedes schiff einzeln), dass ein Schiff dieser class soundso vile mass, speed und size hat. Ist das überhaupt möglich und wenn ja, wie? Ich weiß, dass ich mit blitzarrays innerhalb eines types arbeiten kann, allerdings scheint, das nicht die lösung zu sein.[/code] |
||
- Zuletzt bearbeitet von Backbuffer am Sa, Jul 26, 2008 12:44, insgesamt einmal bearbeitet
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] Type schiff
Field x,y Field class.class End Type Type class Field speed,mass,size End Type Sowas? mfG, Christoph |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
Backbuffer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, also so eine verschachtelte type habe ich im Moment. Vielleicht wende ich sie ja falsch an, aber das vermindert die Schreibarbeit kein bisschen. Da ich trotzdem jedes mal den Variablen einen Wert zu weisen muss, und nicht auf das Untertype verweisen kann. | ||
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich knall dir da jetzt einfach was hin.. ich hoffe, ich hab das Problem da halbwegs richtig verstanden:
Code: [AUSKLAPPEN] ;Klassen definieren (Am Anfang... Gilt dann im ganzen Spiel) class_leicht.class=New class class_leicht\mass=10 class_leicht\speed=15 class_leicht\size=5 class_schwer.class=New class class_schwer\mass=20 class_schwer\speed=10 class_schwer\size=20 ;Gegner erstellen schiff.schiff=New schiff ;EDIT: Den vom Xeres erkannten Fehler ausgebessert ;x,y wie du willst ^^ schiff\class=class_leicht ;Da musst du nichts mehr neu eingeben! |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
- Zuletzt bearbeitet von Eingeproggt am Fr, Jul 25, 2008 15:27, insgesamt einmal bearbeitet
Backbuffer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also bei mir heißt es da illegal type conversion??? | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eingeproggt vergas schiff als Type schiff zu deklarieren...
Code: [AUSKLAPPEN] schiff.schiff=New schiff
|
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Backbuffer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nee, das habe ich bei mir schon richtig gemacht. Also hier mal der Code:
Code: [AUSKLAPPEN] Type t_Ship Field player, name$, id_number,fraction, alliance, scanned ;allgemeine variablen zur identifizierung des schiffs Field t_shipstyle Field cur_forward_speed#, cur_backward_speed#, cur_turning_speed#, cur_forward_acc#, cur_backward_acc#, cur_turning_acc#, cur_shield#, cur_hull# Field cur_energy#, cur_shield_reload#, cur_energy_reload#,cur_hull_reload#, cur_system#,lifeform$, atmosphere$, temperature$,humidity$, airpressure$ Field xpos#, ypos#, heading#, xspeed#, yspeed#, total_speed#, xdistance#, ydistance#, remove, timer_shot#, target, cur_crew End Type Type t_Shipstyle Field class$, image, scanner_image,description$, size, mass, absolute_shield_strength$, absolute_hull_strength$, max_forward_speed#, max_backward_speed# Field max_turning_speed#, max_forward_acc#, max_backward_acc#, max_turning_acc#, max_shield#, max_hull#, max_energy#, max_shield_reload# Field max_energy_reload#,max_hull_reload#, max_system#, min_crew ;noch fehlend, alle equipment variablen End Type Global demron.t_shipstyle=New t_shipstyle demron\class="Demron" demron\image=3 demron\scanner_image=0 demron\description = "Utility Freighter" demron\size = 2 demron\mass = 100 demron\absolute_shield_strength="Medium" demron\absolute_hull_strength="Medium" demron\max_forward_speed = 5 demron\max_backward_speed = 2 demron\max_turning_speed = 2 demron\max_forward_acc = 2 demron\max_backward_acc = 1 demron\max_turning_acc = 2 demron\max_shield = 500 demron\max_hull = 500 demron\max_energy = 500 demron\max_shield_reload = 5 demron\max_hull_reload = 0 demron\max_energy_reload = 5 demron\max_system = 100 demron\min_crew = 1 Global stinger.t_shipstyle=New t_shipstyle stinger\class="Stinger" stinger\image=3 stinger\scanner_image=0 stinger\description = "Light Fighter" stinger\size = 0 stinger\mass = 10 stinger\absolute_shield_strength="Light" stinger\absolute_hull_strength="Light" stinger\max_forward_speed = 8 stinger\max_backward_speed = 3 stinger\max_turning_speed = 3 stinger\max_forward_acc = 4 stinger\max_backward_acc = 2 stinger\max_turning_acc = 3 stinger\max_shield = 300 stinger\max_hull = 100 stinger\max_energy = 50 stinger\max_shield_reload = 5 stinger\max_hull_reload = 0 stinger\max_energy_reload = 5 stinger\max_system = 100 stinger\min_crew = 1 Global ship.t_Ship = New t_Ship ship\player = 1 ship\name = "" ship\id_number = Handle(ship) ship\fraction = 0 ship\alliance = 1 ship\scanned = 0 ship\t_shipstyle = demron In der letzten Zeile kommt die Fehlermeldung. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] Field t_shipstyle
Field shipstyle.t_shipstyle Auch das Field muss entsprechend wissen was für einen Variablentyp es enthält. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] Type t_Ship
;[...] Field t_shipstyle.t_shipstyle ;<- Da hat die Type-identifkation gefehlt! ;[...] Jetzt müssts aber gehn ![]() mfG; Christoph. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
Backbuffer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die blitschnelle Hilfe. Jetzt klappts. Bin aber gleich beim nächsten Problem. Und zwar möchte ich Variablen des Spielerschiffs mit Variablen vom gegnerischen Schiffen vergleichen und habe, da das Problem, dass BB keine Instanzen unterstützt. Bis jetzt hatte ich einfach zwei verschiedene types für Spieler und Gegner gehabt. Ist aber eine sehr unelegante Lösung. Da gibt's sicher noch was andereres. | ||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
mai oui unterstützt BB da instanzen:
guckst du for ![]() ![]() |
||
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 |
Backbuffer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, schon, aber man kann damit ja nicht arbeiten. Am liebsten hätte sozusagen player.type mit gegner.type verglichen, aber das ist ja eine Liste, so dass alles durcheinander kommt.
Möglicherweise kommt man mit Handle Object zum Ziel. Aber genau da klemmts bei mir. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hast du doch schon im Type drin den du gepostest hast...
Code: [AUSKLAPPEN] Type t_Ship
Field Typ$ Field ID End Type spieler.t_Ship = New t_Ship spieler\Typ = "Spieler" spieler\ID = Handle(spieler) For i = 1 To 5 feind.t_Ship = New t_Ship feind\typ = "Feind" feind\ID = Handle(spieler) Next For ship.t_Ship = Each t_Ship If ship\ID <> spieler\ID Then ; Weitere Kriterien wie Feind, Spieler, Fraktion usw. EndIf Next |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Backbuffer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Sorry, Du hast recht. Ich habe das Problem auch falsch verortet. Der Vergleich ist anscheinend doch nicht das Problem sonder erst der Schritt danach.
Also im ersten Schritt, such ich den nächstgelegen Gegner aus: Code: [AUSKLAPPEN] Function nearest_enemy_target()
distance_to_target= 1000^3 For ship.t_ship = Each t_ship ;jedes schiff wird durchlaufen If ship\alliance = -1 ;nur feinde If Sqr((ship\xpos-player\xpos)^2+(ship\ypos-player\ypos)^2) < distance_to_target Then distance_to_target= Sqr((ship\xpos-player\xpos)^2+(ship\ypos-player\ypos)^2) target_selected = 1 player\target = ship\id_number Insert ship Before First t_ship End If End If Next End Function Dadurch wird der Gegner zum ersten Eintrag in der Liste, was so gewollt ist (Scanner zeigt immer den ersten Eintrag an), aber damit kollidiert, das bei mir der erste Eintrag der Spieler ist/war. Da dachte ich, dass ich mit dem folgendn Befehl, Code: [AUSKLAPPEN] player.t_ship = Object.t_ship(player\id_number) einfach über die ID des spielers, die ich mit handle festgelegt habe, mir wieder das Schiff des Spieler herausgreifen kann, um damit zu arbeiten. Aber dann heißt es, dass das Objekt nicht existiert. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sieht für mich so aus, wie ein klassisches Beispiel, um sich per Funktion einen Type zurückliefern zu lassen... um beim Beispiel zu bleiben:
Code: [AUSKLAPPEN] Type t_Ship
Field Typ$ Field Nr Field ID End Type Global spieler.t_Ship = New t_Ship spieler\Typ = "Spieler" spieler\ID = Handle(spieler) For i = 1 To 5 feind.t_Ship = New t_Ship feind\typ = "Feind" feind\Nr = i feind\ID = Handle(spieler) Next ein_feind.t_Ship = getfeind.t_Ship(Rand(1,5)) Print("Feind Nr. " + ein_feind\Nr) WaitKey() End Function getfeind.t_Ship(fn) For ship.t_Ship = Each t_Ship If ship\typ = "Feind" Then If ship\Nr = fn Then Return ship.t_Ship EndIf Next End Function |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Backbuffer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also, erst einmal vielen Dank für die Mühe, die Du Dir mit einer so ausführlichen Antwort machst. Ich habe Deinen Code eine ganze Weile studiert und bin nicht wirklich schlau daraus geworden.
1. Dass Du der Feind/ID den Handle des Spielers zuweist ist wahrscheinlich nur ein Tipfehler? Ist für das Beispiel auch egal, aber zum Verständnis... 2. Dass mit der Funktion klappt in meinen Code nicht, weil ich den Wert selber in einer Funktion verwende. 3. Irgendwie weiß ich nicht, wie der Code mir helfen kann. Schaff den Transfer auf mein Problem nicht. 4. Mir ist aufgefallen, dass Du eine Variable Feind\Nr verwendest. Ist diese notwendig bzw. kann man da nicht eben den Handle verwenden? 5. Warum klappt dieser Befehl so nicht? [/code]player.t_ship = Object.t_ship(player\id_number)Code: [AUSKLAPPEN] Ich dachte, dass Object eben genau dazu da ist. So viele Fragen auf einmal, aber man will das ganze ja auch mal verstehen. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich dachte daran das du die Zeile "Insert ship Before First t_ship" durch "Return ship.t_ship" ersetzen könntest. Du müsstest nur checken ob das Objekt zufällig NULL ist - wenn keine der Bedingungen zutrifft.
Zu 2. Welchen Wert, wo? Zu Handle und Objekt bin ich gerade überfragt, da immer 1 ausgegeben wird, wenn man sich die Werte meines beispiels mit Print anzeigen lässt - was ja absolut nicht eindeutig ist. Ob es ein Versionsbedingtes Problem ist... |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Backbuffer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielen Dank für die Hilfe.
Ich habe jetzt eine Lösung gefunden. Statt mit Object auf das richtige Schiff zu pointen benutze ich jetzt einfach den each Befehl, so dass die Schleife abgebrochen wird, wenn das richtige Schiff erreicht wird. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group