tiles in einem rechteck drawen

  • GM 8
  • tiles in einem rechteck drawen

    Hallo,

    Ich versuche gerade, einen MapEditor zu machen(besonders für Tiles) und habe folgendes Problem:
    Ich will mitt der Maus ein Rechteck ziehen und mit Tiles ausfüllen. Ich habe also im Draw-Event diesen Code geschrieben(crx und cry sind die Maus-Koordinaten beim drücken):

    GML-Quellcode

    1. if(mouse_check_button(mb_left))
    2. draw_rectangle(crx,cry,mouse_x,mouse_y,1)
    3. if(mouse_check_button_released(mb_left))
    4. {
    5. for(i=0;i<(mouse_x-crx)/32*(mouse_y-cry)/32;i+=1)
    6. {
    7. tile_add(bg_tile,0,0,32,32,crx+i*32-floor(i*32/mouse_x-crx)*mouse_x-crx,cry+32*floor(i*32/(mouse_x-crx))*(mouse_x-crx),0)
    8. }
    9. }


    Jetzt wird das Rechteck zwar gezeichnet, die Tiles aber nicht. Ich hab früher schon ähnliche Probleme so ähnlich gelöst, aber jetzt krieg ich ichs nicht mehr hin. :headtouch:

    Bin für jede Hilfe dankbar.

    Mfg Alron
  • Ok also ich habe das mal ganz billig schnel mit einem Mosubutton event gestet.
    Mein Tilest war für den TEst ein 32x32 großes schwarzes Viereck.

    GML-Quellcode

    1. tile_add(tile1,0,0,32,32,mouse_x,mouse_y,1000)


    Mach einfach mal zum test deine ganze "Width und Hight"Rechnunge weg und mache einfach nur "mouse_x,mouse_y" um zu sehen on an der Maus überhaupt was gezeichent wird. Denn bei mir hat es funktioniert.
    Ich tippe

    Ps ich habe dein code auch mal shcnell ein zu ein getestet. Und bei mir kommt das Tilest. aber nur auf den x koordinaten. Also von links nach rechst. die Y werte stimmem also schon mal nicht.

    Aber es kommt auch nur etwas , wenn ich im create event cry und crx auf null stelle und das viereck also immer von X=0 und Y=0 gezeichnet wird. muss leider jetzt zur fahrschule. aber ich schau später noch mal rein
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • Hi,
    also, ich hab den Code jetzt ein bisschen umgeschrieben und jetzt werden die y-Koordinaten richtig gezeichnet, die x-Koordinaten aber nicht.
    Das mit crx und cry funktioniert auch nicht richtig, wie du gesagt hast.

    Hier mal die .gmk Datei:

    tile_problem.zip

    Mfg Alron
  • Ich arbeite noch an dem Problem. Hab es auch fast.
    JEdoch ist meon code nicht so unübesichtlich.

    GML-Quellcode

    1. draw_sprite(spr_cursor,-1,x,y)
    2. /*tile_add(tile1,0,0,32,32,mouse_x,mouse_y,1000)
    3. */
    4. if(mouse_check_button(mb_left))
    5. draw_rectangle(crx,cry,x,y,1)
    6. if(mouse_check_button_released(mb_left))
    7. {
    8. for(i=0;i<((x-crx)/32)*((y-cry)/32);i+=1)
    9. {
    10. tile_add(tile1,0,0,32,32,crx+(i*32),cry+(i*32),0)
    11. }
    12. }
    Alles anzeigen


    Ich teste das immer mit einem Viereck von 2x2 "also 64x64 Pixel.
    Jedoch geht es bei mir nicht in die zweite reich nach den ersetn 2 Tilsete und zeichen daher 4 hinter einander wagerecht. Da muss noch was an der i.Variable rum gerechnet werden um zu wissen wanne es bei y +1 rechnet werden muss, um in die nächste zeile zu kommen


    Nachtrag. Auf jeden fall brauch man 2 ivariablen. Um einfach bei ereichter x länge des Vierecks , auf die nächste zeile zu sprine. soll heißen wenn das viereck 4 brait ist. soll die 2 variable +1 gemacht werdej, für den y wert und dann geht es von vorne los um die nächste reich zu füllen. Hab nur jetzt keine lust das noch zu machen. Aber so müste dann die lösung sein
    Meine Signatur hat kein Visum für das GM Forum erhalten.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von x-sascha ()

  • Ich hab jetzt alles noch mal getestet und angeschaut und hab gemerkt dass alle variablen stimmen, es geht trotzdem nicht. Die x-koordinaten gehen jetzt, die y-koordinaten dafür nicht mehr. Macht mann es so wie im example funktionieren zwar die y-koordinaten aber dafür nicht die x.
    Es ist zum verrücktwerden. :cursing: :headtouch:
    Hier jetzt der neue Code im Draw-Event:

    GML-Quellcode

    1. var h1,h2,h3,h4,h5,h6,h7,h8;
    2. h1 = 0
    3. h2 = tileselect_x-tileselected_x
    4. h3 = tileselect_y-tileselected_y
    5. h6 = 0
    6. h7 = 0
    7. h8 = 0
    8. if(mouse_rect(a,b,c-270,d-200))
    9. {
    10. if(mouse_check_button_pressed(mb_left))
    11. {
    12. if(werkzeug = 0)
    13. ac_tile = tile_add(used_tileset,tileselected_x+1,tileselected_y,h2,h3,round32(mouse_x),round32(mouse_y),0)
    14. }
    15. if(werkzeug = 1)
    16. {
    17. if(mouse_check_button(mb_left))
    18. draw_rectangle_color(crx,cry,round32(mouse_x),round32(mouse_y),c_red,c_red,c_red,c_red,1)
    19. if(mouse_check_button_released(mb_left))
    20. {
    21. h4 = round32(mouse_x)-crx
    22. h5 = round32(mouse_y)-cry
    23. for(i=0;i<(h4/h2)*(h5/h3);i+=1)
    24. {
    25. h6 = crx+i*h2-floor(i*h2/h4)*h2*h4
    26. h8 = cry+32*floor(i*h2/h4)
    27. h1 = tile_add(used_tileset,tileselected_x+1,tileselected_y,h2,h3,h6/*crx+(i*h2)-floor(i/h2)*h2*/,h8/*cry+h3*floor(i/(h4/h2))*/,0)
    28. h7 = h8
    29. }
    30. show_message(string(h7))
    31. }
    32. }
    33. }
    Alles anzeigen


    round32 rundet eine Zahl immer auf 32(wegen meinem Raster)
    h2 und h3 sind einfach der Ausschnitt aus dem Tileset
    used_tileset ist das Tileset aus dem der Ausschnitt genommen wird
    werkzeug gibt an ob die tiles eben im rechteck gedrawt werden oder ob nur eins gedrawt wird
    mouse_rect gibt an ob die Maus in einem Bereich ist

    und @ x-sascha: das mit der zweiten i-variable versteh ich irgendwie nicht(for-Schleife in einer for-Schleife ist ja auch nicht gerade das Beste für die Geschwindikeit.)
  • Also erstmal brauchst du nicht so viele variable wie bei dir . aber das ist ja egal. Solange du klar kommst geht das ja.

    Was ich meine mit der 2 Variable meinte, ist folgendes. Wenn die x reihe voll ist. muss man doch in die 2y reihe runter gehen um die nächste x reiche mit dem Tileset zu füllen bis zum Rand.
    AB da ,dann wieder eine y reihe runter.

    Soll heißen wenn man ein variabe für x und y nimmt alos für die werte x-crx und y-cry dann könnte man wenn der x-crx wert ereicht ist den i2 wert +1 setzten, der für die y schleife verantwortlich ist.
    Beispiel.
    Vier eck. 4x4. Das heist es sollen nach x feldern(Tilsets) wieder von vorne angefangen werden und das ein reihe tierfe. Also ist in diesem fall die maximale zu zeichnende breite 4. "die max erste i Variable

    Nun soll also immer bei "If i=4 then {i=0;i2+=1}
    Und das immer so weiter und so weiter, bis der i2 Wert auch seine maximum erreicht hat. Das wäre dann auch 4, da das vier Test viereck hier 4x4 Tileset felder ist. Das muss dann natürlich noch mit deiner raster größe mal genommen werden. zb 32, wie du ja selber hattest.

    Hoffe das war einleutender.

    PS das geht auch mit einer Variabel aber nur halt, wenn beide Seiten des Vierecks gleich sind. was aber nicht immer der fall sein wird im Karten editor.
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • Also, ich habs probiert, das geht einigermassen. So werd ichs wahrscheinlich machen, thx.
    Allerdings hat es in diesem Code ein paar Fehler die ich nicht finde, die Tiles werden nicht schön im Rechteck gezeichnet :( :

    GML-Quellcode

    1. var h1;
    2. h1 = 0
    3. if(mouse_check_button(mb_left))
    4. draw_rectangle(0,0,round32(mouse_x),round32(mouse_y),1)
    5. if(mouse_check_button_released(mb_left))
    6. {
    7. for(i=0;i<round32(mouse_x)/32*round32(mouse_y)/32;i+=1)
    8. {
    9. if(i*32>round32(mouse_x)+h1*round32(mouse_x))
    10. h1 += 1
    11. tile_add(background0,0,0,32,32,round32(i*32-h1*mouse_x),h1*32,0)
    12. }
    13. }
    Alles anzeigen


    round32 rundet ab auf 32
  • Benutzer online 1

    1 Besucher