TImage in TMap gespeichert, DrawImage wirft Fehler aus

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Gray Fox

Betreff: TImage in TMap gespeichert, DrawImage wirft Fehler aus

BeitragSo, März 27, 2011 14:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Morgen Smile

Ich habe ein kleines Problem mit dem Verständnis von TMaps und Objekten. Das Ziel ist, mehrere TImages in einer TMap zu speichern.

Die Grundlage sieht so aus:
Code: [AUSKLAPPEN]
Method add:String(imageKey:String, frames:Int = 0, frameX:Int = 0, frameY:Int = 0)
      Local path:String = AppDir + "/" + Self.parent.get("pathData") + "/" + Self.parent.get("pathGfx")
      Local fileName:String = path + "/" + String(Self.imageReferenceList.ValueForKey(imageKey))
      Local image:TImage = New TImage
      image = LoadImage(fileName)
      Self.imageRepository.Insert(imageKey, image)
      'ToDo: Return und Fehlerbehandlung
End Method

Beispiel:
Code: [AUSKLAPPEN]
system.graphic.add("guiBorderFrame")


Aufgerufen wird es mit dieser Methode:
Code: [AUSKLAPPEN]
Method draw(imageKey:String, X:Int, Y:Int, frame:Int = 0)
      DrawImage Self.imageRepository.ValueForKey(imageKey), X, Y
End Method

Beispiel:
Code: [AUSKLAPPEN]
system.graphic.draw("guiBorderFrame", 100, 100)


Leider wirft der Debugger von BLIde folgenden Fehler aus:
Zitat:
Compile Error: Unable to convert from 'Object' to 'TImage'

Wenn ich den Code abändere:
Code: [AUSKLAPPEN]
Method draw(imageKey:String, X:Int, Y:Int, frame:Int = 0)
      Local image:TImage = Self.imageRepository.ValueForKey(imageKey)
      DrawImage image, X, Y
End Method

erscheint folgender Fehler:
Zitat:
Compile Error: Unable to convert from 'Object' to 'brl.max2d.TImage'


Ich war bisher der Meinung, dass der Datentyp "Object" ein universeller Platzhalter für alle Arten von Types ist!?

mpmxyz

BeitragSo, März 27, 2011 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
Local image:TImage = Self.imageRepository.ValueForKey(imageKey) 

->
BlitzMax: [AUSKLAPPEN]
Local image:TImage = TImage(Self.imageRepository.ValueForKey(imageKey)) 

Hinter einem Object könnte auch ein String oder ein Array stecken.
Daher muss man explizit umcasten.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Gray Fox

BeitragSo, März 27, 2011 15:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, das macht durchaus Sinn Smile

Eine Frage zum Umcasten hätte ich noch:

Kann ich auch den Datentyp einer Variable bzw. den eines "Feldes" dynamisch zur Laufzeit ändern?

Von:
BlitzMax: [AUSKLAPPEN]
Type system
Field graphic:Object
End Type

zu:
BlitzMax: [AUSKLAPPEN]

'Type Deklarationen in irgendeiner Konfigdatei
system.graphic:eigenerType = eigenerType

mpmxyz

BeitragSo, März 27, 2011 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, das geht nicht.
Umcasten betrifft auch nur einen Wert bzw. eine Referenz und keine Variable.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Gray Fox

BeitragSo, März 27, 2011 16:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, gut zu wissen, danke.

Ich hätte noch zwei Fragen, für die ich jetzt keinen eigenen Thread aufmachen möchte. Vielleicht kannst du mir in der Hinsicht auch weiterhelfen.

1. Wie lautet der Datentyp für ein Return von TRUE / FALSE?
2. Werden Objekte / Types standardmäßig als Referenz übergeben?

Beispiel zu 2:

BlitzMax: [AUSKLAPPEN]

Type coreSystem
Field graphic:systemSubGraphics
[...]
Method New()
Self.graphic = New systemSubGraphics
Self.graphic.setParent(Self)
End Method
[...]
End Type

Ist das nun eine Übergabe byRef oder byVal? Ich habe nämlich gelesen, dass es für die Übergabe als Referenz einen speziellen Befehl gibt. Wenn ich aber innerhalb des systemSubGraphics-Types über self.parent.setMethode eine Eigenschaft von CoreSystem ändere, dann hat dies Eigenschaft auch innerhab der "Hauptschleife" den Wert, den ich ihr in dem untergeordneten systemSubGraphics-Type zugewiesen hat.

mpmxyz

BeitragSo, März 27, 2011 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
1. True und False sind Integer-Konstanten. -> "Int"
2. Objekte werden immer als Referenz übergeben; primitive Datentypen als Wert.
Änderungen einem Objekt wirken sich überall aus.
Ein "Var" Zusatz sorgt dafür, dass die beim Aufruf benutzte Variable in der Funktion geändert werden kann.
mfG
mpmxyz
BlitzMax: [AUSKLAPPEN]
Local i:Int=1
Func(i)
Print i '2
Function (i:Int Var) 'Änderung der angegebenen Variable
i=2
EndFunction

BlitzMax: [AUSKLAPPEN]
Local i:Int=1
Func(i)
Print i '1
Function (i:Int) 'Änderung der lokalen Variable der Funktion
i=2
EndFunction

BlitzMax: [AUSKLAPPEN]
Local i:String[]=["1"] 'ein String-Array
Func(i)
Print i[0] '1
Function (i:String[]) 'Änderung der lokalen Variable der Funktion
i=["2"]
EndFunction

BlitzMax: [AUSKLAPPEN]
Local i:String[]=["1"]
Func(i)
Print i[0] '2 i ist nun ein anderes Array.
Function (i:String[] Var) 'Änderung der angegebenen Variable
i=["2"]
EndFunction

BlitzMax: [AUSKLAPPEN]
Local i:String[]=["1"]
Func(i)
Print i[0] '2 i bleibt das gleiche Array.
Function (i:String[]) 'Änderung des Objektes
i[0]="2"
EndFunction
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Gray Fox

BeitragSo, März 27, 2011 17:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, das ist sehr aufschussreich. Wink

In PHP hat man solche Probleme nicht so sehr Smile, dafür aber in .NET.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group