[GELÖST] Tiles in einem Canvas zeichen?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: [GELÖST] Tiles in einem Canvas zeichen?

BeitragMo, Nov 28, 2011 22:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich bin mit Undead Cut Down nun soweit, das ich anfangen kann, die Maps zu modellieren. Also programmiere ich einen neuen TileMap Editor, da der alte nicht mehr ausreichte (siehe diesen Threat).
Nun aber das Problem: Das Dingen ist in BlitzMax mit MaxGui Programmiert, also habe ich ein Canvas reingesetzt, welches Bilder anzeigen kann. Ich weiß allerdings nicht, wie das gehen soll.
Ich versuche mal den jetzigen Fensteraufbau zu erklären (der Code würde hier nicht reinpassen): Links oben ist eine Auswahl, welche alle Tiles auf dem Tileset zeigt. Der User wählt eins aus, dieses wird markiert.
Da drunter kann er das Tileset auswählen, anzahl der Tiles und größe eines Tiles werden automatisch berechnet (mit ImageWidth und ImageHeight).
Rechts ist ein Canvas, in welchem die Map angezeigt werden soll.
Nun gibt es aber folgende Probleme:
1.) Wie zeichne ich in dieses Canvas, also das auch alle vorher gezeichneten Tiles angezeigt werden?
2.) Wie baue ich funktionierende Slider ein? Und wie passe ich diese der Mapgröße an? (weil ja nur eine bestimmte anzahl an tiles angezeigt werden kann)

mfG,
CO2

P.S.: Die Maps werden in 2 Dateien gespeichert:
1x .tmp Datei, hier wird der tilesetfile, sowie die TileIDs aller mapfelder gespeichert.
1x .amp Datei, hier wird der tilesetfile, sowie das betroffene tile auf x und auf y achse, sowie der pfad zur anderen map gespeichert. (Also antwort auf den obigen Threat Wink )
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
  • Zuletzt bearbeitet von CO2 am Mo, Dez 05, 2011 21:17, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragMo, Nov 28, 2011 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Den Canvas als Ziel Einstellen: SetGraphics(CanvasGraphics(DeinCanvas))
2. CreateSlider / SetSliderRange sollte dir helfen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragDi, Nov 29, 2011 2:11
Antworten mit Zitat
Benutzer-Profile anzeigen
ich sende dir hier mal mein "0815-immer-so anfang-GUI-Gerüst":

BlitzMax: [AUSKLAPPEN]
Import MaxGUI.Drivers 
Global Window:TGadget, Canvas:TGadget

FensterErstellen()
CreateTimer 60

While WaitEvent()
Local tmpGadget:TGadget
'Print EventID()
Select EventID()
Case EVENT_TIMERTICK
HauptSchleife
RedrawGadget canvas
Case EVENT_GADGETPAINT
Local Fenster:TGraphics=CanvasGraphics(canvas)
SetGraphics Fenster
SetClsColor 255,255,255
Cls
' hier kommt dein Code zum Malen rein
Flip
Case EVENT_WINDOWCLOSE
ProgrammEnde
Case EVENT_APPTERMINATE
ProgrammEnde
Case EVENT_MENUACTION

Case EVENT_MOUSEDOWN
tmpGadget = TGadget(EventSource())
If tmpGadget=Canvas
Print "maus " + mausx + " " + mausy
EndIf
Case EVENT_MOUSEMOVE
tmpGadget= TGadget(EventSource())
If tmpGadget=Canvas
MausX=EventX()
MausY=EventY()
EndIf
Case EVENT_GADGETACTION
End Select
Wend
ProgrammEnde

Function ProgrammEnde()
End
End Function

Function Hauptschleife()

End Function

Function FensterErstellen()
Local flags%=WINDOW_TITLEBAR | WINDOW_CLIENTCOORDS|WINDOW_CENTER
Window= CreateWindow("Leeres Test Window" , 0 , 0 , 600 , 400 , Null , Flags%)
Canvas=CreateCanvas(5 , 5 , 400, 300 , Window)

End Function



In dem CASE-Block "EVENT_GADGETPAINT" ist praktisch alles so, wie du es auch von "normalen" BMax-Programmen gewohnt bist. Zwischen CLS und FLIP kommt das Malen des Bildschirms.


Zu deiner Slider-Frage eine Rückfrage: Benötigst Du sie um die Canvas oder die Tilsets zu scrollen?
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

CO2

ehemals "SirMO"

BeitragDo, Dez 01, 2011 22:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Erstmal danke für die Antworten und entschuldigung, das ich erst jetzt zurückschreibe.

So, nun habe ich aber eine Frage:
Wie kann man die tileposition bestimmen? Also wenn ich mit der maus auf einen pixel klicke, das erkannt wird, welche TilePosition da ist? Also das das tile, welches an der maus "hängt" quasi rasterartig verschoben wird?
ICh habe da mal was probiert: BlitzMax: [AUSKLAPPEN]
	If(mx > 0 And mx <= tilesetwidth)
If(my > 0 And mx <= tilesetwidth)

EndIf
EndIf

aber ich weiß nicht weiter (tilesetwidth ist eine Variable, welche die tilegröße enthält Wink ) Was kommt in die 2. IF-Abfrage rein?

mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Midimaster

BeitragFr, Dez 02, 2011 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
wen du die Mauswerte durch die Tilegröße teilst kommt vor dem Komma die Tile-Position heraus:

Code: [AUSKLAPPEN]
angenommen tilegröße 32
mx=30  ->  mx/32=0.9... ->position 0
mx=34  ->  mx/32=1.1...  -> position 1
mx=340  ->  mx/32=10.7...  -> position 10

mit der INT()-Funktion schneidest du den hinteren Teil ab:
BlitzBasic: [AUSKLAPPEN]
Tile_X = Int( MouseX() / TileSize)
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

CO2

ehemals "SirMO"

BeitragFr, Dez 02, 2011 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, danke für die Antwort!

Also muss ich dann in beide Richtungen (x und y) jeweils das rechnen. Muss das dann auch in eine For-Next-Schleife? oder geht das auch ohne?

EDIT:

Habs mal versucht in Code umzusetzen, nun sieht es wie folgt aus:

- In der Hauptschleife: BlitzMax: [AUSKLAPPEN]
Case EVENT_GADGETPAINT 'Das Canvas wird angemalt
Local Fenster:TGraphics = CanvasGraphics(mapcanvas)
SetGraphics(Fenster)
SetClsColor 0, 0, 0
Cls
If(tilesetwidth > 0)
DebugLog "In Malen dingsi!"
EditTileMap()
UpdateCanvas()
EndIf
Flip 0

(- "mapcanvas" ist hier das Canvas in dem die Map gezeichnet werden soll,
- "tilesetwidth" wird ausgerechnet, sobald ein neues Tileset gewählt wird und ist die bildhöhe des geladenen tilesets)

- Funkion EditTileMap(): BlitzMax: [AUSKLAPPEN]
Function EditTileMap()
Local mx = MouseX()
Local my = MouseY()
Local tileposx:Int = Int(mx / tilesetwidth)
Local tileposy:Int = Int(my / tilesetwidth)

Local seltile:String = GadgetItemText(tileselect, SelectedGadgetItem(tileselect))
Local splittet:String[] = seltile.split(":")

Local frameid:Int = Int(Trim(splittet[1]))
DebugLog "FrameID: " + frameid

map[tileposx, tileposy] = frameid

DrawImage(tilesetloaded, tileposx, tileposy, frameid)
End Function


- Funktion UpdateCanvas(): BlitzMax: [AUSKLAPPEN]
Function UpdateCanvas()
Local x:Int
Local y:Int
For x = 0 To mapsizex
For y = 0 To mapsizey
DrawImage(tilesetloaded, x * tilesetwidth, y * tilesetwidth, map[x, y])
Next
Next
End Function


Durch die DebugLog einträge habe ich rausgefunden, das nie der teil erreicht wird, in dem die beiden Funktionen stehen.
Woran liegt das?

Weiterhin habe ich herausgefunden, dass der Case zweig nur exakt einmal ausgeführt wird.

mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Midimaster

BeitragSa, Dez 03, 2011 0:05
Antworten mit Zitat
Benutzer-Profile anzeigen
1.
die Maus wird eigentlich wo anders bestimmt, sieh ma in meinem 0815-code nach dem Block
BlitzMax: [AUSKLAPPEN]
	Case	EVENT_MOUSEDOWN 

Dort wird bereits mX und mY festgelegt



2.
das Event Case EVENT_GADGETPAINT wird dann aufgerufen, wenn du den Timer eingebaut hast und im EVENT_TIMERTICK dies steht:

BlitzMax: [AUSKLAPPEN]
   	Case EVENT_TIMERTICK
HauptSchleife
RedrawGadget canvas




3.
überprüfe mal, ob die Variable tilesetwidth wirklich in der Hauptschleife >0 ist.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

CO2

ehemals "SirMO"

BeitragSa, Dez 03, 2011 0:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, danke für die Antwort Very Happy Jetzt wird zumindest 1 Tile links oben in die Ecke des Canvas gezeichnet, Code habe ich wie folgt verändert:
- Hauptschleife: BlitzMax: [AUSKLAPPEN]
		Case EVENT_TIMERTICK
RedrawGadget(mapcanvas)
Case EVENT_MOUSEMOVE
tmpGadget = TGadget(EventSource())
If tmpGadget = Canvas
MausX = EventX()
MausY = EventY()
EndIf
Case EVENT_GADGETPAINT 'Das Canvas wird angemalt
SetGraphics(CanvasGraphics(mapcanvas))
SetClsColor 0, 0, 0
If(tilesetwidth > 0)
Cls
EditTileMap()
'UpdateCanvas()
Flip 0
EndIf

(Der Timer ist auf "60" gestellt, MausX und MausY sind globale variablen)

- EditTileMap(): BlitzMax: [AUSKLAPPEN]
Function EditTileMap()
Local tileposx:Int = Int(MausX / tilesetwidth)
Local tileposy:Int = Int(MausY / tilesetwidth)

Local seltile:String = GadgetItemText(tileselect, SelectedGadgetItem(tileselect))
Local splittet:String[] = seltile.split("=")

Local frameid:Int = Int(Trim(splittet[1]))

map[tileposx, tileposy] = frameid
DebugLog "frameid = " + frameid 'Hier wird die Korrekte TileID zurück gegeben, auch beim letzten tile. Allerdings gibt das beim letzten tile einen error

DrawImage(tilesetloaded, tileposx, tileposy, frameid)
End Function
(Hier wird ein Error ausgegeben, sobald das letzte Tile in der ListBox angewählt wird...)

- BlitzMax: [AUSKLAPPEN]
Function UpdateCanvas()
Local x:Int
Local y:Int
For x = 0 To mapsizex
For y = 0 To mapsizey
DrawImage(tilesetloaded, x * tilesetwidth, y * tilesetwidth, map[x, y])
Next
Next
End Function
(Diese Funktion wird gar nicht ausgeführt, da sie sofort einen Error produziert ("Unhandled Exception: Attempt to index Array element beyond array lengh"), das Array map[] ist vorerst mit 200 mal 200 Feldern deklariert)

Die Variable tilesetwidth entspricht der Höhe eines Tiles, selbst wenn das Tileset gewechselt wird, wird der wert der variablen geändert.

mfG,
CO2

P.S.: Zu 2.) Was würde bei dir in der Funktion "HauptSchleife" stehen?
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Xeres

Moderator

BeitragSa, Dez 03, 2011 0:51
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
For x = 0 Until mapsizex

Nicht vergessen, dass Arrays Length groß sind - einschließlich der Null! Bei 200 Einträgen sind das 0 bis 199.
"Until" oder "To mapsizex-1".

Ich würde die Aktuell ausgewählte Id vll. Global zwischenspeichern statt jedes mal aus einem Text zu splitten.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

CO2

ehemals "SirMO"

BeitragSa, Dez 03, 2011 1:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke dir für die Antwort.

Zitat:
Nicht vergessen, dass Arrays Length groß sind - einschließlich der Null!
- Ja, ist geändert, funktioniert Wink, Jetzt wird auch die Gesamte Map mit dem zuerst ausgewählten Tile gezeichnet.

Zitat:
Ich würde die Aktuell ausgewählte Id vll. Global zwischenspeichern
- Aber da müsste ich die ausgewählte ID ebenfalls auslesen... Das einzige was sich ändern würde ist, das die variable dann global und über der hauptschleife stehen würde und nicht mehr in der funktion. (In der ListBox wird pro tile folgendes geschrieben: "Tile ID = [x]", wobei x halt eben eine zahl zwischen 0 und anzahldertilesaufdemtileset ist.

Aber nichts desto trotz lässt sich die Map weiterhin nicht bearbeiten. Wenn man ein Tileset auswählt, wird die Gesamte Map mit dem 1. Tile auf dem Tileset "bestückt" (Also mit Tile #0). Wie kann ich das denn ändern?

mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Midimaster

BeitragSo, Dez 04, 2011 1:42
Antworten mit Zitat
Benutzer-Profile anzeigen
ich vermute mal: wahrscheinlich ist ja die Map zunächst leer, also alle Map[x,y] sind eben 0. Und daher wird alles voller Tile 0 gemalt?

Zwei Möglichkeiten der Änderung:

Du füllst zunächst alle Felder der Map mit 999. Dieser Wert wird wahrscheinlich auf keine Tile zeigen.

oder:

Du läßt die 0 im Tilset immer frei und gibst dem ersten Tile die Nummer 1.

Vorsicht:

Bei beiden Methoden musst Du direkt vor dem DrawImage... die Map abfragen und diesen Fall abfangen:

BlitzMax: [AUSKLAPPEN]
	For x = 0 To mapsizex
For y = 0 To mapsizey
If map[x,y]>0
DrawImage(tilesetloaded, x * tilesetwidth, y * tilesetwidth, map[x, y])
EndIf
Next
Next
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

CO2

ehemals "SirMO"

BeitragSo, Dez 04, 2011 2:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antwort.

Ok, das würde das "Problem" lösen, wenn ein neues Tileset gewählt wird, aber das Problem, das keine anderen Tiles gesetzt werden besteht weiterhin Wink

mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Midimaster

BeitragSo, Dez 04, 2011 10:34
Antworten mit Zitat
Benutzer-Profile anzeigen
da wirst du jetzt wohl einige DEBUGLOGs einfügen müssen, um dem Problem auf die Spur zu kommen.

Es kann ja mehrere Gründe haben:

1. Das nächste Tile wurde überhaupt nie ausgewählt

2. Das gewählte Tile wird nicht eingetragen

3. Das zwar eingetragene Tile wird nicht gezeichnet.

Am besten findest Du es heraus, wenn Du nie Tiles in der Map ganz links oben zeichnest und dann diesen Abschnitt der Map als PRINT auf der Console ausgibst:

BlitzMax: [AUSKLAPPEN]
Print "TILETEST"
For x = 0 To 3
For y = 0 To 3
Print x + "/" + y + "=" + map[x, y]
Next
Next

und zwar jedesmal, wenn du ein neues Tile in die Map reinklickst.

Wenn das gut geht, dann kommt es in die Draw-Routine. möglicherweise kombiniert mit einem Timer, damit nicht zuviel auf der Console zu sehen ist:

BlitzMax: [AUSKLAPPEN]

Global ConsoleTimer%
.....
.....

If ConsoleTimer<MilliSecs()
Print "TILETEST"
ConsoleTimer=MilliSecs()+1000
For x = 0 To 3
For y = 0 To 3
Print x + "/" + y + "=" + map[x, y]
Next
Next
EndIf
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

CO2

ehemals "SirMO"

BeitragSo, Dez 04, 2011 13:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, danke für die Antwort! Ich habe ein wenig rumprobiert, und glaube, das es an der EditTileMap() Funktion liegt, BlitzMax: [AUSKLAPPEN]
Function EditTileMap()
Local tileposx:Int = Int(MausX / tilesetwidth)
Local tileposy:Int = Int(MausY / tilesetwidth)

Local seltile:String = GadgetItemText(tileselect, SelectedGadgetItem(tileselect))
Local splittet:String[] = seltile.split(":")

Local frameid:Int = Int(Trim(splittet[1]))

DrawImage(tilesetloaded, tileposx, tileposy, frameid)

If(MouseHit(1)) 'Hier liegt wahrscheinlich der Hund begraben...
map[tileposx, tileposy] = frameid
EndIf
End Function


EDIT: Ich habe durch weiteres Rumprobieren herausgefunden, das weder "MouseX()" und "MouseY()" noch "EventX()" und "EventY()" einen Wert zurückliefern (bzw. Sie liefern immer 0 zurück).

mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Midimaster

BeitragMo, Dez 05, 2011 11:46
Antworten mit Zitat
Benutzer-Profile anzeigen
das ist sehr sonderbar. Aber du musst dir dann immer Testpunkte in den Code einfügen, an denen Du das Verhalten genauer einkreisen kannst. Hier am Beispiel der Maus:

BlitzMax: [AUSKLAPPEN]
....
Case EVENT_MOUSEDOWN
Print "Maus Down Event"
tmpGadget = TGadget(EventSource())
If tmpGadget=Canvas
Print "down im Canvas Gadget"
Print "maus aktuell bei" + mausx + " " + mausy

' und hier kommt nun der Code hin, der regelt, was passieren soll, wenn die Maus geklickt wird. Oft ist das dann ein Sprung in eine eigene Funktion:

MausGeklickt mausx mausy

EndIf
Case EVENT_MOUSEMOVE
Print "Maus Move Event"
tmpGadget= TGadget(EventSource())
If tmpGadget=Canvas
Print "move im Canvas Gadget"
MausX=EventX()
MausY=EventY()
EndIf
....

Function MausGeklickt(MausX% , MausY%)
Local tileposx:Int = Int(MausX / tilesetwidth)
Local tileposy:Int = Int(MausY / tilesetwidth)

Local seltile:String = GadgetItemText(tileselect, SelectedGadgetItem(tileselect))
Local splittet:String[] = seltile.split(":")

Local frameid:Int = Int(Trim(splittet[1]))

map[tileposx, tileposy] = frameid

End Function


Das Malen kommt hier nun nicht hin! Das wird wirklich nur im GadgetPaint erledigt!



Wenn Du es nicht so streng machen willst, kannst Du auch im EVENT MouseDown() ein Flag setzen und dann wie gewohnt in Deiner EditTileMap() weiterverarbeiten:

BlitzMax: [AUSKLAPPEN]
Global MausGeklickt%

.....
Case EVENT_MOUSEDOWN
Print "Maus Down Event"
tmpGadget = TGadget(EventSource())
If tmpGadget=Canvas
Print "move im Canvas Gadget"
Print "maus aktuell bei" + mausx + " " + mausy

MausGeklickt=1

EndIf
Case EVENT_MOUSEMOVE
....

Function EditTileMap()
Local tileposx:Int = Int(MausX / tilesetwidth)
Local tileposy:Int = Int(MausY / tilesetwidth)

Local seltile:String = GadgetItemText(tileselect, SelectedGadgetItem(tileselect))
Local splittet:String[] = seltile.split(":")

Local frameid:Int = Int(Trim(splittet[1]))

DrawImage(tilesetloaded, tileposx, tileposy, frameid)

If MausGeklickt=1
MausGeklickt=0
map[tileposx, tileposy] = frameid
EndIf
End Function


Jedenfalls stehen Dir Ereignisfunktionen wie etwas MouseHit() unter MaxGui nicht zur Verfügung. Vermeide alle Befehle, die irgendwie auf eine Ereignis reagieren, z.b alle Mouse... Key... Wait... Get... usw. Suche stattdessen immer nach dem entsprechenden EVENT in der MaxGui!
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

CO2

ehemals "SirMO"

BeitragMo, Dez 05, 2011 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antwort,
Es liegt 100%ig an "EventX()" und "EventY()", bei liefern immer 0 zurück,

mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Midimaster

BeitragMo, Dez 05, 2011 19:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann probier doch mal bitte, ob es in dieser Minimal-GUI funktioniert:

BlitzMax: [AUSKLAPPEN]
Import MaxGUI.Drivers 
Global Window:TGadget, Canvas:TGadget

Window= CreateWindow("Leeres Test Window" , 0 , 0 , 600 , 400 , Null , WINDOW_TITLEBAR | WINDOW_CLIENTCOORDS|WINDOW_CENTER)
Canvas=CreateCanvas(5 , 5 , 400, 300 , Window)

While WaitEvent()
Local tmpGadget:TGadget
Select EventID()
Case EVENT_MOUSEDOWN
tmpGadget = TGadget(EventSource())
If tmpGadget=Canvas
Print "klick maus " + mausx + " " + mausy
EndIf
Case EVENT_MOUSEMOVE
tmpGadget= TGadget(EventSource())
If tmpGadget=Canvas
MausX=EventX()
MausY=EventY()
Print "move im Canvas Gadget " + MausX + " " + MausY
EndIf
End Select
Wend
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

CO2

ehemals "SirMO"

BeitragMo, Dez 05, 2011 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, Das funktioniert einwandfrei...

Ich glaube ich habe den Fehler gefunden: Die Variable "tmpGadget" war bei mir nicht als "TGadget" deklariert.
Jetzt habe ich es als TGadget deklariert, bekomme aber einen Fehler bei der ersten If-Abfrage (in der ich überprüfe, ob "tmpGadget = Canvas" ist).
Fehlermeldung ist wie folgt: Zitat:
Compile Error

Types 'maxgui.maxgui.TGadget' and 'Int' are unrelated

Ich habe diese Case EVENT_MOUSEMOVE und Case EVENT_MOUSEDOWN aus deinem Code übernommen, Midimaster, und lediglich vor der Select EventID() Verzweigung die Variable "tmpGadget" als "TGadget" deklariert, sieht als Code wie folgt aus:
BlitzMax: [AUSKLAPPEN]
Local tmpGadget:TGadget
Select EventID()
Case EVENT_WINDOWCLOSE 'Fenster wird geschlossen
End
Case EVENT_TIMERTICK
RedrawGadget(mapcanvas)
Case EVENT_MOUSEMOVE
tmpGadget = TGadget(EventSource())
If(tmpGadget = Canvas) 'Diese Zeile wird markiert, wenn ich wie oben tmpGadget als TGadget deklariere
MausX = EventX()
MausY = EventY()
EndIf
Case EVENT_MOUSEDOWN
tmpGadget = TGadget(EventSource())
If(tmpGadget = Canvas)
TileGesetzt = 1
EndIf
End Select


EDIT: Hat sich geklärt Embarassed natürlich muss ich "Canvas" durch "mapcanvas" ersetzen, ich dachte "Canvas" wäre eine Konstante, vorgegeben von der Maxgui Embarassed

Ich bedanke mich bei allen die Halfen, und der vollständigkeit halber hier der funktionierende Code: BlitzMax: [AUSKLAPPEN]
Global mainwindow:TGadget =                 CreateWindow(AppTitle + " [v." + Version + "]", 100, 100, 900, 710, Null, WINDOW_TITLEBAR | WINDOW_STATUS | WINDOW_CLIENTCOORDS | WINDOW_CENTER)
Global mapcanvas:TGadget = CreateCanvas(400, 50, 480, 590, mainwindow)

CreateTimer 60
Global MausX:Int = 0
Global MausY:Int = 0

While WaitEvent()
Local tmpGadget:TGadget
Select EventID()
Case EVENT_WINDOWCLOSE 'Fenster wird geschlossen
End
Case EVENT_APPTERMINATE
End
Case EVENT_TIMERTICK
RedrawGadget(mapcanvas)
Case EVENT_MOUSEMOVE
tmpGadget = TGadget(EventSource())
If(tmpGadget = mapcanvas)
MausX = EventX()
MausY = EventY()
DebugLog MausX + ", " + MausY
EndIf
Case EVENT_MOUSEDOWN
tmpGadget = TGadget(EventSource())
If(tmpGadget = mapcanvas)
TileGesetzt = 1
EndIf
Case EVENT_GADGETPAINT 'Das Canvas wird angemalt
SetGraphics(CanvasGraphics(mapcanvas))
SetClsColor 0, 0, 0
If(tilesetwidth > 0)
Cls
UpdateCanvas()
EditTileMap()
Flip 0
EndIf
RedrawGadget(mapcanvas)
End Select
Wend

Function UpdateCanvas()
For x = 0 To (mapsizex - 1)
For y = 0 To (mapsizey - 1)
DrawImage(tilesetloaded, x * tilesetwidth, y * tilesetwidth, map[x, y])
Next
Next
End Function

Function EditTileMap()
Local tileposx:Int = Int(MausX / tilesetwidth)
Local tileposy:Int = Int(MausY / tilesetwidth)

Local seltile:String = GadgetItemText(tileselect, SelectedGadgetItem(tileselect))
Local splittet:String[] = seltile.split(":")

Local frameid:Int = Int(Trim(splittet[1]))

DrawImage(tilesetloaded, tileposx, tileposy, frameid)

If(TileGesetzt = 1)
TileGesetzt = 0
map[tileposx, tileposy] = frameid
EndIf
End Function


Müsste alles sein... Gibt noch ein paar kleine Bugs, aber die lassen sich nun relativ leicht beheben Wink

mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Xeres

Moderator

BeitragMo, Dez 05, 2011 21:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Auf die temporäre Variable kann man auch komplett verzichten:
BlitzMax: [AUSKLAPPEN]
If EventSource() = Canvas Then [...]
Man vergleicht in jedem Fall die konkreten Objekte miteinander.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

CO2

ehemals "SirMO"

BeitragMo, Dez 05, 2011 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke auch dir für die Antwort!
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group