Hilfe bei 2d Drawing

Anfängerfragen zum Programmieren mit PureBasic.
smateja
Beiträge: 250
Registriert: 25.11.2004 19:51
Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS

Hilfe bei 2d Drawing

Beitrag von smateja »

Hallo zusammen - ich habe folgendes kleines Prop - ich willl mehrere linien unter einander darstellen in einem bestimmten abstand - und wenn ich nen button drücke sollen diese den abstand vergrößern - das klappt schon - nur zeiht es eine art "schliere" hinter sich her

code:

Code: Alles auswählen

InitSprite()
OpenWindow(691,0,0,800,600,"Zimmerplan",#PB_Window_ScreenCentered| #PB_Window_SystemMenu|#PB_Window_SizeGadget)
CreateGadgetList(WindowID(691))

OpenWindow(500,0,0,300,300,"Menü")
CreateGadgetList(WindowID(500))

ButtonGadget(500,0,0,100,20,"Spalte+")
ButtonGadget(501,0,21,100,20,"Spalte-")
ButtonGadget(502,0,42,100,20,"Zeile+")
ButtonGadget(503,0,63,100,20,"Zeile-")

zelle_h=20
zelle_b=20

Repeat

fenster_h = WindowHeight(691) 
fenster_b = WindowWidth(691)










;SmartWindowRefresh(691, 1) 

Event=WaitWindowEvent()

Select Event
       Case #PB_Event_Gadget
         Select EventGadget()
         
          Case 500 : zelle_b=zelle_b+1
          Case 501 : zelle_b=zelle_b-1
          Case 502 : zelle_h=zelle_h+1
          Case 503 : zelle_h=zelle_h-1

    EndSelect
  EndSelect


StartDrawing(WindowOutput(691))

DrawingMode(1)



Line(0,Zelle_h*1,800,0,black)
Line(0,Zelle_h*2,800,0,black)
Line(0,Zelle_h*3,800,0,black)
Line(0,Zelle_h*4,800,0,black)
Line(0,Zelle_h*5,800,0,black)
Line(0,Zelle_h*6,800,0,black)
Line(0,Zelle_h*7,800,0,black)
Line(0,Zelle_h*8,800,0,black)
Line(0,Zelle_h*9,800,0,black)
Line(0,Zelle_h*10,800,0,black)
Line(0,Zelle_h*11,800,0,black)
Line(0,Zelle_h*12,800,0,black)
Line(0,Zelle_h*13,800,0,black)
Line(0,Zelle_h*14,800,0,black)
Line(0,Zelle_h*15,800,0,black)
Line(0,Zelle_h*16,800,0,black)
Line(0,Zelle_h*17,800,0,black)




DrawText(500,580,"Z_H: "+Str(zelle_h))
DrawText(560,580,"Z_B: "+Str(zelle_b))
DrawText(620,580,"w_H: "+Str(fenster_h))
DrawText(680,580,"w_B: "+Str(fenster_b))




StopDrawing()


Delay(1)


Until Event = #PB_Event_CloseWindow
jemand ne idee wie man das refreshed - sodass man den verschmier-effekt nicht hat?!
PB 4.6 / 32 Bit / 64 Bit
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

Das lieght dadran, das der "hintergrund" nicht neu gezeichnet wird.
du malst zwar neue linien, aber löscht die alten nicht.
Du könntest zb eine große box als hintergrund malen
oder in ein Imagegadget Stecken, aber wenn du das alte image immer nur übermalst, hast du den selben effekt.
Und InitSprite() benötigst du nicht(ich weiß nicht, was du noch vorhast)
//edit: es gibt glaub ich auch einen befehl um das fenster zu refreshen

Und das:

Code: Alles auswählen

Line(0,Zelle_h*1,800,0,black) 
Line(0,Zelle_h*2,800,0,black) 
Line(0,Zelle_h*3,800,0,black) 
Line(0,Zelle_h*4,800,0,black) 
Line(0,Zelle_h*5,800,0,black) 
Line(0,Zelle_h*6,800,0,black) 
Line(0,Zelle_h*7,800,0,black) 
Line(0,Zelle_h*8,800,0,black) 
Line(0,Zelle_h*9,800,0,black) 
Line(0,Zelle_h*10,800,0,black) 
Line(0,Zelle_h*11,800,0,black) 
Line(0,Zelle_h*12,800,0,black) 
Line(0,Zelle_h*13,800,0,black) 
Line(0,Zelle_h*14,800,0,black) 
Line(0,Zelle_h*15,800,0,black) 
Line(0,Zelle_h*16,800,0,black) 
Line(0,Zelle_h*17,800,0,black)
kannst du einfach durch

Code: Alles auswählen

For i = 1 to 17
  Line(0,Zelle_h*i,800,0,black) 
next
ersetzen
Zuletzt geändert von a14xerus am 08.01.2007 22:49, insgesamt 1-mal geändert.
smateja
Beiträge: 250
Registriert: 25.11.2004 19:51
Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS

re:

Beitrag von smateja »

merci für den for next tipp - finde nur noch nicht den update befehl
PB 4.6 / 32 Bit / 64 Bit
Benutzeravatar
vonTurnundTaxis
Beiträge: 2130
Registriert: 06.10.2004 20:38
Wohnort: Bayreuth
Kontaktdaten:

Beitrag von vonTurnundTaxis »

Nimm lieber ein ImageGadget, in das du dein Bild packst.
Nicht durch Zorn, sondern durch Lachen tötet man
ClipGrab | Pastor - jetzt mit kurzen URLs!
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

wenn du es mit einem image und einem imagegadget machst, geht dir nur eben erstmal die hintergrundfarbe des fensters verloren, bzw, du musst sie selber bestimmten.

Code: Alles auswählen

;InitSprite() ; <<<<< ???

Global zelle_h=20
Global zelle_b=20
Global fenster_b=800
Global fenster_h=600

CreateImage(1, fenster_b,fenster_h) ; <<<<<< bild zum darauf zeichnen
OpenWindow(691, 0,0, fenster_b,fenster_h, "Zimmerplan",#PB_Window_ScreenCentered| #PB_Window_SystemMenu|#PB_Window_SizeGadget)
CreateGadgetList(WindowID(691))
  ImageGadget(1, 0,0, 800,600, ImageID(1) ) ; <<<<<<<<< das gadget nimmt das bild auf


OpenWindow(500,0,0,300,300,"Menü")
CreateGadgetList(WindowID(500))
  ButtonGadget(500,0,0,100,20,"Spalte+")
  ButtonGadget(501,0,21,100,20,"Spalte-")
  ButtonGadget(502,0,42,100,20,"Zeile+")
  ButtonGadget(503,0,63,100,20,"Zeile-")



Procedure neuZeichnen()
  StartDrawing( ImageOutput(1) )
    Box(0,0, fenster_b, fenster_b, $777777) ; <<< bild 
    DrawingMode(1)
    For i=1 To 17
      Line(0,Zelle_h*i, zelle_b*17,0, black)
    Next
    For i=1 To 17
      Line(zelle_b*i,0 ,0,zelle_h*17, black)
    Next
    DrawText(500,580,"Z_H: "+Str(zelle_h))
    DrawText(560,580,"Z_B: "+Str(zelle_b))
    DrawText(620,580,"w_H: "+Str(fenster_h))
    DrawText(680,580,"w_B: "+Str(fenster_b))
  StopDrawing()
  SetGadgetState(1,ImageID(1) ) ; << nach dem zeichnen dem imagegadget das bild neu zuweisen
EndProcedure

;WindowEvent()

Repeat
  ;SmartWindowRefresh(691, 1)
  
  Event=WaitWindowEvent()
  
  Select EventWindow()
  
    Case 691 ; fenster zimmerplan
    
      Select Event
        Case #PB_Event_SizeWindow ; <<<<<<<<< brauchst du nur immer dann machen,
          fenster_h = WindowHeight(691) ;      wenn sich die fenstergröße ändert.
          fenster_b = WindowWidth(691)
          ResizeImage(1, fenster_b,fenster_h) ; << bildgrösse an fesnter anpassen
          neuZeichnen() ; <<<<<<<<<< und bild aktualisieren
      EndSelect
      
    Case 500 ; fenster menu
    
      Select Event
        Case #PB_Event_Gadget
          Select EventGadget()
            Case 500
              zelle_b+1 ; <<<<<<<<<<< geht auch kürzer
              neuZeichnen()
            Case 501
              zelle_b-1
              neuZeichnen()
            Case 502
              zelle_h+1
              neuZeichnen()
            Case 503
              zelle_h-1
              neuZeichnen()
          EndSelect
      EndSelect
  EndSelect
  
  ;Delay(1)
Until Event = #PB_Event_CloseWindow

dein problem mit den 'schlieren' ist aber eigentlich nur, weil du den bild- bzw fenster-inhalt vor dem neuzeichnen nicht löschst. das hab ich hier mit dem Box(..) gemacht.

wenn du wirklich direkt auf das fenster zeichnen willst, dann mach das lieber bei dem event #PB_Event_Repaint, und nicht in jedem schleifendurchlauf. um den fenster-inhalt zu löschen hab ich hier RedrawWindow_(..) benutzt (..gefunden in einem post von ts-soft)

Code: Alles auswählen

;InitSprite() ; <<<<< ???

Global zelle_h=20
Global zelle_b=20
Global fenster_b=800
Global fenster_h=600

OpenWindow(691, 0,0, fenster_b,fenster_h, "Zimmerplan",#PB_Window_ScreenCentered| #PB_Window_SystemMenu|#PB_Window_SizeGadget)
;CreateGadgetList(WindowID(691))

OpenWindow(500,0,0,300,300,"Menü")
CreateGadgetList(WindowID(500))
  ButtonGadget(500,0,0,100,20,"Spalte+")
  ButtonGadget(501,0,21,100,20,"Spalte-")
  ButtonGadget(502,0,42,100,20,"Zeile+")
  ButtonGadget(503,0,63,100,20,"Zeile-")



Procedure neuZeichnen()
  StartDrawing( WindowOutput(691) )
    ;Box(0,0, fenster_b, fenster_b, $777777) ; <<< fensterinhalt löschen
    DrawingMode(1)
    For i=1 To 17
      Line(0,Zelle_h*i, zelle_b*17,0, black)
    Next
    For i=1 To 17
      Line(zelle_b*i,0 ,0,zelle_h*17, black)
    Next
    DrawText(500,580,"Z_H: "+Str(zelle_h))
    DrawText(560,580,"Z_B: "+Str(zelle_b))
    DrawText(620,580,"w_H: "+Str(fenster_h))
    DrawText(680,580,"w_B: "+Str(fenster_b))
  StopDrawing()
EndProcedure

;WindowEvent()

Repeat
  ;SmartWindowRefresh(691, 1)
  
  Event=WaitWindowEvent()
  
  Select EventWindow()
  
    Case 691 ; fenster zimmerplan
    
      Select Event
        Case #PB_Event_SizeWindow ; <<<<<<<<< brauchst du nur immer dann machen,
          fenster_h = WindowHeight(691) ;      wenn sich die fenstergröße ändert.
          fenster_b = WindowWidth(691)
          neuZeichnen() ; <<<<<<<<<< und bild aktualisieren
        Case #PB_Event_Repaint
          neuZeichnen()
      EndSelect
      
    Case 500 ; fenster menu
    
      Select Event
        Case #PB_Event_Gadget
          Select EventGadget()
            Case 500
              zelle_b+1 ; <<<<<<<<<<< geht auch kürzer
              RedrawWindow_(hWnd, 0, 0, #RDW_FRAME | #RDW_INVALIDATE | #RDW_ALLCHILDREN | #RDW_UPDATENOW | #RDW_INTERNALPAINT)
              neuZeichnen()
            Case 501
              zelle_b-1
              RedrawWindow_(hWnd, 0, 0, #RDW_FRAME | #RDW_INVALIDATE | #RDW_ALLCHILDREN | #RDW_UPDATENOW | #RDW_INTERNALPAINT)
              neuZeichnen()
            Case 502
              zelle_h+1
              RedrawWindow_(hWnd, 0, 0, #RDW_FRAME | #RDW_INVALIDATE | #RDW_ALLCHILDREN | #RDW_UPDATENOW | #RDW_INTERNALPAINT)
              neuZeichnen()
            Case 503
              zelle_h-1
              RedrawWindow_(hWnd, 0, 0, #RDW_FRAME | #RDW_INVALIDATE | #RDW_ALLCHILDREN | #RDW_UPDATENOW | #RDW_INTERNALPAINT)
              neuZeichnen()
          EndSelect
      EndSelect
  EndSelect
  
  ;Delay(1)
Until Event = #PB_Event_CloseWindow
[sorry für so viel code]
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Bei PB_Event_SizeWindow braucht es kein neuzeichnen, da automatisch
ein Paint Event erzeugt wird. Ausserdem sollte das Fensterhandle (hwnd)
gueltig sein (hwnd = openwindow[...] usw).

@smateja
Die Nummerierungen sollten immer mit 0 anfangen (oder halt #pb_any),
spart Speicher.
smateja
Beiträge: 250
Registriert: 25.11.2004 19:51
Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS

RE:

Beitrag von smateja »

merci an alle für die Beispiele - funktioniert 1A nun - muss nur nochmal in ruhe das nachvollziehen damit ich das verstanden habe.
PB 4.6 / 32 Bit / 64 Bit
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

@edel
ich war mir nicht sicher, ob die beiden events auch immer in der richtigen reihenfolge kommen, denn das zeichnen verwendet ja die veränderten variablen fenster_h und fenster_b. oder wird durch das SetGadgetSatet(..) ein repaint-event erzeugt ?
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten