Type kopieren : Fields mit Schleife durchlaufen möglich ?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

KhanLeo

Betreff: Type kopieren : Fields mit Schleife durchlaufen möglich ?

BeitragDo, Aug 26, 2010 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

ich habe folgende genrelle Frage : in meinem Spiel benutze ich Types als Vorlage, die ich bei der Erstellung meiner Objekte als neue Type-Instanz kopiere.

Ist es möglich, die Fields mit einer Schleife zu durchlaufen und so ein Type zu kopieren ? Ich benutze nämlich viele verschiedene Types, und möchte den Aufwand, für jedes Type eine eigene Kopierroutine zu erstellen gerne vermeiden falls möglich.

Danke im Voraus für eure Hilfe
Lars
Blitz3D 1.94
Milkshape 1.8.5

BenQ Joybook S73G mit ATi Radeon Mobility X1600 // WinXP SP3, ATi Catalyst 9.2

Xeres

Moderator

BeitragDo, Aug 26, 2010 14:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Könntest du mittels Reflections lösen
Arrow Clone Objects
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Goodjee

BeitragDo, Aug 26, 2010 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
aber wohl nur mit blitzmax, nicht mit blitzbasic
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Xeres

Moderator

BeitragDo, Aug 26, 2010 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Woops Embarassed total übersehen.
Nein, in Blitzbasic musst du das wohl oder übel von Hand erledigen.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

KhanLeo

BeitragDo, Aug 26, 2010 20:42
Antworten mit Zitat
Benutzer-Profile anzeigen
schade,

dachte, dass es da vielleicht einen Kniff gibt. Aber danke für die Klärung, dann weiß ich zumindest, dass meine Lösung effizient ist.

Glück auf !
Lars
Blitz3D 1.94
Milkshape 1.8.5

BenQ Joybook S73G mit ATi Radeon Mobility X1600 // WinXP SP3, ATi Catalyst 9.2

Silver_Knee

BeitragDo, Aug 26, 2010 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Falls es dir hilft:

Code: [AUSKLAPPEN]
Print Str(instanz.TType)

Eingeproggt

BeitragDo, Aug 26, 2010 22:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin immer wieder überrascht mit was für (für mich) neuen Tricks du ankommst, SilverKnee
Grad probiert, is lustig aber geht nicht mit BlitzArrays. (Array in Type-Field mit eckigen Klammern)

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Silver_Knee

BeitragFr, Aug 27, 2010 10:18
Antworten mit Zitat
Benutzer-Profile anzeigen
ouuu da richtig aufpassen Str stellt die Fehlerprüfung aus damit auch Types ausgewertet werden können.
Ich wollte mal in nen Blitzarray reinsehen:
BlitzBasic: [AUSKLAPPEN]
Local blitz[3]
Print Str(blitz)

führt zu nem totalabschmieren von Blitz ^_^"
 

KhanLeo

Betreff: Leistungsfähigkeit von Types ?

BeitragFr, Aug 27, 2010 19:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo nochmal,

bevor ich mit meinem Super-Projekt weitermache hätte ich noch eine generelle Frage zur Leistungsfähigkeit von Types :
in meinem Raumschiffspiel habe ich alle Schiffe als Type bestehend aus Unter-Types organisiert :

Code: [AUSKLAPPEN]
Type tShip
  Field TypeHandle            ;ID des Type-Objektes
  Field EntityID              ;ID des Mesh-Objektes
  Field TxtName$              ;Anzeigetext im Spiel
  Field TxtClass$             ;Anzeigetext im Spiel
  Field Attitude$             ;Freund-Feind-Erkennung
  Field maxHitpoints          ;max. Lebenspunkte
  Field actHitpoints#         ;aktuelle Lebenspunkte
  Field qotHitpoints          ;Lebenspunkte in % = actHitpoints : maxHitpoints
  Field WeaponOnOff           ;Schaltervariable Waffen an / aus
  Field ShieldOnOff           ;Schaltervariable Schilde an / aus
  Field Weapon1.tWeapon       ;primäre Waffe : Handle des tWeapon-Type  (ca. 20 Fields)
  Field Weapon2.tWeapon       ;sekundäre Waffe : Handle des tWeapon-Type  (ca. 20 Fields)
  Field Weapon3.tWeapon       ;rückwärtige Waffe : Handle des tWeapon-Type  (ca. 20 Fields)
  Field WeaponFired           ;Schalter, ob Waffe 1-3 gefeuert wurde
  Field Shield.tShield        ;Schildgenerator : Handle des tShield-Type  (ca. 10 Fields)
  Field PowerGen.tPowerGen    ;Powergenerator : Handle des tPowerGen-Type  (ca. 10 Fields)
  Field Scanner.tScanner      ;Radar + Zielanzeige : Handle des tScanner-Type  (ca. 10 Fields)
  Field Engine.tEngine        ;Antrieb : Handle des tEngine-Type  (ca. 10 Fields)
End Type


Damit habe ich eine große Flexibilität und kann einfach und schnell neue Schiffe erstellen, da man nur wenige Parameter angeben muß, wodurch dann Instanzen der entsprechenden Sub-Types kopiert werden (daher auch die Thread-Frage).

Nun meine Frage zur Performance : ist es langfristig sinnvoll und performant, Objekte über viele Unter-Types zu erstellen ? Ist der Zugriff langsamer ? Wie verhält es sich bei ca. 50-100 Objekten, bei denen die Sub-Types von den entsprchenden Bewegungs-, Kollisions- und sonstwas-Routinen angesprochen werden müssen ?

Ich kann die Leistungsfähigkeit von B3D einfach noch nicht ganz fassen, gibt es da irgendwelche generellen Regeln ?

Danke für eure Info !
Lars
Blitz3D 1.94
Milkshape 1.8.5

BenQ Joybook S73G mit ATi Radeon Mobility X1600 // WinXP SP3, ATi Catalyst 9.2

Xeres

Moderator

BeitragFr, Aug 27, 2010 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist sinnvoll so - das hantieren mit Variablen sollte nicht so schnell zur Geschwindigkeitsbremse werden. Es ist eher die Masse an Operationen, die kritisch werden könnte. Durch intelligente Vor-Auswahl sollte das kein Problem darstellen.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Tirus

BeitragSa, Aug 28, 2010 11:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt einen Weg die Types zu kopieren, wenn auch nicht mit BlitzBasic selbst.
Mithilfe der Windows API Funktion RtlMoveMemory kann der Inhalt kopiert werden.

Hab hier mal ein einfaches Beispiel:

Code: [AUSKLAPPEN]

Type test
   Field value1
   Field value2
End Type

Local t1.test = New test
Local t2.test = New test

t1\value1 = 5
t1\value2 = 10

For t.test = Each test
   Print t\value1
   Print t\value2
   Print "---------"
Next

Print ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"

RtlMoveMemory t2, t1, 8   ;Die kopier Funktion

For t.test = Each test
   Print t\value1
   Print t\value2
   Print "---------"
Next


Es werden 2 Types erstellt, dem ersten Werte zugewiesen und dann beide ausgegeben.
Logischerweiße ist beim 2ten alles auf 0.

Mit der API Funtkion RtlMoveMemory lässt sich nun das erste auf das zweite kopieren.

Zu beachten ist dabei die Länge (3ter Parameter), jede Variable hat eine länge von 4 Bytes.
Wollte man hier nur t\value1 kopieren so müsstest du die Länge von 4 angeben.

Leider gibt es bei dieser Funktion keinen start Wert, dass bedeutet das du immer nur eine bestimmte Anzahl an Werten von Oben nach unten im Type kopieren kannst.
(Also z.B. nicht nur t\value2)

Zudem sollten keine Strings in Types kopiert werden.

Zu guter Letzt die Decls:
Code: [AUSKLAPPEN]

.lib "kernel32.dll"

RtlMoveMemory(Destination*,Source*,Length):"RtlMoveMemory"


MfG Tirus

Thunder

BeitragSa, Aug 28, 2010 13:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht nur das Kopieren von Strings als Elemente kann problematisch werden. Wenn im Type Instanzen anderer Types verwendet werden (was KhanLeo ja tut), gibt es ein Problem: RtlMoveMemory kopiert natürlich nur diese 4 Byte, die dem Zeiger auf die Instanz entsprechen. Daher zeigen dann beide Types auf dieselben Untertypes und bei einer Modifikation im einen Type wird die "gleichzeitig" auch am anderen angewandt:

BlitzMax: [AUSKLAPPEN]
Type UnterType
Field value%
End Type

Type TWirdKopiert
Field ut.UnterType
End Type

Local t1.TWirdKopiert = New TWirdKopiert
Local t2.TWirdKopiert = New TWirdKopiert

t1\ut=New UnterType
t2\ut=New UnterType
t1\ut\value=10

For t.TWirdKopiert = Each TWirdKopiert
Print t\ut\value
Print "---------"
Next

Print ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"

CopyMemory t2, t1, 8 ;RtlMoveMemory, aber aussagekräftigerer Name

For t.TWirdKopiert = Each TWirdKopiert
Print t\ut\value
Print "---------"
Next

t1\ut\value=20

For t.TWirdKopiert = Each TWirdKopiert
Print t\ut\value
Print "---------"
Next

WaitKey
End


mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
 

Tirus

BeitragSa, Aug 28, 2010 13:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun das ist ja logisch, den hier wird nicht das UnterType kopiert, sondern nur der Zeiger darauf.

Daher sollte man das UnterType auch kopieren (falls man es denn mit anderen Werten Braucht, könnten ja nur referenz Informationen sein, z.B. welche der Existierenden Waffen eingebaut sind), und danach dessen Eintrag in das HauptType entsprechend einfügen.

Falls das UnterType nur Informationen wie Waffenstärke / Schussgeschwindigkeit usw hat, so bräuchte man es ja nicht doppelt, womit es kein Problem darstellt.

MfG Tirus

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group