GDI+ Pacman Abwandlung

  • Hallo ihr da draußen....

    Es ist schon ein weilchen her, das ich hier ein Script veröffentlicht habe (Ich stell die selten Online, weil es meistens eindfach welche für mich sind, welche die Welt nicht braucht)

    Ich wollte ja was mit GDI+ machen, und da ich etwas Langeweile , und ein Beispiel-GDI+ Script von name22 hatte, dachte ich, ich mache etwas Pacman mäßiges...

    Die KI von dem Blinky Monster hat EM gemacht (@EM: ich musste noch etwas dran ändern, weils sonst ein wenig gelaggt hatte) deswegen :thumbup: @EM ads er sich die Zeit genommen hatte...

    Allgemeine Information: Das ist mein erstes richtiges GDI+ Script (Die analoguhr zählt nciht, das war zu 90% name22) ist es ein entsprechender Spagetticode :rolleyes: Also nicht wundern... wie in der Grundschule: erst Schreiben lernen, dann schönschreiben...

    Beiliegend ist der Code, der coder für die Exe mit den Fileincludes etc. , eine .exe x86 und die Grafiken Wer so zu faul für den Download ist:

    Für alle Faulen Menschen
    [autoit]

    #include <GUIConstants.au3>
    #include <GDIPlus.au3>
    #include <Misc.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $TimerInit = TimerInit()
    Global $Richtung = Random(1, 4, 1)
    $dll = DllOpen("user32.dll") ;Öffnet die DLL für die _IsPressed Funktion

    [/autoit] [autoit][/autoit] [autoit]

    Global $iX1 = 200 ;X Koordinate der Startposition des Spielers
    Global $iY1 = 120 ;Y Koordinate der Startposition des Spielers
    Global $Speed = 1 ;Geschwindigkeit des Spielers in Pixeln pro Bewegung

    [/autoit] [autoit][/autoit] [autoit]

    Global $MinX = 72 ;Legt das linke Ende des Raums fest
    Global $MaxX = 72 + 356; - 12 ;Legt das rechte Ende des Raums fest
    Global $MinY = 56 ;Legt das obere Ende des Raums fest
    Global $MaxY = 56 + 297 ;- 20 ;Legt das untere Ende des Raums fest
    Global $coinx = Random($MinX + 16, $MaxX - 16, 1)
    Global $coiny = Random($MinY + 16, $MaxY - 16, 1)
    Global $coinsgesammelt = 0
    Global $sString = "Punkte:"
    Global $bewegungsrichtug = "right"
    Global $monster_pos_x = 400
    Global $monster_pos_y = 200
    Global $monsterspeed = 2

    [/autoit] [autoit][/autoit] [autoit]

    $hWnd = GUICreate("SeaGullPacman - Copyright by Jonathan Möwe", 625, 443)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(625, 443, $hGraphic) ;Erstellt eine Bitmap aus der Grafik "Zeuchenfläche" in der Variable
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap) ;Ordnet dieser Bitmap Grafik Eigenschaften zu damit hineingezeichnet werden kann

    [/autoit] [autoit][/autoit] [autoit]

    ;~ _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2) ;Glättet die Kanten der Objekte in einer Grafik
    _GDIPlus_GraphicsClear($hGraphic, 0xFFF0F0F0) ;Füllt eine Grafik komplett (über die Grenzen der GUI hinaus) mit einer definierten Farbe

    [/autoit] [autoit][/autoit] [autoit]

    $Brush_Black = _GDIPlus_BrushCreateSolid(0xFF000000)
    $hBrush = _GDIPlus_BrushCreateSolid(0x7F00007F)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFF00007F)
    $hFormat = _GDIPlus_StringFormatCreate()
    $hFamily = _GDIPlus_FontFamilyCreate("Arial")
    $hFont = _GDIPlus_FontCreate($hFamily, 12, 2)
    $tLayout = _GDIPlus_RectFCreate(10, 10)

    [/autoit] [autoit][/autoit] [autoit]

    $smili_left = _GDIPlus_ImageLoadFromFile("left.png")
    $smili_right = _GDIPlus_ImageLoadFromFile("right.png")
    $smili_up = _GDIPlus_ImageLoadFromFile("up.png")
    $smili_down = _GDIPlus_ImageLoadFromFile("down.png")
    $coin = _GDIPlus_ImageLoadFromFile("coin.png")
    $monster_bild = _GDIPlus_ImageLoadFromFile("monster.png")
    AdlibRegister("setmonster", 50)
    AdlibRegister("_ReDraw", 35)
    While 1
    ;~ setmonster()
    ;~ _ReDraw()
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    AdlibUnRegister()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_ImageDispose($smili_left)
    _GDIPlus_ImageDispose($smili_right)
    _GDIPlus_ImageDispose($smili_up)
    _GDIPlus_ImageDispose($smili_down)
    _GDIPlus_ImageDispose($coin)
    _GDIPlus_ImageDispose($monster_bild)
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_Shutdown()
    DllClose($dll)
    Exit
    EndSwitch
    If _IsPressed("25", $dll) Then _WalkLeft()
    If _IsPressed("26", $dll) Then _WalkUp()
    If _IsPressed("27", $dll) Then _WalkRight()
    If _IsPressed("28", $dll) Then _WalkDown()

    [/autoit] [autoit][/autoit] [autoit]

    If $iX1 > $coinx - 40 And $iX1 < $coinx + 16 And $iY1 > $coiny - 40 And $iY1 < $coiny + 16 Then coingesammelt()

    [/autoit] [autoit][/autoit] [autoit]

    If $iX1 > $monster_pos_x - 40 And $iX1 < $monster_pos_x + 40 And $iY1 > $monster_pos_y - 40 And $iY1 < $monster_pos_y + 40 Then gameover()
    ;~ Sleep(35)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _ReDraw()
    ;Alles von hier bis zum nächsten Kommentar ist für die Neudefinierung der Begrenzungen zuständig
    If $iX1 > 72 + 356 - 51 Then
    $MaxY = 56 + 297 - 51
    ;~ Else
    ;~ $MaxY = 56 + 297 - 51
    EndIf
    If $iY1 < 56 + 297 - 51 Then
    $MaxX = 72 + 356 + 140 - 51
    ;~ Else
    ;~ $MaxX = 72 + 356 - 51
    EndIf
    ;Ende Begrenzungen
    _GDIPlus_GraphicsClear($hBuffer, 0xFFF0F0F0) ;Schon erklärt ;)
    _GDIPlus_GraphicsFillRect($hBuffer, 72, 56, 496, 297, $Brush_Black) ;vorher 356

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawStringEx($hBuffer, "punkte: " & $coinsgesammelt, $hFont, $tLayout, $hFormat, $hBrush)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawImageRect($hBuffer, $coin, $coinx, $coiny, 16, 16)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawImageRect($hBuffer, $monster_bild, $monster_pos_x, $monster_pos_y, 40, 40)

    [/autoit] [autoit][/autoit] [autoit]

    If $bewegungsrichtug = "left" Then _GDIPlus_GraphicsDrawImageRect($hBuffer, $smili_left, $iX1, $iY1, 40, 40)
    If $bewegungsrichtug = "right" Then _GDIPlus_GraphicsDrawImageRect($hBuffer, $smili_right, $iX1, $iY1, 40, 40)
    If $bewegungsrichtug = "up" Then _GDIPlus_GraphicsDrawImageRect($hBuffer, $smili_up, $iX1, $iY1, 40, 40)
    If $bewegungsrichtug = "down" Then _GDIPlus_GraphicsDrawImageRect($hBuffer, $smili_down, $iX1, $iY1, 40, 40)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, 625, 443) ;Zeichnet den Buffer auf die Grafik der GUI
    EndFunc ;==>_ReDraw

    [/autoit] [autoit][/autoit] [autoit]

    ;Alles von hier bis zum nächsten Kommentar ist für die Neusetzung der Spielerkoordinaten zuständig
    Func _WalkLeft()
    If $iX1 > $MinX Then $iX1 -= $Speed
    $bewegungsrichtug = "left"
    EndFunc ;==>_WalkLeft

    [/autoit] [autoit][/autoit] [autoit]

    Func _WalkRight()
    If $iX1 < $MaxX Then $iX1 += $Speed
    $bewegungsrichtug = "right"
    EndFunc ;==>_WalkRight

    [/autoit] [autoit][/autoit] [autoit]

    Func _WalkUp()
    If $iY1 > $MinY Then $iY1 -= $Speed
    $bewegungsrichtug = "up"
    EndFunc ;==>_WalkUp

    [/autoit] [autoit][/autoit] [autoit]

    Func _WalkDown()
    If $iY1 < $MaxY Then $iY1 += $Speed
    $bewegungsrichtug = "down"
    EndFunc ;==>_WalkDown
    ;Ende Spielerkoordinaten
    Func setcoin()
    $coinx = Random($MinX + 16, $MaxX - 16, 1)
    $coiny = Random($MinY + 16, $MaxY - 16, 1)
    EndFunc ;==>setcoin

    [/autoit] [autoit][/autoit] [autoit]

    Func coingesammelt()
    $coinsgesammelt += 1
    setcoin()
    EndFunc ;==>coingesammelt

    [/autoit] [autoit][/autoit] [autoit]

    Func setmonster()
    Local $Timer = TimerDiff($TimerInit)
    If $Timer >= 2000 Then
    $Richtung = Random(1, 4, 1)
    $TimerInit = TimerInit()
    EndIf
    Switch $Richtung
    ;496 = X max
    ;297 = y max
    ;72 = x min
    ;56 = y min
    Case 1 ; Oben
    If $monster_pos_y <= 56 Then
    $monster_pos_y = 56
    $Richtung = Random(1, 8, 1)
    Else
    $monster_pos_y -= $monsterspeed
    EndIf
    Case 2 ; Unten
    If $monster_pos_y >= 297 Then
    $monster_pos_y = 297
    $Richtung = Random(1, 8, 1)
    Else
    $monster_pos_y += $monsterspeed
    EndIf
    Case 3 ; Rechts
    If $monster_pos_x >= 496 Then
    $monster_pos_x = 496
    $Richtung = Random(1, 8, 1)
    Else
    $monster_pos_x += $monsterspeed
    EndIf
    Case 4 ; Links
    If $monster_pos_x <= 72 Then
    $monster_pos_x = 72
    $Richtung = Random(1, 8, 1)
    Else
    $monster_pos_x -= $monsterspeed
    EndIf
    Case 5 ; Schräg Links Oben
    If $monster_pos_x <= 56 Then
    $monster_pos_x = 56
    $Richtung = Random(1, 8, 1)
    ElseIf $monster_pos_y <= 72 Then
    $monster_pos_y = 72
    $Richtung = Random(1, 8, 1)
    Else
    $monster_pos_x -= $monsterspeed
    $monster_pos_y -= $monsterspeed
    EndIf
    Case 6 ; Schräg Links Unten
    If $monster_pos_x <= 56 Then
    $monster_pos_x = 56
    $Richtung = Random(1, 8, 1)
    ElseIf $monster_pos_y >= 297 Then
    $monster_pos_y = 297
    $Richtung = Random(1, 8, 1)
    Else
    $monster_pos_x -= $monsterspeed
    $monster_pos_y += $monsterspeed
    EndIf
    Case 7 ; Schräg Rechts Oben
    If $monster_pos_x >= 496 Then
    $monster_pos_x = 496
    $Richtung = Random(1, 8, 1)
    ElseIf $monster_pos_y <= 72 Then
    $monster_pos_y = 72
    $Richtung = Random(1, 8, 1)
    Else
    $monster_pos_x += $monsterspeed
    $monster_pos_y -= $monsterspeed
    EndIf
    Case 8 ; Schräg Rechts Unten
    If $monster_pos_x >= 496 Then
    $monster_pos_x = 496
    $Richtung = Random(1, 8, 1)
    ElseIf $monster_pos_y >= 297 Then
    $monster_pos_y = 297
    $Richtung = Random(1, 8, 1)
    Else
    $monster_pos_x += $monsterspeed
    $monster_pos_y += $monsterspeed
    EndIf
    EndSwitch
    EndFunc ;==>setmonster

    [/autoit] [autoit][/autoit] [autoit]

    Func gameover()
    MsgBox(16, "GameOver", $coinsgesammelt & " Punkte")
    $coinsgesammelt = 0
    $iX1 = 200
    $iY1 = 120
    $monster_pos_x = 400
    $monster_pos_y = 200
    EndFunc ;==>gameover

    [/autoit]

    Zusatzinfo: Wem das Spiel zu einfach ist, der kann oben $monsterspeed auf 6 oder 7 setzen, schon wirds lustiger.... (Zeile 25 oder 26)

  • Zu viel Ehre Jonathan


    Sag mal:

    Sei ehrlich !


    Du hast ncht echt meine Wand berechnung genommen ?

    Auflösung:


    Oh Doch :P
    *ausschimpf, lass dich nie wieder blicken :P*

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Ich seh nicht wo ...

    Na egal, die "Künstliche Intelligenz" (KI) sollte ja eigentlich bei yxyx gemacht werden :whistling: :whistling: :whistling:

    So viel dazu :D

    Trotzdem danke ich yxyx für die Idee (die von ihm war bekloppt, aber er hatte mich auf die Idee für die KI des Monsters gebracht)

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Auch wenn es ein wenig spaghettimäßig aussieht, funktioniert es. Und dafür, dass das dein erstes richtiges GDI+ Werk ist finde ich es wirklich gelungen .


    Dankeschön, du hast mir aber auch viel geholfen^^

    Zitat von Bakku

    Hey ich schreibe grade auch Pacman. (Für meinen Bruderherz).
    Das Monster ist leider etwas unscharf. Ansonsten cool.

    m-obi macht auch gerade Pacman :D

  • (ganze 80 Zeilen code [die Bewegung] stammen von mir ;) grins)

    Die Bewegung des Monsters *

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Die Idee lässt zwar ein wenig zu wünschen übrig die umsetzung ist aber gut.

    mfg Ubuntu

  • Die Idee lässt zwar ein wenig zu wünschen übrig die umsetzung ist aber gut.

    mfg Ubuntu


    Danke Ubuntu, wie gesagt, war sowas langeweilewäßiges...
    Ich werde es jetzt immer in Info zocken, wenn mein lehrer wieder was erzählt, was ich schon weiß :rofl:
    Habe mich schon gefragt, wann deine Antwort kommt, weil es kein Thread gibt, dessen titel GDI+ beinhaltet und von dir un Name unkommentiert bleibt :D

  • Sprenger120

    Ich hätte ja ne KI gemacht die den Pac-Man verfolgt, aber das fand Jona zu doof !

    Vllt mache ich ne KI die ihn ab ner bestimmten entfernung verfolgt ...
    Aber dann motzt Jona wieder :P

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Jo, aber da gibt es auch WÄNDEEEEE (im sinne von ein labirinth oder wie auch immer man das schreibt)

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Zitat

    Na egal, die "Künstliche Intelligenz" (KI) sollte ja eigentlich bei yxyx gemacht werden :whistling: :whistling: :whistling:


    ne wars nich ich sollte eigenltich machen das sich das monster richtig bewegt
    aba da wollte mein pc nich mitspielen und machte n update :D
    aba EM hat das schon ganz gut hinbekommen

  • Sry, tut mir Leid ...
    Jona meinte du machst das O.o

    Na ich wollte das das Monster infach nur "läuft" und nicht so rumwackelt wie eure Doodle Jump Monster !

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Ich hätte ja ne KI gemacht die den Pac-Man verfolgt, aber das fand Jona zu doof !

    Ach möwe tze tze tze

    im originalen Pacman verfolgen aber die Geister den Pac

    Ja, wie EM sagt, da gibts wäne und fluchtwege, bei mir würde das rote Blinky dingen den Pacman nur in eione ecke treiben und GameOver

    Na ich wollte das das Monster infach nur "läuft" und nicht so rumwackelt wie eure Doodle Jump Monster !

    Scherzkeks.... Hast du schonmal das Originale DoodleJump aufm iPod/iPhone gespielt? das ist 1:1 gleich von der Monsterbewegung her

  • MAN

    ICh wollte das DEIN Monster nicht wie die in doodle Jump wackelt !
    Und ich weiß das im Original die Monster wackeln !

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal