Hallo,
ich habe ein problem mit dem "Backpuffer".
Will nähmlich, da ich noch ein anfänger bin, das Spiel PingPong nachbauen. Nichts aufwendiges, nur um die basics von GDI+ zu verstehen.
So nun zum problem:
das Programm erzeugt den Ball, löscht Ihn aber nicht mehr.
habe das Programm auf Grundlage eines Tutorials programmiert, habe deswegen auch noch einige fragen zu gewissen Funktionen. Darauf würde ich aber später nochmal genauer eingehen.
Außerdem hat das programm eine CPU-Auslastung von 25% (bei einem 4-kern)
Könnt Ihr bitte mal schauen was da nicht stimmt.
Vllt habt Ihr auch noch Tipps wie ich den Code minimieren kann oder auch verbessern.
Danke
Spoiler anzeigen
C
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <Misc.au3>
#Include <GDIPlus.au3>
$dll = DllOpen("user32.dll")
_GDIPlus_Startup()
Global $GuiBreite = 400, $GuiHoehe = 400 ;GuiGröße
Global $BallBreite = 10, $BallHoehe = 10 ;Größe des Balles
Global $WPos = ($GuiBreite / 2) - ($BallBreite / 2), $HPos = ($GuiHoehe / 2) - ($BallHoehe / 2) ;Starposition für Ball
Global $back = "True", $Down = "True" ;Für das automatische zurückhüpfen des balles
Global $GeschBreite = 0.07, $GeschHoehe = 0.06 ;Wie weit/Schnell der Ball sich bewegt
Opt("GUIOnEventMode", 1)
OnAutoItExitRegister("Shutdown_GDI") ;Führt die funktion aus, sobald das Prog beendet wird
$MainGUI = GUICreate("Game",$GuiBreite,$GuiHoehe) ;hauptfenster wird erzeugt
$Testbild = _GDIPlus_GraphicsCreateFromHWND($MainGUI) ;Grafische Oberfläche wird erzeugt
$Table = _GDIPlus_BitmapCreateFromGraphics($GuiBreite, $GuiHoehe, $MainGui)
$Backbuffer = _GDIPlus_ImageGetGraphicsContext($Table)
GUISetOnEvent(-3, "_Exit")
GUIRegisterMsg($WM_PAINT,"WM_PAINT") ;Funktion mir noch nicht genau bekannt (War in ner Tut so drin :) )
Guisetstate()
while 1
_GDIPlus_GraphicsClear($Table, 0xFF000000) ;Sollte eig die Grafische oberfläche "reinigen"
_GDIPlus_GraphicsFillCircle() ;Erzeugt den kreis
_WinAPI_RedrawWindow($MainGui, 0, 0,$RDW_INTERNALPAINT)
BallMoveW()
BallMoveH()
;~ sleep(1)
If _IsPressed("28", $dll) Then
$HPos = $HPos + 2
EndIf
If _IsPressed("26", $dll) Then
$HPos = $HPos - 2
EndIf
If _IsPressed("27", $dll) Then
$WPos = $WPos + 2
EndIf
If _IsPressed("25", $dll) Then
$WPos = $WPos - 2
EndIf
PosTestBreite()
PosTestHoehe()
$msg = GUIGetMsg()
Select
Case $msg = $Gui_Event_Close
Exit
EndSelect
Wend
;Funktionen--------------------------------------------------------------------------------------
Func WM_PAINT()
_GDIPlus_GraphicsDrawRect($Testbild,$WPos,$HPos,$BallBreite,$BallHoehe)
;~ _GDIPlus_GraphicsDrawImageRect($Table,$Testbild,0,0,$GuiBreite,$GuiHoehe)
Return $GUI_RUNDEFMSG
EndFunc
Func BallMoveH()
if $HPos = $GuiHoehe - $BallHoehe Then
$down = "True"
EndIf
if $HPos = 0 then
$down = "False"
EndIf
if $down = "True" Then
$HPos = $HPos - $GeschHoehe
EndIf
if $down = "False" Then
$HPos = $HPos + $GeschHoehe
EndIf
EndFunc
Func BallMoveW()
if $WPos = $GuiBreite - $BallBreite Then
$back = "True"
EndIf
if $WPos = 0 then
$back = "False"
EndIf
if $back = "True" Then
$WPos = $WPos - $GeschBreite
EndIf
if $back = "False" Then
$WPos = $WPos + $GeschBreite
EndIf
EndFunc
Func PosTestBreite()
If $WPos > $GuiBreite - $BallBreite then
$WPos = $GuiBreite - $BallBreite
EndIf
If $WPos < 0 then
$WPos = 0
EndIf
EndFunc
func PosTestHoehe()
If $HPos > $GuiHoehe - $BallHoehe then
$HPos = $GuiHoehe - $BallHoehe
EndIf
If $HPos < 0 then
$HPos = 0
EndIf
EndFunc
Func _GDIPlus_GraphicsFillCircle()
_GDIPlus_GraphicsFillEllipse($MainGui, 2, 2, 10, 10)
EndFunc ;==>_GDIPlus_GraphicsFillCircle
Func Shutdown_GDI()
_GDIPlus_ImageDispose($Testbild)
_GDIPlus_BitmapDispose($Table)
_GDIPlus_Shutdown()
EndFunc ;==>__GDIPlus_Shutdown
Func _Exit()
Exit
EndFunc ;==>_Exit
Alles anzeigen
]