array für objekt, aber nicht global und größe objektabhängig

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Thoniel

Betreff: array für objekt, aber nicht global und größe objektabhängig

BeitragSa, Jan 05, 2008 3:21
Antworten mit Zitat
Benutzer-Profile anzeigen
hi
ich möcht gern zum üben in bmax nen kleines jnr machen und bin inzwischen bei der kachelkarte angelangt.

ich hab für die map eine lokale instanz erstellt und würd das gern auch so beibehalten.
meine klasse sieht so aus:

Code: [AUSKLAPPEN]
Type TSpielKarte
   Field weite:Int
   Field hoehe:Int
   Field grafik:TImage
   
   Method malen()
      DrawImage(grafik, 0, 0, 0)    
   EndMethod
   
   Method rasterLaden()
      
   EndMethod
   
   Method initialisieren(w:Int, h:Int, g:String, b:Int)
      weite = w
      hoehe = h       
      grafik = LoadAnimImage(g, KACHELGROESSE, KACHELGROESSE, 0, b)
      
      rasterLaden()
   EndMethod
EndType


wie man sieht wollte ich eine art konstruktor haben, der mir alles initialisiert das ich brauche. nun aber das problem:
ich wollte ein array nehmen um die tilemap darzustellen, das array soll aber nicht global sein, sondern immer nur für das jeweilige objekt existieren und die größe soll mit der konstruktion festgelegt werden, eben dort wo das objekt auch die werte für weite und hoehe kennt.

field raster:int[weite,hoehe] geht logischerweise nicht, da ich dann ein 0,0 array bekomme.
wenn ich es local im konstruktor erstelle, dann ist es ja nur im konstruktor vorhanden!? und global dann ist es überall vorhanden.


wie kann man das problem lösen?
danke schonmal im vorraus.
mfg
 

ChristianK

BeitragSa, Jan 05, 2008 12:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst das Array dynamisch mit New erstellen. Voher deklarierst du es mit "Field array:Int[ , ]" <- Ein zweidimensionales Array mit undefinierter Größe.
Und noch ein Tipp für den Konstruktor: Du kannst eine Methode im Type deklarieren, die "Self" zurückgibt und beim Erstellen des Objekts aufgerufen werden kann. Aber guck dir einfach das Beispiel an. Smile

Code: [AUSKLAPPEN]
Type TTest
   Field map:Int[ , ]

   Method SetValue( x:Int, y:Int, value:Int )
      map[ x, y ] = value
   End Method
   
   Method GetValue:Int( x:Int, y:Int )
      Return map[ x, y ]
   End Method

   Method Create:TTest( x:Int, y:Int )
      map = New Int[ x, y ]
      
      Return Self
   End Method

End Type

Local test:TTest = New TTest.Create( 10, 5 )

test.SetValue( 2, 4, 100 )
Print test.GetValue( 2, 4 )
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Thoniel

BeitragSa, Jan 05, 2008 13:11
Antworten mit Zitat
Benutzer-Profile anzeigen
ahhh danke, dann muss ich den konstruktor nichtmehr seperat aufrufen.


//edit

hmm schönes prinzip, würde ich gerne fortführen.
wie rufe ich sowas auf wenn ich eine kinderklasse initialisiere mit einem konstruktor der in der elternklasse ist?




Code: [AUSKLAPPEN]

Local spieler:TSpieler = New TSpieler.initialisieren(32 + 64 + 64, 6 * 64 + 24, "spieler.png")

Type TSpielfigur
' [...] methoden und felder [...]
   
   Method initialisieren:TSpielfigur(x:Int, y:Int, g:String)
      xPos = x
      yPos = y       
      grafik = LoadImage(g)       
      
      lebensZustand = 1
      bewegungsRichtung = RECHTS
      bewegenZustand = 0
      bewegungsGeschwindigkeit = 3.5
      sprungZustand = 0
      sprungGeschwindigkeit = 0
      sprungStartGes = 14
      
      Return Self
   EndMethod   
End Type


Type TSpieler Extends TSpielfigur
' [...] steuer methoden [...]
   EndMethod   
EndType

Type TGegner Extends TSpielfigur
   ' "ki"
EndType


so bekomm ich logischerweise "Unable to convert from 'TSpielfigur' to 'TSpieler'"
muss ich immer die konstruktoren in die unterste ebene einbauen?
 

FredFeuerstein

BeitragSa, Jan 05, 2008 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
servus,
hoffe mal ich hab dich richtig verstanden.

normalerweise werden die konstruktoren rekursiv, beginnend mit der obersten klasse in der vererbungshierarchie, ausgeführt. sprich du kannst in jeder klasse, die von einer anderen klasse erbt, einen eigenen konstruktor implementieren welcher dann, nachdem der konstruktor der oberklasse ausgeführt wurde, selbst ausgeführt wird.

das löst aber wahrscheinlich noch nicht dein problem, da deine initialisieren-methode ein TSpielfigur objekt zurückgibt, welches kein TSpieler objekt ist (umgekehrt schon). dies könntest du aber einfach lösen indem du anstatt
Code: [AUSKLAPPEN]

Local spieler:TSpieler = New TSpieler.initialisieren(32 + 64 + 64, 6 * 64 + 24, "spieler.png")

einfach
Code: [AUSKLAPPEN]

Local spieler:TSpielfigur = New TSpieler.initialisieren(32 + 64 + 64, 6 * 64 + 24, "spieler.png")

schreibst. danach mußt du allerdings jedes mal nach TSpieler casten wenn du methoden von TSpieler benutzen willst.

besser wäre deswegen, meiner meinung nach, eine eigene init-methode in der klasse TSpieler zu implementieren welche ein TSpieler objekt zurückgibt. hier ist allerdings etwas vorsicht geboten: da du der methode einen anderen rückgabewert geben mußt (nämlich TSpieler anstatt TSpielfigur), wird sie nicht überschrieben (function overriding) sondern überladen (function overloading), was BlitzMax nicht unterstützt. dieses problem ist aber leicht zu umgehen indem du der methode einfach einen anderen namen gibst wie z.b. initSpieler:TSpieler(...). in der neuen initSpieler-methode kannst du dann, falls gewünscht, mit hilfe von Super die initialisieren-methode der oberklasse aufrufen.
Code: [AUSKLAPPEN]

Type TSpieler Extends TSpielfigur
    ...
    Method initSpieler:TSpieler(...)
        Super.initialisieren(...)
        ...
        Return Self
    EndMethod
    ...
EndType
 


hoffe das konnte dir ein wenig weiterhelfen
 

Thoniel

BeitragSa, Jan 05, 2008 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
ja danke, jetzt habe ich eine gute übersicht was geht und was nicht. ich denke die methode die du vorschlägst ist am sinnvollsten.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group