OOP und Pointer auf Type's
Übersicht

![]() |
BobBetreff: OOP und Pointer auf Type's |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo zusammen,
Da Oop und Pointer für mich Neuland sind habe ich offensichtlich noch einige Verständnisprobleme. ich versuche mich grade an einer simplen Tile Engine. Es gibt z.Zt. zwei Typen: tTile und TileMap Ich versuche Im Type TileMap in einem Array Pointer auf die Tiles zu speichern um aus diesen später die Map aufzubauen. Hier mal ein Testcode um das Prob. zu verdeutlichen: Code: [AUSKLAPPEN] Graphics 800,600 'Neue Map erstellen Global myMap:TileMap = New TileMap 'Zwei Tiles erstellen myMap.AddTile("grass.png",0) myMap.AddTile("wasser.png",1) myMap.CreateMap(5,5) 'Testausgabe For Local y:Int = 0 To 4 For Local x:Int = 0 To 4 'Versuch auf das Pointer Array zuzugreifen DrawImage myMap.MapArray[X,Y][0].img,50,50 'FEHLER ???? Next Next End Type tTile Field Img:tImage Field ID:Int Method setImage(image:String,ID:Int) self.img = LoadImage(image) self.ID = ID End Method End Type Type TileMap Field TileList:tList Field MapArray:tTile Ptr [,] 'Pointer Array mit verweisen auf alle notwendigen Tiles Field Breite:Int 'Breite der Map in Tiles Field Hohe:Int 'Höhe der Map in Tiles Method AddTile(image:String,ID:Int) If self.TileList:TList = Null Then self.TileList:TList = New TList Local myTile:Ttile = New Ttile mytile.setImage(image,id) self.TileList.addlast mytile End Method Method CreateMap:TileMap(Breite:Int,Hohe:Int) self.Breite=Breite self.Hohe=Hohe self.MapArray = New TTile Ptr [Breite+1,Hohe+1] For Local y:Int = 0 To Hohe For Local x:Int = 0 To Breite Local TileId:Int = Rand(0,1) For Local a:tTile = EachIn self.TileList If TileID = a.id Then ' obj_pointer:Int Ptr = Int Ptr(Varptr obj) 'obj_pointer:ttest Ptr = Varptr test self.MapArray[X,Y] = Varptr a '***********KONTROLLE****************************** DrawImage self.MapArray[X,Y][0].img,50,50 Flip Cls '************************************************* EndIf Next Next Next End Method End Type Die Kontrolle in der Methode CreateMap funktioniert seltsamerweise einwandfrei. Versuche ich aber auf die, in dem Array gespeichertem Tiles über das Globale Object 'myMap' zuzugreifen, scheitert dies mit einem Memory Fehler. (Unhandled Memory Exeption Error oder so) Was mache ich falsch? Wie baut man am besten mittels OOp eine kleine Tile Engine auf. Denkanstösse mit Beispielcode wären mir sehr willkommen. Gruß Bob |
||
Er soll an den Spielen teilnehmen bis er spielend stirbt. MCP - TRON |
![]() |
FOODy |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also zum Fehler kann ich nicht viel sagen.
Ich habe die Pointer weggemacht da sie meiner Meinung nach total überflüssig sind. (hier jedenfalls) Ich weiß jetzt nicht ob es an meiner geilen maschine hier (bin auf'fer Arbeit) liegt oder sonst an etwas aber ich brauchte diesmal ein Framework + Import damit der Code bei mir funzt... Code: [AUSKLAPPEN] SuperStrict
Framework BRL.GLMax2D Import BRL.PNGLoader Import BRL.LinkedList Import BRL.Random Graphics 800,600 'Neue Map erstellen Global myMap:TileMap = New TileMap 'Zwei Tiles erstellen myMap.AddTile("grass.png",0) myMap.AddTile("wasser.png",1) myMap.CreateMap(5,5) 'Testausgabe Repeat Cls For Local y:Int = 0 To 4 For Local x:Int = 0 To 4 'Versuch auf das Array zuzugreifen DrawImage myMap.MapArray[X,Y].img,50,50'FEHLER ???? Next Next Flip Until KeyDown(KEY_ESCAPE) Or AppTerminate() Type tTile Field Img:tImage Field ID:Int Method setImage(image:String,ID:Int) self.img = LoadImage(image) self.ID = ID End Method End Type Type TileMap Field TileList:TList Field MapArray:tTile[,] 'Pointer Array mit verweisen auf alle notwendigen Tiles Field Breite:Int 'Breite der Map in Tiles Field Hohe:Int 'Höhe der Map in Tiles Method AddTile(image:String,ID:Int) If self.TileList:TList = Null Then self.TileList:TList = New TList Local myTile:Ttile = New Ttile mytile.setImage(image,id) self.TileList.addlast mytile End Method Method CreateMap(Breite:Int,Hohe:Int) self.Breite=Breite self.Hohe=Hohe self.MapArray = New tTile[Breite+1,Hohe+1] For Local y:Int = 0 to Hohe For Local x:Int = 0 to Breite Local TileId:Int = Rand(0,1) For Local a:tTile = EachIn self.TileList If TileID = a.id Then ' obj_pointer:Int Ptr = Int Ptr(Varptr obj) 'obj_pointer:ttest Ptr = Varptr test MapArray[X,Y] = a '<!-- UNNÖTIG '***********KONTROLLE****************************** ' DrawImage MapArray[X,Y].img,50,50 ' Flip ' Cls '************************************************* EndIf Next Next Next End Method End Type Gruß, FOODy |
||
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB |
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
erstmal danke aber leider funzt der Code bei mir überhaupt nicht. Unhandled Exeption:Attempt to access field or method of Null object ...beim Versuch mit DrawImage MapArray[X,Y].img,50,50 die Images auf den Schirm zu bekommen. Weiterhin frage ich mich auch ob bei deiner Methode der ganze Type anstelle eines Pointers im Array gespeichert gespeichert wird. Das würde ja viel Speicher kosten. |
||
Er soll an den Spielen teilnehmen bis er spielend stirbt. MCP - TRON |
![]() |
FOODy |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der fehler kommt bei mir wenn ich das Framework weglasse :/
Was für eine Version hast du? Wegen dem Speicher: In BlitzMax wird soweit ich weiß nur die Referenz abgespeichert. Es werden keine Userspezifische Typen (also alle außer: Int, Short, Byte, String, Double, Float) automatisch dupliziert. Es wird nur die Referenz weitergegeben bzw in der Variable gespeichert... EDIT: Ich weiß jetzt nicht ob ich das jetzt richtig rübergebracht habe mit der Speicherverwaltung, aber ich hoffe du verstehst halbwegs was ich meine ![]() |
||
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB |
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi
habe Version 1.14 Bei mir tritt der Fehler immer auf egal ob mit Framework oder ohne. |
||
Er soll an den Spielen teilnehmen bis er spielend stirbt. MCP - TRON |
![]() |
FOODy |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich hab hier 1.20 und Zuhause 1.22.
Wenn du nicht die Demo hast würd ich Updaten. Weil bei mir geht der Code hier (v1.20). ![]() |
||
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB |
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
OK.
Habe auf 1.22 geupdatet. Jetz muss auch ich die Zeilen Framework BRL.GLMax2D Import BRL.PNGLoader Import BRL.LinkedList Import BRL.Random Einfügen. Ohne die geht garnichts. Dein Code Funktioniert nun auch bei mir aber nachdem ich nun 1.22 habe klappt noch nicht mal mehr ein einfaches xxx = Left("Hallo",2) [EDIT] Identifier not Found Muss ich nun allemöglichen Module vorher importieren? Wäre ja fürchterlich. Wie bekomme ich nun raus welche module ich zu importieren habe? |
||
Er soll an den Spielen teilnehmen bis er spielend stirbt. MCP - TRON |
![]() |
FOODy |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dafür brauchst du das module BRL.Retro.
Ich habs mir schon angewöhnt immer ein Framework zu haben und nur notwendige module zu laden, da es einfach viel schneller geht mit dem kompilieren. Es gibt eine Modulereferenz in der Help unter Modules. Da suchst du den Befehl den du brauchst und schaust nach dem Modulenamen oder du ladest dir die BlitzMax IDE BLIde (hab gehört das man dort mit den Modulen Importieren und so "besser" klarkommt). Gruß, FOODy |
||
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB |
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Thx Mr Foods.
Habe das Problem mittlerweile anders gelöst. Habe nun auch noch Ver 1.18 gesaugt und eine totale Neuinstallation mit vorheriger Deinstallation durchgeführt. Jetzt klappt wieder alles, inkl deines Codes, auch ohne importieren irgendwelcher Module. |
||
Er soll an den Spielen teilnehmen bis er spielend stirbt. MCP - TRON |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Rat: Niemals framework machen während dem Entwickeln.
Man kann am ende der entwicklung immer noch den Framework assistant drüber jagen, das ist mehr denn ausreichend. PS: Pointer werden in BM eigentlich garnicht gebraucht. Type Handles sind prinzipiel referenzen auf das Objekt (typesafe Pointer wenn dus so möchtest, wie in Java und C#). Pointer sind weitestgehend zu vermeiden, wenn nicht das ziel angestrebt wird, massive Probleme wegen memory leaks und null referenzen zu erhalten. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hier mal das ganze in schön ![]() Code: [AUSKLAPPEN] Strict Graphics 800,600 Global myMap:TMap = TMap.NewMap(5,5) myMap.AddTile(0,"Bubble1.bmp") myMap.AddTile(1,"Bubble2.bmp") myMap.FillRand() Cls myMap.Show() Flip WaitKey End Type TTile Field Img:TImage Field ID:Int Function NewImage:TTile(ID:Int,FileName:String) Local T:TTile=New TTile T.img = LoadImage(FileName) T.ID = ID Return T End Function End Type Type TMap Field ImgList:TList Field MapArray:TTile[,] Field Breite:Int Field Hohe:Int Method AddTile(ID:Int,FileName:String) ImgList.addlast TTile.NewImage(ID,FileName) End Method Function NewMap:TMap(Breite:Int,Hohe:Int) Local M:TMap=New TMap Local x:Int,y:Int M.Breite=Breite M.Hohe=Hohe M.MapArray = New TTile[Breite,Hohe] M.ImgList = New TList Return M End Function Method FillRand() Local TileId:Int Local x:Int,y:Int For y:Int = 0 To Hohe-1 For x:Int = 0 To Breite-1 TileId=Rand(0,1) MapArray[X,Y]=GetTTileByID(TileId) Next Next End Method Method GetTTileByID:TTile(ID:Int) Local T:TTile=Null For T = EachIn ImgList If T.ID=ID Then Exit Next Return T End Method Method Show() Local x:Int,y:Int For y:Int = 0 To Hohe-1 For x:Int = 0 To Breite-1 If MapArray[X,Y]<>Null Then DrawImage MapArray[X,Y].Img,x*32,y*32 EndIf Next Next End Method End Type |
||
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke Markus2,
So, in etwa, habe ich mir das vorgestellt. |
||
Er soll an den Spielen teilnehmen bis er spielend stirbt. MCP - TRON |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group