Eigene Types kopieren?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Skabus

Betreff: Eigene Types kopieren?

BeitragDi, Jun 07, 2011 0:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Ich stehe gerade irgendwie auf dem Schlauch.Ich hoffe jemand kann helfen.

Also...

Ich habe für mein Projekt einen Typ enemyStr erstellt, dieser wird dazu verwendet
Gegner zu definieren(Attribute etc.)

Eine typische Gegnerdefinition sieht so aus:

Code: [AUSKLAPPEN]
Global batV1:enemyStr = New enemyStr

batV1.ID                = 0      
batV1.name            = "schwache Fledermaus"
batV1.level            = 1
batV1.ResistanceCur           = 10
batV1.ResistanceMax      = 10
batV1.MentalPowerCur      = 1
batV1.MentalPowerMax      = 1
batV1.status            = "Gesund"
batV1.enEXP            = 10
batV1.Strength         = 3
batV1.Skill            = 3
batV1.Shiftiness         = 8
batV1.MentalStrength      = 3
batV1.MentalPowerCur      = 0
batV1.MentalPowerMax      = 0
batV1.ResistanceCur      = 10
batV1.ResistanceMax      = 10
batV1.Destiny            = 1
batV1.ArmorBonus         = 0
batV1.Damage            = 3
batV1.kiRoutine         = 0
batV1.elAbFire            = 0
batV1.elAbEarth         = 0
batV1.elAbWind              = 0
batV1.elAbWater         = 0
batV1.elAbDark         = 0
batV1.elAbHoly            = 0
batV1.elAbBlood         = 0
batV1.elAbBody         = 0
batV1.elAbDragon         = 0
batV1.elAbPoison         = 5
batV1.elAbTime         = 0


Dies ist aber wie man sieht nur die Blaupause für einen Gegner.
Für mein Kampfsystem muss ich nun "Kopien" dieser Blaupause erstellen.

Ich weiß aber nicht wie das gehen soll.Genauer: Ich weiß wie das in Java und C++ und C# geht,
allerdings klappt das alles in BMax nicht so wie es soll...

Ich kann ja nicht einfach schreiben:

Local newEnemy:enemyStr = batV1

Denn dann referenziere ich ja nur auf das batV1-Objekt und ändere batV1 wenn ich z.B. Lebenspunkte
abziehe etc.

Ich hoffe das Problem ist klar geworden^^

Kennt jemand eine elegante, praktische Art wie ich davon Kopien erstellen kann OHNE jedes einzelne
Attribut manuell zu übergeben?


Wäre für eure Hilfe wie immer sehr dankbar!


MfG Ulukai
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

Xeres

Moderator

BeitragDi, Jun 07, 2011 0:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ginge mittels Reflection 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)

BladeRunner

Moderator

BeitragDi, Jun 07, 2011 13:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt da mehrere, verschieden kompfortable oder schnelle, Möglichkeiten.
Zum einen natürlich Xeres Vorschlag mit dem Cloning, welches auch tiefere Kopien erstellt, da Du ja mit den Metatags bestimmen kannst wie welches Feld behandelt werden kann.
Wenn Du weitergehende Fertigkeiten in dieser Form benötigst kann ich dir auch Chaos.Clone empfehlen, was Dir nicht nur Cloning sondern auch beliebiges Laden und Speichern von Types ermöglicht. Zudem habe ich noch explizitere Kontrollmöglichkeiten eingebaut, und Chaos.clone kommt auch mit verschiedenen Arraytypen zurecht, was die oben verlinkte Möglichkeit an ihre Grenzen bringt.
Chaos.Clone findest du hier:
https://www.blitzforum.de/foru...hp?t=33951

Allerdings arbeiten diese Möglichkeiten mit Reflection, was deine Programme insgesamt etwas langsamer und größer macht, da eben die ReflectionDaten ständig zur Verfügung stehen müssen.

Was Du - wenn es keine zu komplexen Types mit vielen Subtypes sind - machen kannst wenn es flott gehen soll wäre selbst eine Copy()-Methode zu schreiben:

Code: [AUSKLAPPEN]
Type Bla
    field blub

    method copy:bla(source:bla)
        local c:bla = new bla
        c.bla = source.bla
        return c
    end method
end type
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
 

Schnuff

BeitragDi, Jun 07, 2011 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest aber auch Types verschachteln. Ist die Frage, wie dynamisch dein System sein soll. Wenn du beispielsweise einen ShootEmUp baust, wäre dies die elegantere und einfachere Möglichkeit.
z.B.
Code: [AUSKLAPPEN]
Type TGegnerArt
  Field Name
  Field MaxHP
  Field rePhysisch
EndType

Type TGegner
  Field GegnerArt:TGegnerArt
  Field MomentaneHP
  Field ...
EndType

Local GegnerArten_Baum:TGegnerArt = New TGegnerArt
Local GegnerArten_WuetenderBauer:TGegnerArt = New TGegnerArt

Local Gegner1:TGegner = New TGegner
Gegner1.GegnerArt = GegnerArten_Baum

Wenn du hingegen ein sehr dynamisches Spiel hast, würde ich dir zu BladeRunners Antwort raten, da du so beispielsweise auch die IDs verändern - und andere Anpassungen vornehmen - kannst.
Programmers dont die. They gosub without return...

Skabus

BeitragMi, Jun 08, 2011 10:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey danke für die Ideen, damit kann ich arbeiten.

Ich werd mir alles mal ansehen.Mal schauen was am besten funktioniert für mein Projekt Very Happy


BladeRunner hat Folgendes geschrieben:


Was Du - wenn es keine zu komplexen Types mit vielen Subtypes sind - machen kannst wenn es flott gehen soll wäre selbst eine Copy()-Methode zu schreiben:

Code: [AUSKLAPPEN]
Type Bla
    field blub

    method copy:bla(source:bla)
        local c:bla = new bla
        c.bla = source.bla
        return c
    end method
end type


So hatte ich das auch gemacht, aber dann müsste ich ja jedes Mal wenn ich ein neues Attribute zum Type hinzufüge die Copy-Methode anpassen, richtig?

So ähnlich hatte ich das nämlich auch schon gemacht, aber genau das wollte ich vermeiden^^"


MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

BladeRunner

Moderator

BeitragMi, Jun 08, 2011 13:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Jap, exakt. BMax kennt leider keinen Coypkonstruktor, daher muss man sich mit diversen Krücklein behelfen.
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group