[GELÖST] Leeren Kasten Zeichnen Problem...
Übersicht

CO2ehemals "SirMO"Betreff: [GELÖST] Leeren Kasten Zeichnen Problem... |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
Ich stehe mal wieder komplett auf'm Schlauch ![]() ![]() Also eben selbst ne Funktion Geschrieben, die "leere" Kästen Zeichnet, so sieht sie aus: BlitzMax: [AUSKLAPPEN] Function DrawRect2:Int(x, y, w, h)Parameter: x = x Position des Kastens y = y Position des Kastens w = Breite des Kastens h = Höhe des Kastens Die Funktioniert meines erachtens nach auch wunderbar (hoffe ich ![]() Function DrawGrid:Int(tilesize:Int, sizex:Int, sizey:Int)Parameter: tilesize = Größe (Breite und Höhe) eines Tiles sizex = Wie viele Kästen Breit? sizey = Wie viele Kästen Hoch? (Markierte Zeilen ('MARKIERT) Erklärung: bei "+33" ging ich vorerst von einer Tilesize von 32 x 32 px aus, wird natürlich noch geändert, sobald die Funktion funktioniert) So, nun aber wirklich zum Problem: Das Raster wird nicht Quadratisch gezeichnet, sondern dreieckig (Ich hoffe das kann man sich jetzt vorstellen). ich mals nochmal auf: So soll es aussehen: Code: [AUSKLAPPEN] [][][][][]
[][][][][] [][][][][] [][][][][] [][][][][] Und so sieht es aus: Code: [AUSKLAPPEN] []
wobei "[]" für einen "leeren" kasten steht.
[][] [][][] [][][][] [][][][][] Wie bekomme ich das also hin, das die Kästen in einem Quadrat angeordnet werden? Es sei noch gesagt, das ich das ganze in einem Canvas in einem mit der MaxGUI erstellten Fenster male. Ach ja, und noch schnell ne Frage hinterher: Kann mir wer sagen, wie ich diese Tiles mit der Maus zeichnen lassen kann, also wie in meinem "TileMapEditor v.1.6"? Ich habe den Quellcode von dem Programm leider gelöscht ![]() ![]() Und gleich noch eine Frage: Wie kann man scrollbare Canvases erstellen? als wenn die TileMap z.b.: 500 x 500 tiles groß sein soll, aber vom Canvas nur 20 x 20 angezeigt werden können, wie kann ich dann solche scroll-dinger erstellen, das die auch funktionieren? so, das wars erstmal meinerseits, 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 |
- Zuletzt bearbeitet von CO2 am Di, Sep 27, 2011 21:21, insgesamt einmal bearbeitet
![]() |
BlitzMoritz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mach DrawRect2() doch lieber so und zwar mit DrawRect statt DrawLine - soll schneller sein ...
außerdem muss bei DrawGrid() zwischenzeitlich der startposy-Wert wieder auf Null gesetzt werden. Ansonsten ist die DrawGrid-Funktion nicht so hilfreich, weil du sie nicht flexibel genug handhabst: Du setzt viele Dinge (willkürlich) innerhalb der Funktion fest (z.B. Abstand, Startposition, Farbe), anstatt sie als Argumente der Funktion zu übergeben. Außerdem verquickst du merkwürdig die Anzahl der tiles mit x und y, tilesize, sizex und sizey. In deiner Funktion ist 33 der Abstand zwischen den Tiles und tilesize die quadratische Größe des Rechtecks. Wolltest du das so? Du lässt x bis sizex * tilesize und y bis sizey * tilesize laufen! In meinem Code-Beispiel werden dabei 480000 Rechtecke gezeichnet. Wolltest du das so? Ich würde da noch einmal nachdenken, was der Unterschied zwischen Zeichenpositionen und Laufvariablen ist, die die Anzahl der Rechtecke durchzählen. BlitzMax: [AUSKLAPPEN] Graphics 800,600 |
||
- Zuletzt bearbeitet von BlitzMoritz am Mo, Sep 26, 2011 21:57, insgesamt 5-mal bearbeitet
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Erstmal danke für die Antwort!
Daran, das Drawrect auch Rechtecke zeichnen kann, die nur 1 px breit sind habe ich gar nicht gedacht ![]() ![]() ![]() Aber jetzt noch ne Frage zu diesem "Y Position immer wieder auf 0 setzen": Warum? ![]() ![]() ![]() EDIT: Das war ja vorerst nur die "Versuchs" - Funktion. Da wird sehr wahrscheinlich noch viel dran geändert, bevor sie ins Programm aufgenommen 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 |
![]() |
BlitzMoritz |
![]() Antworten mit Zitat ![]() |
---|---|---|
CO2 hat Folgendes geschrieben: Aber jetzt noch ne Frage zu diesem "Y Position immer wieder auf 0 setzen": Warum?
Vergiss nicht, du verquickst zwei Schleifen ineinander und zählst startposx und startposy immer weiter. Was passiert denn als erstes? startposx bleibt bei 0, während startposy hochzählt. Wenn startposy (bzw. eher y) am Ende angelangt ist, zählt startposx eins weiter. Und wo ist in diesem Moment startposy? Richtig - bereits weit fortgeschritten. Wenn also die innere Schleife verlassen wurde und die äußere mit startposx wieder eins weiterzählt, muss startposy wieder auf 0 starten, ein 3x3 grid würde (von Links nach Rechts) dann so gemalt: X__ X__ X__ XX_ XX_ XX_ XXX XXX XXX ___ X__ X__ X__ XX_ XX_ XX_ XXX XXX ___ ___ X__ X__ X__ XX_ XX_ XX_ XXX Ansonsten teste doch mal das hier mit und ohne "startposy = 0": BlitzMax: [AUSKLAPPEN] For x = 0 To 3 Außerdem habe ich im obigen Post noch einige Hinweise nacheditiert - lies es dir bitte noch mal durch. |
||
- Zuletzt bearbeitet von BlitzMoritz am Mo, Sep 26, 2011 22:02, insgesamt 3-mal bearbeitet
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Scrollbare Canvas:
Dafür brauchst Du 'Slider', die findest Du ebenfalls in MaxGUI. Unter Createslider findest Du ein Beispiel dazu. Das Umrechnen der erhaltenen Werte auf dein Canvas liegt in deiner Verantwortung. |
||
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 |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
Achso, dann habe ich das mit dem auf 0 setzen verstanden. Zitat: In meinem obigen Beispiel werden dabei 480000 Rechtecke gezeichnet Achja, entschuldigung: Das soll natürlich nicht so ![]() *Wie oben geschrieben: Wird geändert, sobald die funktion funktioniert ![]() Den anderen Hinweis: siehe EDIT im obigen Post ![]() EDIT: Sorry Bladerunner, habe dich übersehen ![]() 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 |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das steht in der Hilfe zur Maxgui. Du steuerst dass per Flag. Da gibt es ein Flag für vertikale und eins für horizontale Slider. | ||
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 |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da ist ein schwerer Denkfehler in deiner Grid-Funktion. Jedesmal, wenn Du sie aufrufst, werden viel zu viele Rechtecke gemalt. feststellen kannst Du es mit einen Zähler Z%:
BlitzMax: [AUSKLAPPEN] Graphics 800,600 bei eine 10x10 Feld sollten gerade mal 100 rauskommen, es sind aber 40401! Der Fehler liegt in der For/Next-Schleife. Mach es besser so: BlitzMax: [AUSKLAPPEN]
|
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ohne jetzt groß rumzunörgeln...
Geht's hier lediglich darum, dass der Herr CO2 selbst auf eine gescheite Lösung kommen soll? Dann sollte man ihm nämlich auch direkt in die bessere Richtung schubsen, statt ihm seine Performance-Bremse auch noch zu verbessern... ![]() Wäre eine Implementierung der DrawGrid Geschichte nicht sinnvoller, wenn man DrawLine mit zwei separaten Schleifen benutzt statt sich eine unglaublich unoptimierte Rechteck-Funktion aus 4 Rechtecken hundertfach auf den Schirm pinseln zu lassen? (Ich bekomme Hautgänse, wenn ich sowas sehe) BlitzMax: [AUSKLAPPEN] Function DrawGrid(tilesize:Int, sizeX:Int, sizeY:Int) (mal eben aus der hohlen Hand gezaubert (ohne die IDE zu bemühen)) |
||
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Erstmal wieder danke für die Antworten.
@ BladeRunner: Und die Flags werden wie gewohnt hinter dem "Style" - Parameter aufgeführt? (Die Flags sind (Habs gerade nochmal nachgeguckt): SLIDER_HORIZONTAL [Horizontaler Slider] und SLIDER_VERTICAL [Vertikaler Slider]) @ Midimaster: Zitat: Jedesmal, wenn Du sie aufrufst, werden viel zu viele Rechtecke gemalt. Das liegt daran, das anstatt 4 Linien pro Kasten zu zeichnen, 4 Rechtecke gezeichnet werden. Der hinweis es so zu machen kam von "BlitzMoritz" (Zitat:Mach DrawRect2() doch lieber so und zwar mit DrawRect statt DrawLine - soll schneller sein ... )
Danke für den Code, aber eine Frage dazu: Wofür steht das "X" bzw. das "Y" in der For Schleife? bzw. wo ist die deklariert - und was enthält sie? @ d-bug: Zitat: wenn man DrawLine mit zwei separaten Schleifen benutzt Daran habe ich gar nicht gedacht... wäre auch einfacher und effizienter (Da Linien nicht gezeichnet werden, die sowieso "überzeichnet" werden. So habe ich bei meiner vorherigen Funktion immer mindestens einen Kasten gehabt, welcher eine linie eines anderen kastens schnitt)
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 ![]() |
---|---|---|
neenee...
du hast wirklich 40401 DrawRect2-Aufrufe, also über 160.000 Rechtecke! das kommt daher, dass du die Schleifen in DrawGrid pro Pixel und nicht pro Tile aufrufst: Angenommen SizeX=10 BlitzMax: [AUSKLAPPEN] For x = 0 To (sizex * tilesize)sind halt schon 10*32 Aufrufe und nicht nur 10 Stück. waarecht müssen aber ja nur 10 und nicht 320 rechtecke gezeichnet werden! Die X und Y in meiner Funktion stehen für die Tiles-Spalten und -Reihen. Vielleicht wäre es durchsichtiger, für Dich, wenn man sie i ud j nennen würde? i und j laufen jeweils nur von 0 bis 10 (wenn wir SizeX mal mit 10 annehmen): BlitzMax: [AUSKLAPPEN] Function DrawGrid:Int(tilesize:Int, sizex:Int, sizey:Int) für die Zeile BlitzMax: [AUSKLAPPEN] DrawRect2 i*TileSize+1 , j*TileSize+1, (tilesize - 2), (tilesize - 2) ergeben sich dann die Malpositionen: Code: [AUSKLAPPEN] Bei i= Malpos i*TileSize+1
1 33 2 65 3 97 ... So wie DBug es zeigt, kannst du es auch machen, um ein leeres Rechenblatt zu zeigen. Du wirst aber letzendlich nicht um meine Funktion herumkommen, wenn die Tiles nicht mehr leer sind, sondern wirklich auch gezeichnet werden müssen: angenommen Feld[i,j] enthält die Information, was auf jedem Tile zu sehen sein soll und BildGras ist ein 32x32 Grasbild BlitzMax: [AUSKLAPPEN] Function DrawGrid:Int(tilesize:Int, sizex:Int, sizey:Int) |
||
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die Antwort!
Zitat: die Schleifen in DrawGrid pro Pixel und nicht pro Tile aufrufst: Ich habe ja gedacht, das ich das mit "startposx + 33" und "startposy + 33" aufgehoben hätte ![]() Zitat: Vielleicht wäre es durchsichtiger, für Dich, wenn man sie i ud j nennen würde? Ich war nur ein wenig verwirrt, weil du es so geschrieben hattest:
BlitzMax: [AUSKLAPPEN] For x = 0 To SizeXUnd da dachte ich, das sich "X" (In der For - Schleife) und "x" (Oben im Schleifen - Kopf) - das selbe natürlich mit "Y" und "y" - unterscheiden, deshalb habe ich gedacht, das das andere Variablen wären... Zitat: wenn die Tiles nicht mehr leer sind Ich hatte geplant, das das "nur" ein Raster ist, voran man sich orientieren kann. die Tiles werden darein gezeichnet (deshalb auch 33 x 33 px große Kästen (vorerst) und nicht 32 x 32 px) ![]() 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 |
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
Midimaster hat Folgendes geschrieben: So wie DBug es zeigt, kannst du es auch machen, um ein leeres Rechenblatt zu zeigen. Du wirst aber letzendlich nicht um meine Funktion herumkommen, wenn die Tiles nicht mehr leer sind...
Da geb ich dir recht, Midimaster, allerdings hat das in dem Sinne nichts mehr mit einem Grid zu tun, sondern ist die standard Darstellungsroutine für ein Tileset. Ich denke aber, da sind wir recht frei in der Namensgebung. Da es sich hier aber um einen Canvas in einem Editor handelt, der hoffentlich nicht in realtime aktualisiert wird, spricht wohl nichts dagegen erst das Tileset zu zeichnen und darüber dann das Grid. So machte ich es zumeist. So kann man das Grid mal schnell ausblenden, wenn es einen nervt. (Sollte jemand den Link geklickt haben: Mit Klick auf den Raster-Button lässt sich das Grid einfach ausblenden... Btw: Der Editor ist schon Jahre alt und NEIN, ich arbeite nicht wieder an ChaosFrog ![]() Basiert das ganze eigentlich auf DX oder OpenGL, CO2? Wenn es OpenGL ist wüsste ich dir zumindest eine schnellere Funktion für dein DrawRect2 anzubieten. |
||
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die Antwort.
Zitat: Tileset zu zeichnen und darüber dann das Grid Aber wie teilst du das den ein? weil eine linie im grid ist ja schon mindestens 1 px breit, d.h.: du musst die tilemap "versetzt" zeichnen. Wie machst du das? oder malst du das grid einfach so über die tilemap, ohne die tiles jeweils um die breite einer linie zu verschieben?
Zitat: (Sollte jemand den Link geklickt haben: Wie hast du denn die Zahlen oben und an der seite hingekriegt? ![]() Zitat: Basiert das ganze eigentlich auf DX oder OpenGL Da bin ich mir noch nicht im klaren: Wenn ich den Editor anbiete, soll er möglichst crossplatform sein (was für OpenGL spricht), was allerdings ein Problem ist, da ich es nur unter Windows kompilieren kann.
Andererseits weiß ich noch nicht, ob ich ihn nur selber verwende, wenn ja, nutze ich DX. 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 |
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nun, es war im wesentlichen ziemlich Schnuppe, dass ich einen Pixel des Tiles überzeichne. Meistens hab ich das Raster eh ausgeblendet, wenn ich was sehen wollte. Da würde ich es als ziemlich störend empfinden, wenn die Tiles dann alle einen Pixel auseinander liegen.
Die Zahlen sind ein Cocoa Gadget. Ich habe für den Editor nicht blankes MaxGUI verwendet sondern mein eigenes Modul namens CocoaExt. Deswegen würde dieser Editor auch niemals auf Windows oder Linux laufen sondern nur auf OSX. Im kurzen Sinne, frage ich beim Schollen des Canvases den Abstand zwischen sichtbarem Bereich und Ursprung der Map ab und Teile diesen dann durch die Tile-Größe und trage das Ergebnis dann als Gadget-Text in das Lineal ein. Bei jedem Step wird ab da noch um 1 hochgezählt und das war es dann auch. Da der Editor nur in Tile-Größe-Schritten scrollt kann man das so machen. Naja, ich denke es wird auch für DX eine DrawRect Version realisierbar sein, die ähnlich des OpenGL Krams ist. So würde das in OpenGL ungefähr aussehen, ohne Berücksichtigung von Rotation und Skalierung: Code: [AUSKLAPPEN] glBegin(GL_LINE_LOOP)
glVertex2f(x, y) glVertex2f(x + width, y) glVertex2f(x + width, y + height) glVertex2f(x, y + height) glEnd() |
||
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die Antwort.
Zitat: wenn die Tiles dann alle einen Pixel auseinander liegen. Stimmt, also einfach ohne tile-versetzung das Raster zeichnen und fertig.
Zitat: sondern nur auf OSX Okay, dann hat sich die Frage wie das Codetechnisch aussehen würde schon geklärt, da der Editor bei mir auch Windows läuft ![]() Zitat: So würde das in OpenGL ungefähr aussehen, ohne Berücksichtigung von Rotation und Skalierung: Ich werde drauf zurückkommen, wenn ich mich entschieden haben, was ich machen will. ![]() 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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group