OOP und Pointer auf Type's

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Bob

Betreff: OOP und Pointer auf Type's

BeitragDo, Okt 05, 2006 12:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Okt 05, 2006 13:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Okt 05, 2006 14:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Okt 05, 2006 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Confused
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB

Bob

BeitragDo, Okt 05, 2006 15:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Okt 05, 2006 15:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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). Confused
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB

Bob

BeitragDo, Okt 05, 2006 15:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Okt 05, 2006 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Okt 05, 2006 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Okt 05, 2006 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Okt 05, 2006 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier mal das ganze in schön Wink

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

BeitragSa, Okt 07, 2006 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Markus2,

So, in etwa, habe ich mir das vorgestellt.
Er soll an den Spielen teilnehmen bis er spielend stirbt. MCP - TRON

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group