Type kopieren : Fields mit Schleife durchlaufen möglich ?
Übersicht

KhanLeoBetreff: Type kopieren : Fields mit Schleife durchlaufen möglich ? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Könntest du mittels Reflections lösen
![]() |
||
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) |
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
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/ |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Woops ![]() 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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
KhanLeo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Falls es dir hilft:
Code: [AUSKLAPPEN] Print Str(instanz.TType)
|
||
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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] führt zu nem totalabschmieren von Blitz ^_^" |
||
KhanLeoBetreff: Leistungsfähigkeit von Types ? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Tirus |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 mfg Thunder |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
Tirus |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group