[GELÖST] Tiles in einem Canvas zeichen?
Übersicht

CO2ehemals "SirMO"Betreff: [GELÖST] Tiles in einem Canvas zeichen? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
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
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich sende dir hier mal mein "0815-immer-so anfang-GUI-Gerüst":
BlitzMax: [AUSKLAPPEN] Import MaxGUI.Drivers 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 |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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) aber ich weiß nicht weiter (tilesetwidth ist eine Variable, welche die tilegröße enthält ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 (- "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() - Funktion UpdateCanvas(): BlitzMax: [AUSKLAPPEN] Function UpdateCanvas() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 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 |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok, danke für die Antwort ![]() - Hauptschleife: BlitzMax: [AUSKLAPPEN] Case EVENT_TIMERTICK (Der Timer ist auf "60" gestellt, MausX und MausY sind globale variablen) - EditTileMap(): BlitzMax: [AUSKLAPPEN] Function EditTileMap()(Hier wird ein Error ausgegeben, sobald das letzte Tile in der ListBox angewählt wird...) - BlitzMax: [AUSKLAPPEN] Function UpdateCanvas()(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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke dir für die Antwort.
Zitat: Nicht vergessen, dass Arrays Length groß sind - einschließlich der Null! - Ja, ist geändert, funktioniert ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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" 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]
|
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok, danke für die Antwort! Ich habe ein wenig rumprobiert, und glaube, das es an der EditTileMap() Funktion liegt, BlitzMax: [AUSKLAPPEN] Function EditTileMap() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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] .... 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% 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 |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann probier doch mal bitte, ob es in dieser Minimal-GUI funktioniert:
BlitzMax: [AUSKLAPPEN] Import MaxGUI.Drivers |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 EDIT: Hat sich geklärt ![]() ![]() 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) Müsste alles sein... Gibt noch ein paar kleine Bugs, aber die lassen sich nun relativ leicht beheben ![]() 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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group