Geflimmer

Anfängerfragen zum Programmieren mit PureBasic.
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Geflimmer

Beitrag von PB42 »

Hallo,

folgender Colde zeigt eine Klavier-Tatstatur über eine F-Dur-Oktave. Warum flimmert das Bild, wenn man mit der Maus über das Fenster geht? Wenn man das Fenster bei gedrückter Maustaste verschieben will (blaue Leiste), verschwinden übrigens alle Klaviertasten. Das schlimmste aber ist dieses Geflimmer. Wie kann das abgestellt werden? Danke.

Code: Alles auswählen

InitSprite()
OpenWindow(0,0,0,800, 600,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget,"")
OpenWindowedScreen(WindowID(0), 20, 120, 407, 200, 0, 0, 0)

Repeat
  eventID = WaitWindowEvent()
   
  StartDrawing(WindowOutput())  
    FrontColor(255,255,255)
    Box(20,120,50,200)
    Box(71,120,50,200)
    Box(122,120,50,200)
    Box(173,120,50,200)
    Box(224,120,50,200)
    Box(275,120,50,200)
    Box(326,120,50,200)
    Box(377,120,50,200)
    
    FrontColor(0,0,0)
    Box(50,120,40,125)
    Box(101,120,40,125)
    Box(152,120,40,125)
    
    Box(254,120,40,125)
    Box(305,120,40,125)  
  StopDrawing()
  
  Delay(1)
Until eventID = #PB_EventCloseWindow
PB42

P.S.: Kann man bei PB irgendwie das Muß abstellen, immer erst diesen blöden Totenkopf klicken zu müssen, bevor man weiter an dem Source arbeiten kann, nachdem es eine Fehlermeldung gab?
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Geflimmer

Beitrag von HeX0R »

PB42 hat geschrieben:P.S.: Kann man bei PB irgendwie das Muß abstellen, immer erst diesen blöden Totenkopf klicken zu müssen, bevor man weiter an dem Source arbeiten kann, nachdem es eine Fehlermeldung gab?
Ja, keine Fehler machen :mrgreen:
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Beitrag von PB42 »

D :D s ist w :D hr!
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

1. Mach statt WindowOutput() ScreenOutput(). Die Zeichenfläche, die du auf einem Fenster mit OpenWindowedScreen() erstellst,wird mit ScreenOutPut() angesprochen.

2. Du hast kein ClearScreen()! Das heißt die Zeichenfläche wird nicht gelöscht!

3. Du hast kein FlipBuffers()! Das heißt das was du zeichnest wird nicht gezeichnet!

gr33tz
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Code: Alles auswählen

InitSprite()
OpenWindow(0,0,0,800, 600,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget,"")
OpenWindowedScreen(WindowID(0), 20, 120, 407, 200, 0, 0, 0)

Repeat
  eventID = WaitWindowEvent()
  
  StartDrawing(ScreenOutput()) 
  Box(0,0,407,200,RGB(22,25,255))
  FrontColor(255,255,255)
  
  Box(20,120,50,200)
  Box(71,120,50,200)
  Box(122,120,50,200)
  Box(173,120,50,200)
  Box(224,120,50,200)
  Box(275,120,50,200)
  Box(326,120,50,200)
  Box(377,120,50,200)
  
  FrontColor(0,0,0)
  Box(50,120,40,125)
  Box(101,120,40,125)
  Box(152,120,40,125)
  
  Box(254,120,40,125)
  Box(305,120,40,125) 
  StopDrawing()
  
  Delay(1)
Until eventID = #PB_EventCloseWindow
Purebasic 5.0 32bit und 64 bit

I'm back from hell
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Beitrag von PB42 »

Danke, das mit dem ScreenOutput() klappt gut und das Geflimmer ist weg, aber nun sollen die Klaviertasten auch noch mit der Maus angesprochen werden können. Dazu habe ich den Source etwas verändert, sodaß sich spaßeshalber eine weitere weiße Taste ganz rechts bilden soll, wenn man die erste weiße Taste links anklickt. Ich kriege das nur so hin, wie jetzt der Code ist, nämlich mit ExamineMouse(), aber köstlicherweise ist dann überhaupt kein Mauszeiger mehr zu sehen und mit Loadsprite und DisplayTransparentSprite kriege ich auch kein Fadenkreuz oder dergleichen auf die Mattscheibe. Ich weiß da nicht weiter. Danke für Infos.

Code: Alles auswählen

InitSprite()
InitMouse()
OpenWindow(0,0,0,800,600,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget,"")
OpenWindowedScreen(WindowID(0), 0, 0, 407, 200, 0, 0, 0)
LoadSprite(0,"Bilder\Maus.bmp") 

Repeat
ExamineMouse()
  eventID = WaitWindowEvent()
  
    ClearScreen(0,0,0)
    StartDrawing(ScreenOutput())
    FrontColor(255,255,255)
    Box(0,0,50,200)
    Box(51,0,50,200)
    Box(102,0,50,200)
    Box(153,0,50,200)
    Box(204,0,50,200)
    Box(255,0,50,200)
    Box(306,0,50,200)
    Box(357,0,50,200)
    
    FrontColor(0,0,0)
    Box(32,0,36,130)
    Box(83,0,35,130)
    Box(134,0,35,130)
    
    Box(235,0,35,130)
    Box(286,0,35,130)  
  StopDrawing()
  FlipBuffers()
  
  If MouseButton(1) And MouseX() > 0 And MouseX() < 50 And MouseY() > 0 And MouseY() < 200
  StartDrawing(WindowOutput())
  FrontColor(0,0,0)
  Box(408,0,50,200)  
  StopDrawing()
  EndIf  
  
  
  Delay(1)
Until eventID = #PB_EventCloseWindow
PB42
Zuletzt geändert von PB42 am 10.12.2005 17:40, insgesamt 1-mal geändert.
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

@PB42
wenn du nicht unbedingt directx brauchst, mach es doch einfach so:

Code: Alles auswählen

If OpenWindow(0,0,0,800, 600,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget,"")
  
  If CreateGadgetList(WindowID(0))
    If CreateImage(0, 407, 200)
      If StartDrawing(ImageOutput())
        FrontColor(255,255,255)
        Box(0,0,50,200)
        Box(51,0,50,200)
        Box(102,0,50,200)
        Box(153,0,50,200)
        Box(204,0,50,200)
        Box(255,0,50,200)
        Box(306,0,50,200)
        Box(357,0,50,200)
        FrontColor(0,0,0)
        Box(30,0,40,125)
        Box(81,0,40,125)
        Box(132,0,40,125)
        Box(234,0,40,125)
        Box(285,0,40,125)
        StopDrawing()
      EndIf
      ImageGadget(0, 20, 120, 407, 200, UseImage(0))
    EndIf
  EndIf
  
  Repeat
    EventID = WaitWindowEvent()
  Until EventID = #PB_EventCloseWindow
  
EndIf
p.s.: wozu das Delay(1)?! du verwendest doch sowieso WaitWindowEvent().

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Beitrag von PB42 »

Danke, das Delay ist überflüssig. Ich habe Deinen Code ausprobiert: Die Tasten blitzen kurz auf und dann sind sie auch schonwieder weg.

PB42
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

@PB42
nö brauchst du nicht, deswegen erstelle ich ja das image mit CreateImage() und zeichne direkt darauf mir StartDrawing(ImageOutput()) : StopDrawing(). aber komisch, dass es bei dir nicht geht. :?

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Beitrag von PB42 »

Ich hab's nochmal geladen und jetzt läuft's plötzlich richtig. Das mit dem CreateImage() wußte ich noch nicht, sehr praktisch. :allright:

PB42
Antworten