Seite 1 von 1

Verschachteltes Zeichnen in einem Fenster

Verfasst: 11.07.2010 01:44
von Rubiko
Hallo,

ja nach langer Zeit melde ich mich mal wieder... und direkt wieder mit einem Problem.

Irgendwie hab ich es nicht so mit verschachtelten For-Schleifen, ich hoffe ihr könnt mir weiterhelfen:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 640, 480, "Test", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
  
;   For lImage = 1000 To 1001
;     LoadImage(lImage, Str(lImage)+".bmp")
;   Next lImage
  
  If CreateImage(1000, 32, 32)
    If StartDrawing(ImageOutput(1000))
      Box(0, 0, 32, 32, RGB(0, 0, 255))
      StopDrawing()
    EndIf
  EndIf
  If CreateImage(1001, 32, 32)
    If StartDrawing(ImageOutput(1001))
      Box(0, 0, 32, 32, RGB(0, 255, 0))
      StopDrawing()
    EndIf
  EndIf
  
  If CreateImage(0, 620, 460)
    If StartDrawing(ImageOutput(0))
      
      For x=0 To 5 ; 17
        For y=0 To 5 ; 14
          DrawImage(ImageID(Random(1)+1000), x*32+TileStep, y*32)
          c=c+2
        Next y
        TileStep=TileStep+2
        
      Next x
      
      
      
;       For t = 1 To 14
;         Box(0, 32*t+LineStept, 620, 3, RGB(255, 0, 0))
;         LineStept=LineStept+2
;       Next
;       
;       For v=1 To 18
;           Box(32*v+LineStepv, 0, 3, 460, RGB(255, 0, 0))
;           LineStepv=LineStepv+2
;       Next v
      
      
      StopDrawing()
    EndIf
  EndIf
  
  ImageGadget(0, 10, 10, 620, 460, ImageID(0))
  

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow Or GetAsyncKeyState_(#VK_ESCAPE)
  EndIf
End
Die Funktion zum Laden der Grafiken habe ich mal auskommentiert und die Grafiken stattdessen mit CreateImage erstellt, damit der Code direkt lauffähig ist.
Testweise ist hier nur ein kleiner Zeichenbereich.

Nun zum Problem:
Ich will die Tiles mit einem Art Gitternetz zeichnen. Das ganze soll ein Map Editor werden und rote Linien sollen zwischen den Tiles gezeichnet werden, damit das ganze übersichtlicher ist. Soweit so gut - beim Gitter klappt es, aber ich schätze auch hier nur aus einem Grund: Ich zeichne die x- und y-Linien getrennt. Verschachtelt hab ich es nicht hinbekommen.
Beim Versuch die Grafiken verschachtelt anzuzeigen zeigen sich auch eher merkwürdige Effekte, wie z.B., dass die Grafiken treppenartig absteigend nach rechts angezeigt werden, wenn man den TileStep zur y-Koordinate hinzuaddiert.
Wie kriege ich es richtig hin, oder ist das garnicht möglich?

Zweite Frage:
Ich bin mal davon ausgegangen, dass ein einzelnes Gadget auf dem rumgezeichnet wird hierfür deutlich praktischer ist als mehrere Gadgets für jedes einzelne Tile, liege ich richtig?


Grüße und Danke im Voraus,
Rubiko

Re: Verschachteltes Zeichnen in einem Fenster

Verfasst: 11.07.2010 02:00
von STARGÅTE
allgemeint kannst du sowas hier:

Code: Alles auswählen

      For t = 1 To 14
        Box(0, 32*t+LineStept, 620, 3, RGB(255, 0, 0))
        LineStept=LineStept+2
      Next
vereinfachen zu

Code: Alles auswählen

      For t = 1 To 14
        Box(0, 34*t-2, 620, 3, RGB(255, 0, 0))
      Next
denn LineStept wächst mit jedem t um 2, also kannst du gleich auf die 32 , 2 hinzu addieren.
da du erst nach dem ersten anfängt, noch mal -2 damits verschoben bleibt.

Desweiteren nehme ich mal an, dass wenn du 3px dicke Linien zeichens zwischen denen du 32px Grafiken liegen dann auch diese Linien immer 3px mehr verschoben sind und nicht nur 2.

Ja auch die Linien gehen in eine Schleife.

Am Ende ergibt sich folgender Code:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 640, 480, "Test", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
  
;   For lImage = 1000 To 1001
;     LoadImage(lImage, Str(lImage)+".bmp")
;   Next lImage
  
  If CreateImage(1000, 32, 32)
    If StartDrawing(ImageOutput(1000))
      Box(0, 0, 32, 32, RGB(0, 0, 255))
      StopDrawing()
    EndIf
  EndIf
  If CreateImage(1001, 32, 32)
    If StartDrawing(ImageOutput(1001))
      Box(0, 0, 32, 32, RGB(0, 255, 0))
      StopDrawing()
    EndIf
  EndIf
  
  If CreateImage(0, 620, 460)
    If StartDrawing(ImageOutput(0))
      
      For x=0 To 5
        For y=0 To 5
          DrawImage(ImageID(Random(1)+1000), x*(32+3), y*(32+3))
        Next y
      Next x
      
      
      
      For t = 1 To 18
        Box(0, (32+3)*t-3, 620, 3, RGB(255, 0, 0))
        Box((32+3)*t-3, 0, 3, 460, RGB(255, 0, 0))
      Next

      
      StopDrawing()
    EndIf
  EndIf
  
  ImageGadget(0, 10, 10, 620, 460, ImageID(0))
  

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow Or GetAsyncKeyState_(#VK_ESCAPE)
  EndIf
End


alle (32+3) kannst du dann selber zu 35 machen, nur sihest du bei 35 halt nicht wie sie zustande kamen ^^
und vllt willst du ja LinienDicke und Kachelgröße flexibel halten.

Re: Verschachteltes Zeichnen in einem Fenster

Verfasst: 11.07.2010 02:54
von Rubiko
Die gute Mathematik, warum bin ich nicht auf sowas gekommen?
Vielen Dank!