Problem OOP warum ist TMapData = null ?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

StephanD87

Betreff: Problem OOP warum ist TMapData = null ?

BeitragSa, Dez 17, 2011 23:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Ich habe da ein Problem beim abfragen einer Membervariable einer Klasse. und zwar:

Ich habe ein Menü "TGameState". mit Singleplayer,Option,Highscore.
Nun startet man Singleplayer -> TGameState = "GAMESTATE_INIT_SP"
In diesem Menü kann man nun zwischen Spiel laden und Neues spiel wählen.
Code: [AUSKLAPPEN]
Type TGS_SinglePlayer Extends TGameState


   [color=red]Field playMap:TMapData ' HIER IST DAS PROBLEM[/color]

   Field img_Tileset:TImage = LoadAnimImage("gfx\tileset.jpg", 50, 50, 0, 3)
   Field LMapList:TList = CreateList()
   
   Method enter()
       FlushKeys
       'Erstes MenüItem focusieren
       sel_MnuItem = 1
   End Method
   
   Method process:Int()
      
      If KeyHit(KEY_N)
         Return GAMESTATE_NEW_SP
      ElseIf KeyHit(KEY_L)
         Return GAMESTATE_LOAD_SP
      ElseIf KeyHit(KEY_BACKSPACE)
         Return GAMESTATE_MENU
      ElseIf KeyHit(KEY_DOWN)
      ...
         
      ElseIf KeyHit(KEY_ENTER)
         Select sel_MnuItem
            Case 1   'neues Spiel
               Return GAMESTATE_NEW_SP
               
            Case 2   'Spiel laden
               Return GAMESTATE_LOAD_SP
         End Select
      EndIf
   
      Self.Draw()
   End Method
   
   Method leave()
...
   End Method
   
   Method Draw()
      ...
   End Method

End Type


In "Field playMap:TMapData " soll dann im nächsten schritt die Karte geladen werden, die im Spiel benötigt wird. Nehmen wir an, ich will ein neues Spiel starten (Gamestate = ...)
wird nun TGS_NEW_SinglePlayer Extends TGS_SinglePlayer erstellt.

Code: [AUSKLAPPEN]
Type TGS_NEW_SinglePlayer Extends TGS_SinglePlayer
   
   Field select_Map:Byte      'Aktuell gewählte Karte
   Field max_MAP:Byte = 1      'vom Programm erkannte Anzahl an Karten im spiel (vorsicht, variabel. Eine erkannte "x.MAP"-Datei entspicht einer Karte)
   Field select_Race:Byte
   Field pfad_Map:String[10]      'vorerst auf 10 beschränkt
   Field pfad_Mapdir:String = "Data\Maps"
   Field dir_Maps:Int = ReadDir("Data\Maps\")
   
   Method enter()
      Select_MAP = 1
      sel_MnuItem = 1
      
      'ermittle Anzahl an Karten

...      
      pfad_Map[1] = "Test.txt"
      
      'Laden der Karte aus der Datei
      Self.LoadMap(1)
   End Method
   
   Method LoadMap(mapID:Int)
      Local s_Datei:TStream = ReadFile("Data\Maps\" + pfad_Map[mapID])
      
      'erstellen eines lokalen Map-Objekts
      Local map:TMapData
      map = New TMapData
      playMap = New TMapData
      
      'Laden aus Datei
      Local lversion:String = ReadLine(s_Datei)
      'Speichern in Map
      map.version = lversion
      
      ...      
      For Local x:Byte = 0 To data_Anz_TileX - 1
         For Local y:Byte = 0 To data_Anz_TileY - 1
                                                            [size=9][size=18][size=9][color=red] playMap.data_Map[x, y, 1] = ReadByte(s_Datei)[/color][/size][/size][/size]
         Next
      Next
      
'Maps werden in einer Liste gespeichert, später wird mit der ID der Karte das dazugehörige Objekt TMapData aufgerufen
      LMapList.AddLast(map)
   End Method
   
   Method process:Int()
   
      ...      
      Self.Draw()
      
      
   End Method

   Method Draw()
      ...
      
   End Method
   
   Method leave()
       PlaySound(snd_leave)
   End Method

End Type


Als nächstes startet nun das Spiel
Type TGS_RUN_SingePlayer Extends TGS_SinglePlayer

Es wird jetzt zur laufzeit ein Objekt erstellt.
und hier in diesem Objekt möchte ich nun auf die im TGS_SinglePlayer erstellten Karteninformation zugreifen.
Code: [AUSKLAPPEN]
Type TGS_RUN_SingePlayer Extends TGS_SinglePlayer


   Field img_TilesetGAME:TImage = LoadAnimImage("gfx\tileset.jpg", 50, 50, 0, 3)
   
   Method enter()
      SetGraphics (Graphics(1366, 768, 1))
   End Method
   
   Method process:Int()
   
      'Abfragen des Spielers via Mouse (muss noch implementiert werden)
      
      If KeyHit(KEY_ESCAPE)
         Return GAMESTATE_MENU   
      End If

      Self.Draw()
   End Method
   
   Method Draw()
      
       For Local x:Int = 0 To 18
            For Local y:Int = 0 To 13
               DrawImage(img_TilesetGAME, 0 + x * 50, 50 + y * 50, [size=24][color=red]playMap.data_Map[x, y, 1])[/color][/size]
            Next
      Next
   End Method
   
   Rem
      bbdoc:Beenden des Gamestates
   End Rem
   Method leave()
       SetGraphics(Graphics(800, 600, 0))
   End Method




End Type


nun kann ich nicht auf die in der Mutterklasse definierten "playmap:TMapData" zugreifen, weil =NULL. ich habe es auch mit "super.playmap ... " versucht. Was mache ich hier falsch? ist da bereits ein Fehler im Design ?

Vielen dank schon mal im Vorraus
mfG
 

StephanD87

BeitragSo, Dez 18, 2011 0:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Überschrift muss natürlich lauten "Warum ist playMap = NULL"

Xeres

Moderator

BeitragSo, Dez 18, 2011 0:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitte benutze den Edit Button anstatt Doppelposts zu machen.

Bei deinem Code sehe ich nicht so recht durch. In einem TGS_NEW_SinglePlayer Objekt wird playMap erstellt und geladen. Warum sollten dir die Daten in einem TGS_RUN_SingePlayer zur Verfügung stehen?
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)
 

StephanD87

BeitragSo, Dez 18, 2011 0:52
Antworten mit Zitat
Benutzer-Profile anzeigen
wegen dem "Extends TGS_SinglePlayer". Ich dachte durch die Vererbung werden alle übergeordnete fields automatisch vererbt, sodass nun TGS_RUN_SinglePlayer selbst mapData besitzt.

EDIT: OK, ´
Global mapData: ... ist das zauberwort ...
ok, hat sich somit erledigt

Aber mal eine andere frage, müsste es nicht als field mapData: ... genauso funktionieren? Oder muss ich dann erst im konstruktor von TGS_RUN_Singleplayer mapData neu erstellen? (Obwohl ich das beim vererben eigentlich so verstanden habe, das alle kinderklassen die membervariablen ihrer Eltern quasi reinkopiert bekommen.

Xeres

Moderator

BeitragSo, Dez 18, 2011 1:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das Field steht dir durch die Vererbung zur Verfügung. Aber BlitzMax wird keine Objekte erstellen oder verlinken, wenn du das nicht selbst erledigst.
Global bedeutet, dass es für alle TGS_SinglePlayer-Objekte ein mapData-Objekt gibt. Wenn es funktioniert, fein - Vererbung wäre dafür aber nicht wirklich nötig.
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)
 

StephanD87

BeitragSo, Dez 18, 2011 1:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah vielen dank, jetzt hab ich verstanden. Nun gut, dann reicht mir global in diesem fall tatsächlich aus, dann muss ich die karte nicht erst NOCHMAL auf ein neues Objekt übertragen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group