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

ThonielBetreff: array für objekt, aber nicht global und größe objektabhängig |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ja danke, jetzt habe ich eine gute übersicht was geht und was nicht. ich denke die methode die du vorschlägst ist am sinnvollsten. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group