Denkanstoß für Buttons?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

M0rgenstern

Betreff: Denkanstoß für Buttons?

BeitragDo, März 25, 2010 22:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute.

Ich bräuchte einen kleinen Denkanstoß für meine klitzekleine GUI für mein Spiel.
UNdzwar: Bisher habe ich die Klasse "TButton" Diese hat folgende Attribute:

BlitzMax: [AUSKLAPPEN]
Type TButton
Global AllButtons:TList = New TList
Global ID:Int = 0

Field iX:Int
Field iY:Int
Field iID:Int
Field tmDrawnImage:TMyImage
Field IsClicked:Int = 0


Jetzt hab ich aber folgendes Problem: Jeder Button soll ja etwas anderes bewirken.

Ich hab mir jetzt gedacht, mit Delphi als Vorbild zu nehmen:
Die Buttons sind immer global deklariert und jedem Button wird dann im Programm eine Methode zugeordnet, die das macht, was passieren soll, wenn man auf den Button klickt.

Meine Frage jetzt:
Kann ich die Methode in der Buttonklasse vorschreiben, also deklarieren und dann im eigentlichen Programm umschreiben?
Oder muss ich doch für jeden Button im Hauptprogramm ne eigene Methode deklarieren und implementieren?

Oder hab ich nen total falschen Ansatz?
Wäre schön, wenn mir jemand nen Denkanstoß oder so geben könnte.

Lg, M0rgenstern

mpmxyz

BeitragDo, März 25, 2010 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Das System ist nicht so gut, da du für jeden Buttontyp einen eigenen Type brauchst.
Ich habe bei meiner GUI Funktionspointer genutzt.
Das könnte z.B. so aussehen:
BlitzMax: [AUSKLAPPEN]
...
Field ClickAction(Data:Object)
Method Update()
If <Klick abfragen>
Self.ClickAction(Daten)
EndIf
...
Button.ClickAction=StarteSpiel 'Dem Button im Hauptcode eine Funktion zuweisen. (Keine Klammern!)

Dieses System ist sehr flexibel.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

M0rgenstern

BeitragDo, März 25, 2010 22:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey.
Sorry, aber aus deinem Code werd ich nicht so ganz schlau.

Könntest du das bitte ein wenig ausführlicher erklären? Ich streig da grade nicht durch, sorry.

Lg, M0rgenstern

mpmxyz

BeitragDo, März 25, 2010 23:05
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
'Hier sind zwei Funktionen:
Function PrinteDies(Dies:String)
Print "Dies: "+Dies
EndFunction

Function PrinteDas(Das:String)
Print "Das: "+Das
EndFunction
'Dies ist ein Funktionspointer:
Local Pointer(EinParameter:String)

'Dieser Pointer kann auf eine beliebige Funktion zeigen, sofern sie die entsprechenden Parameter und den passenden Rückgabewert haben.
Pointer=PrinteDies

'Funktionspointer kann man wie Funktionen aufrufen.
Pointer("Test")

'Der Wert bzw. die aufgerufene Funktion ist aber im Gegensatz zu normalen Funktionen/Methoden jederzeit und überall änderbar:
Pointer=PrinteDas
Pointer("bestanden!")

Dadurch, dass du den Wert des Pointers überall ändern kannst, kannst du den Inhalt der entsprechenden Funktion erst im Hauptcode festlegen, sie aber von der GUI aus aufrufen.
Damit sind Hauptcode und GUI immer noch sauber voneinander getrennt.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

M0rgenstern

BeitragDo, März 25, 2010 23:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso.
Also muss ich im Prinzip den Funktionspointer als Attribut der Klasse deklarieren und dann im Hauptcode dem Pointer die entsprechende Funktion zuweisen?

Klingt logisch, vielen Dank.

Eine Frage hätte ich noch:
In deinem ersten Beitrag steht:

BlitzMax: [AUSKLAPPEN]
 Field ClickAction(Data:Object)


Ich kenn den Typ Object nicht. Was genau bedeutet der?

Lg, M0rgenstern
 

Macintosh

BeitragDo, März 25, 2010 23:22
Antworten mit Zitat
Benutzer-Profile anzeigen
der typ "object" kann ein beliebiger typ sein. String, TButton, ... es ist egal. Es ist quasie ein Mutables Objekt, das jedes andere Objekt "aufnehmen" kann

mpmxyz

BeitragDo, März 25, 2010 23:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine Ergänzung zu Macintoshs Beitrag:
Von "Object" sind alle Objekte abgeleitet.
Daraus folgt dann, dass ein Object-Objekt alles sein könnte. (Das mit dem Zurückcasten hast du ja schon gelernt.)
Ein Anwendungsbeispiel:
Die TLists nutzen Object-Fields, um beliebige Objektarten speichern zu können.
mfG
mpmxyz
Edit: Schlecht sind meiner Meinung nach nur die, die keine Fragen stellen, obwohl sie nichts verstanden haben. Wenn man eine Frage stellt, zeigt man, dass man weiß, was man kennt bzw. nicht kennt.
  • Zuletzt bearbeitet von mpmxyz am Fr, März 26, 2010 10:46, insgesamt einmal bearbeitet

M0rgenstern

BeitragDo, März 25, 2010 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
OKay.
Vielen Dank.
Werde das morgen alles umsetzen. Heute ledier nicht mehr (Verdammte Schule)

Vielen Dank nochmal.
(Irgendwie fühl ich mich schlecht. In der Beginners-Corner erscheinen dauernd neue Themen von mir...)

Lg, M0rgenstern

BladeRunner

Moderator

BeitragFr, März 26, 2010 8:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
(Irgendwie fühl ich mich schlecht. In der Beginners-Corner erscheinen dauernd neue Themen von mir...)

Ach Quark, dafür gibt es die Beginners doch...
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Macintosh

BeitragFr, März 26, 2010 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
es ist aber wichtig das wenn du einen neuen button mit z.b. TButton.create(..) erstellst auch sicherstellst das der fuktionspointer nicht leer ist. ich habe dazu extra immer eine Funktion die benutz wird wenn man nicht zugewiesen hat, erspart viele fehlermeldungen und programmabstürze! :) (müsste aber auch zu lösen sein indem man vor dem aufruf der Funktion prüft ob eine zugewiesen ist.

M0rgenstern

BeitragMo, März 29, 2010 14:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute.

Ich hatte noch nicht früher Zeit das ganze zu testen.
Habs jetzt grade versucht zu implementieren, aber das funktioniert nicht ganz.

Weder mit:
BlitzMax: [AUSKLAPPEN]
AttackButton.OnClick = AttackButtonClick()

In der Hauptschleife, nach dem der Butto erstellt wurde, noch so:

[syntax="bmax"]Global AttackButton:TButton = TButton.Create(BAttackImage, BAttackSelectedImage, GraphicsWidth() / 2, GraphicsHeight() - 32, AttackButtonClick())
BlitzMax: [AUSKLAPPEN]
ax"]Function Create:TButton(pIMage:TImage, pImage2:TImage, px:Int, py:Int, ClickAction:Object)
TButton.id = TButton.id + 1
Local B:TButton = New TButton
B.iX = px
B.iY = py

B.iID = TButton.id

B.OnClick = ClickAction

B.tmMainImage = TMyImage.Create(pIMage, 1, 0)
B.tmSelectedImage = TMyImage.Create(pImage2, 1, 0)
B.tmDrawnImage = B.tmMainImage
Return B
End Function


Ich bekomme dann jedesmal wenn ich die Funktion zuweisen will folgenden Compilerfehler:

Zitat:
Compile Error: Unable to convert from 'Object' to 'Int(Object)'


Vielleicht kann mir ja jemand helfen.

Lg, M0rgenstern

mpmxyz

BeitragMo, März 29, 2010 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
1. "Keine Klammern!" (Zitat aus einem früheren Beitrag) -> "AttackButton.OnClick = AttackButtonClick"
2. Funktionen sind keine Objekte. -> "..., ClickAction:Int(Parameter:Object))"
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

M0rgenstern

BeitragMo, März 29, 2010 20:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich habs jetzt eigentlich genauso gemacht, aber ich bekomme immernoch die gleiche Fehlermeldung:

BlitzMax: [AUSKLAPPEN]
Global AttackButton:TButton = TButton.Create(BAttackImage, BAttackSelectedImage, GraphicsWidth() / 2, GraphicsHeight() - 32)
AttackButton.OnClick = AttackButtonClick


BlitzMax: [AUSKLAPPEN]
Field OnClick(Data:Object)


BlitzMax: [AUSKLAPPEN]
Function AttackButtonClick()


End Function


Lg, M0rgenstern

d-bug

BeitragMo, März 29, 2010 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Na wenn der Pointer aber auch was anderes beherbergen soll wie du als Callback übergibst...

Wenn dein Pointer so ausehen soll...
BlitzMax: [AUSKLAPPEN]
Field OnClick(Data:Object)


dann muss der korrespondierende Callback so ausehen:
BlitzMax: [AUSKLAPPEN]
Function AttackButtonClick(Data:Object)
End Function
 

Macintosh

BeitragMo, März 29, 2010 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]

Function AttackButtonClick( data:Object )

Print String(data) 'was auch immer^^

End Function


so musses sein.
Du übergibst sonst einer Funktion parameter, die keine entgegenimmt!

EDIT: Misst zu spät ;D

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group