verzögerter Bildaufbau (Pong)

Anfängerfragen zum Programmieren mit PureBasic.
Freizeitcoder
Beiträge: 35
Registriert: 24.09.2009 13:31
Wohnort: München

verzögerter Bildaufbau (Pong)

Beitrag von Freizeitcoder »

Morgen zusammen,

zur Übung bin ich gerade dabei einen Pong-Clon zu erstellen. Mit der Maus kann man die Spielerbalken steuern. Dabei fällt folgendes auf: Wenn ich den Spielerbalken in seine obere Endposition bewege, fängt er an zu Blinken bzw Flattern. Ich kann mir dieses Verhalten nicht erklären, zumal es wirklich nur in den oberen Reihen passiert. Kennt vielleicht jemand das Problem schon, und kann mir einen Rat geben?
Danke

Code: Alles auswählen

;_______________Konstanten
#window_w = 800
#window_h = 600

Enumeration
#window
#button1
#image
#image_g
EndEnumeration

;_______________Variablen
Global gamemode = 1  ;0-Anfang / 1-Spiel / 2-Credits und Quit 

;_______________Struktures
Structure player_container
	pos_y.f 
	pos_x.f
EndStructure
Global Dim player.player_container(2)
player(1)\pos_y = #window_h/2
player(1)\pos_x = 25

player(2)\pos_y = #window_h/2
player(2)\pos_x = #window_w-50

;_______________Init DirectX
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Error", "Can't init DirectX!", 0)
  End
EndIf

;_______________Fenstererstellung
OpenWindow(#window, 0, 0, #window_w, #window_h, "2D Drawing Test",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered) 
OpenWindowedScreen(WindowID(#window),0,0,#window_w,#window_h,0,0,0)

;_______________Procedures
Procedure move()	
	player(1)\pos_y = MouseY()
	If player(1)\pos_y <= 0 
		player(1)\pos_y = 0
	EndIf
	If player(1)\pos_y >= #window_h-100 
		player(1)\pos_y = #window_h-100
	EndIf	
EndProcedure

Procedure draw()
	Box(player(1)\pos_x,player(1)\pos_y,25,100,RGB(240, 170, 15))
	Box(player(2)\pos_x,player(2)\pos_y,25,100,RGB(66, 12, 79))
EndProcedure

;_______________Framerate
SetFrameRate(60)

;_______________Mouse auf mitte
MouseLocate(#window_w/2,#window_h/2)

;_________________________________________________________________________Hauptschleife
Repeat	
	ExamineKeyboard()     		; Tastatur aktivieren
	ExamineMouse()				; Mouse aktivieren	
   	ClearScreen(RGB(0,0,0))    	; Bildschirm saeubern und Zeichnungsabteilung	       
	StartDrawing(WindowOutput(#window))	

	move()
	draw()
	
	StopDrawing() 
	FlipBuffers()         		; Den Buffer wechseln
	If KeyboardReleased(#PB_Key_Escape)
		gamemode = 2
	EndIf
Until gamemode = 2
End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: verzögerter Bildaufbau (Pong)

Beitrag von Kaeru Gaman »

bei mir flackert nix... :|
aber wenn ich ne Maustaste drücke, hängt das Prog sich auf, keine Ahnung wieso.
hab XPpro, was hast du?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: verzögerter Bildaufbau (Pong)

Beitrag von DarkDragon »

Hallo,

Bei mir flackert auch nichts. Hast du irgendwelche besonderen Einstellungen wie z.B. Vertikale Synchronisation verändert in deinen Grafikkarteneinstellungen?
Kaeru Gaman hat geschrieben:aber wenn ich ne Maustaste drücke, hängt das Prog sich auf, keine Ahnung wieso.
Wegen der fehlenden Ereignisbehandlung. Dann meint Windows das Programm reagiert nichtmehr und unterbindet jedes Zeichnen darauf.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: verzögerter Bildaufbau (Pong)

Beitrag von Kaeru Gaman »

oy! stimmt, wie konnte ich das übersehen...

@Freizeitcoder

da fehlt ein (Wait)WindowEvent in deiner Hauptschleife.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Freizeitcoder
Beiträge: 35
Registriert: 24.09.2009 13:31
Wohnort: München

Re: verzögerter Bildaufbau (Pong)

Beitrag von Freizeitcoder »

das "(Wait)WindowEvent " habe ich extra entfernt. Ich habe im ursprünglichen Programm einen Ball der sich bewegt. Dies tut er allerdings nur wenn ich die Maus bewege! Also immer nur in dem Moment wo ein WindowEvent statt findet. Ich werde später wieder ein WindowEvent einfügen (ohne Wait).

Ich programmiere auf einem Laptop 1280x800 32bit 60hz. Könnte es vielleicht daran liegen, daß ich noch die Demo nutze?
(Ich verwende die original IDE von Pure)

Gruß
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: verzögerter Bildaufbau (Pong)

Beitrag von DarkDragon »

Dann nimm WindowEvent, das blockt nicht. Oder WaitWindowEvent(timeout) + ElapsedMilliseconds() für die Bewegungen des Balls.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Freizeitcoder
Beiträge: 35
Registriert: 24.09.2009 13:31
Wohnort: München

Re: verzögerter Bildaufbau (Pong)

Beitrag von Freizeitcoder »

ja, so werde ich das wohl handhaben.

Aber um auf den Grund meiner Frage zurück zu kommen. Hat jemand eine Idee warum der Spielerbalken im oberen Bereich des Fensters nicht korrekt gezeichnet wird? Blöd ist auch, daß es nicht bei allen Personen auftritt. Das macht die Fehlersuche schwer.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: verzögerter Bildaufbau (Pong)

Beitrag von Kurzer »

Ich hab jetzt gerade kein PB zur Hand, aber kann man bei FlipBuffers nicht auch einen Parameter angeben, der für die vertikale Sycronisation zuständig ist?
Vielleicht hat es damit zu tun?
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: verzögerter Bildaufbau (Pong)

Beitrag von Andesdaf »

Kurzer hat geschrieben:Ich hab jetzt gerade kein PB zur Hand, aber kann man bei FlipBuffers nicht auch einen Parameter angeben, der für die vertikale Sycronisation zuständig ist?
Ja, gibt's.
Win11 x64 | PB 6.20
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: verzögerter Bildaufbau (Pong)

Beitrag von Kaeru Gaman »

... allerdings ist #PB_Screen_WaitSynchronization der Vorgabewert,
es ist also VSync'ed, wenn man nichts angibt.


... aber grad seh ich etwas äußerst Spanisches

Code: Alles auswählen

 StartDrawing(WindowOutput(#window)) 
nimm doch mal das Output das dran ist, also Draw auf den Screen und nicht aufs Fenster, dann hört das Flackern wahrscheinlich auf.

... dass es bei mir nicht flackert liegt womöglich einfach daran, dass meine Mühle schneller ist.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten