TImage um eigene Fields erweitern - ohne extends?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Gray Fox

Betreff: TImage um eigene Fields erweitern - ohne extends?

BeitragSa, Mai 21, 2011 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich habe ein kleines Problem mit TImage. Ich würde gerne diese Klasse um mehrere Eigenschaften erweitern, aber wenn ich mit extends eine neue Klasse kreiere, dann funktionieren die eingebauten DrawImage-Befehle nicht mehr, weil sie ja ein Image vom Typ TImage erwarten.

Zum Hintegrund: Ich möchte u.a. die Eigenschaften currentFrame:int und currentTime:int implementieren.

Gibt es dafür einen Workaround oder müsste ich dann eigene DrawImage- / DrawAnimImage-Funktionen schreiben?
 

Gray Fox

BeitragSa, Mai 21, 2011 19:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Wohl was gefunden -> https://www.blitzforum.de/foru...ght=timage

hmm..

DaysShadow

BeitragSa, Mai 21, 2011 19:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst das Modul brl.max2d bzw. die darin liegende image.bmx verändern.
In der image.bmx liegt TImage und da kannst du ja die benötigten Fields hinzufügen -> Modul neu erstellen, fertig.

btw, ein Edit hätte gereicht, pushen ist hier nicht, weißt du doch sicherlich.
Blessed is the mind too small for doubt
 

Gray Fox

BeitragSa, Mai 21, 2011 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann ich die Datei so verändern bzw. einbinden, dass sich die Änderung nicht auf BMAX selbst, sondern nur auf das spezielle Projekt auswirkt?

DaysShadow

BeitragSa, Mai 21, 2011 19:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Wo ist das Problem? Es wirkt sich ja in keiner Weise auf bestehende Projekte aus, ob da nun ein Field in TImage ist das nicht genutzt wird oder nicht, ist an sich ja egal.
Die Programme werden dann minimal ein paar Bytes mehr im Speicher benötigen, aber sonst sollten da keine Bedenken sein.

Mir fällt aber auch keine gescheite Lösung ein.
Das selbe Modul kopieren und einfach z.B. als brl.max2d2 zu erstellen würde zwar funktionieren, allerdings wäre dann wohl das Zusammenspiel mit den anderen Modulen hin.
Blessed is the mind too small for doubt
 

Gray Fox

BeitragSa, Mai 21, 2011 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigentlich gibt es kein Problem. Very Happy

Ich werde es mal ausprobieren!

Wäre natürlich schön, wenn es so einfach gehen würde.

EDIT: War eigentlich nicht als Push gedacht. Wink

EDIT² -> Funktioniert doch nicht so einfach.

Ich habe BlitMax/mod/brl.mod/max2d.mod/image.bmx -> Type TImage um folgenden Code erweitert:

BlitzMax: [AUSKLAPPEN]
	Field curFrame:Int
Field frameHeight:Int
Field frameWidth:Int
Field curTime:Int


Dann habe ich die Datei gespeichert und BLIde neu gestartet, aber leider sehe ich von der Änderung nicht viel. Auch beim Start bemängelt das System, dasss es die Eigenschaften nicht gibt...

Muss ich das Modul eventuell neu "kompilieren"?

Noobody

Betreff: Re: TImage um eigene Fields erweitern - ohne extends?

BeitragSa, Mai 21, 2011 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Gray Fox hat Folgendes geschrieben:
Ich würde gerne diese Klasse um mehrere Eigenschaften erweitern, aber wenn ich mit extends eine neue Klasse kreiere, dann funktionieren die eingebauten DrawImage-Befehle nicht mehr, weil sie ja ein Image vom Typ TImage erwarten.

Der ganze Witz von Extends ist ja gerade, dass du das tun kannst. Ein Type kann sich immer als die Klasse ausgeben, von der er erbt, sozusagen.

So etwas zum Beispiel kompiliert (wird natürlich abstürzen, da das Bild nicht korrekt initialisiert wurde, aber es kompiliert auf jeden Fall): BlitzMax: [AUSKLAPPEN]
Type TExtendedImage Extends TImage
Field Message:String = "Hallo, ich bin ein erweitertes TImage"
End Type

Local Test:TExtendedImage = New TExtendedImage
DrawImage Test, 0, 0
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
 

Gray Fox

BeitragSa, Mai 21, 2011 20:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe zum Test folgendes in mein Projekt eingefügt:

BlitzMax: [AUSKLAPPEN]

Type cImage Extends TImage
Field curFrame:Int
Field frameHeight:Int
Field frameWidth:Int
Field curTime:Int
End Type

Local tile1:String = AppDir + "/" + "test.png"
Print tile1
Local img:cImage = New cImage
img = cImage(LoadImage(tile1))

'main loop
DrawImage(img, 400, 100)
' end main loop


Beim Start stürzt das Programm mit folgender Fehlermeldung ab:
BlitzMax: [AUSKLAPPEN]
Unhandled Exception:Attempt To access Field Or Method of Null Object

'max2d.bmx
Function DrawImage( image:TImage,x#,y#,frame=0 )
[b:39694e39e3]Local x0#=-image.handle_x,x1#=x0+image.width[/b:39694e39e3]


Wenn ich cImage in TImage ändere, wird das Bild korrekt angezeigt.

DaysShadow

BeitragSa, Mai 21, 2011 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst natürlich das Modul neu kompilieren, wenn du Änderungen an einem Bestandteil dessen vorgenommen hast, habe ich aber doch auch geschrieben, es sei denn du verstehst unter "erstellen" irgendetwas anderes Wink
Blessed is the mind too small for doubt
 

Gray Fox

BeitragSa, Mai 21, 2011 20:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, habe es anders aufgefasst, aber ok Smile

Kannst du mir einen Tip geben, wie ich das bewerkstelligen könnte?

skey-z

BeitragSa, Mai 21, 2011 21:50
Antworten mit Zitat
Benutzer-Profile anzeigen
STRG+D

wenn es nicht klappt MinGW installieren, die Anleitung dazu findest du hier im Forum
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

Gray Fox

BeitragSa, Mai 21, 2011 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich werde es mit MinGW mal ausprobieren Smile

EDIT: Mit MinGW funktioniert es nun, ich wundere mich aber, dass Noobody Vorschlag nicht funktioniert(e).
 

Gray Fox

Betreff: Re: TImage um eigene Fields erweitern - ohne extends?

BeitragMo, Jun 13, 2011 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Noobody hat Folgendes geschrieben:
Der ganze Witz von Extends ist ja gerade, dass du das tun kannst. Ein Type kann sich immer als die Klasse ausgeben, von der er erbt, sozusagen.

So etwas zum Beispiel kompiliert (wird natürlich abstürzen, da das Bild nicht korrekt initialisiert wurde, aber es kompiliert auf jeden Fall): BlitzMax: [AUSKLAPPEN]
Type TExtendedImage Extends TImage
Field Message:String = "Hallo, ich bin ein erweitertes TImage"
End Type

Local Test:TExtendedImage = New TExtendedImage
DrawImage Test, 0, 0


Ich habe mich gerade noch einmal an diesem "Konstrukt" versucht, aber es will nicht funktionieren.

So sieht der erweiterte Type aus:

BlitzMax: [AUSKLAPPEN]

Type objImage Extends TImage
Field name:String

End Type

So sieht die Ladeprozedur aus:

BlitzMax: [AUSKLAPPEN]

Method loadImg1:objImage(path:String, name:String, framesCount:Int = 0, frameWidth:Int = 0, frameHeight:Int = 0)
Local image:objImage = New objImage
If(framesCount > 0) Then
image = objImage(LoadAnimImage(path, frameWidth, frameHeight, 0, framesCount))
Else
image = objImage(LoadImage(path))
End If

If image = Null Then
Return Null
Else
image.name = name
Print "test: " + image.name
Return image
End If
End Method


Es wird immer null zurückgegeben, obwohl die Datei, die mit path angegeben wird, existiert. Wenn ich alles auf TImage umändere, dann klappt es.

Hat jemand eine Idee, wo mein Fehler liegen könnte?
  • Zuletzt bearbeitet von Gray Fox am Mo, Jun 13, 2011 15:31, insgesamt einmal bearbeitet
 

Gray Fox

Betreff: Re: TImage um eigene Fields erweitern - ohne extends?

BeitragMo, Jun 13, 2011 15:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, doppelpost..

mpmxyz

BeitragMo, Jun 13, 2011 16:07
Antworten mit Zitat
Benutzer-Profile anzeigen
LoadImage gibt auch ein TImage-Objekt zurück. (keines einer davon erbenden Klasse)
Da TImage kein TExtendedImage ist, lässt sich die Referenz nicht umcasten; das Ergebnis ist Null.
Stattdessen kannst du den Inhalt des TImage-Objektes in ein neues TExtendedImage-Objekt kopieren und dieses zurückgeben.
mfG
mpmxyz
PS: Zu Noobodys Beispielcode und deinem Beitrag vom Sa, Mai 21, 2011 22:31:
Noobody hat Folgendes geschrieben:
(wird natürlich abstürzen, da das Bild nicht korrekt initialisiert wurde, aber es kompiliert auf jeden Fall)
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Gray Fox

BeitragMo, Jun 13, 2011 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
mpmxyz hat Folgendes geschrieben:

Stattdessen kannst du den Inhalt des TImage-Objektes in ein neues TExtendedImage-Objekt kopieren und dieses zurückgeben.


Wie muss man sich das vorstellen bzw. wie würde das in BMax speziell aussehen?

mpmxyz

BeitragMo, Jun 13, 2011 16:33
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
Local orgImage:TImage=LoadImage(file)
Local extendedImage:TExtendedImage=New TExtendedImage
extendedImage.width=orgImage.width
extendedImage.height=orgImage.height
'weitere Eigenschaften kopieren
extendedImage.name=name
Return extendedImage

Es gibt auch die Möglichkeit, das Reflection-Modul zu nutzen. (brl.Reflection)
Das hat den Vorteil, dass du dich nicht darum kümmern musst, welche Eigenschaften es gibt:
BlitzMax: [AUSKLAPPEN]
Local orgImage:TImage=LoadImage(file)
Local extendedImage:TExtendedImage=New TExtendedImage
Local typeID:TTypeId=TTypeId.ForObject(orgImage) 'bestimme den Typ des Originalbildes
For Local fieldObject:TField=EachIn(typeID.EnumFields()) 'gehe jede Eigenschaft durch
fieldObject.Set(extendedImage,fieldObject.Get(orgImage)) 'kopiere die Eigenschaft
Next
extendedImage.name=name
Return extendedImage

Falls dir an dieser Stelle Fragen aufkommen, was "Reflection" ist:
BlitzMax speichert wie viele andere Sprachen auch zusätzlich zum eigentlichen Programm Daten, welche den Aufbau der einzelnen Klassen beschreiben. Über Reflection kann man auf diese Daten zugreifen und zum Beispiel herausfinden welche Eigenschaften und Methoden diese hat. (weitere Möglichkeiten: Ändern und Bestimmen von Eigenschaften, Aufrufen von Methoden, Erstellen von Objekten und Abrufen von "Metadaten")
Damit kann man dann Kopierroutinen, wie diese, oder automatische Lade-/Speicherfunktionen programmieren.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Gray Fox

BeitragMo, Jun 13, 2011 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, ok, jetzt verstehe ich, was du mit dem Kopieren gemeint hast Smile

Darauf bin ich im ersten Moment gar nicht gekommen.

Das zweite Beispiel werde ich mir auch mal näher anschauen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group