Problem OOP warum ist TMapData = null ?
Übersicht

StephanD87Betreff: Problem OOP warum ist TMapData = null ? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Überschrift muss natürlich lauten "Warum ist playMap = NULL" | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
StephanD87 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
StephanD87 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group