• Hi,
    das hier ist mein erstes spielemäßiges Projekt mit AutoIt. ;) Deshalb bitte ich um Gnade vor Recht :-O

    Ich habe einmal eine Singleplayerversion und eine Multiplayerversion. Die Singleplayerversion läuft im Endlessmode, sprich das Spiel hat kein Ende. ;) Beim Multiplayer gibt es eine Möglichkeit zur Beschränkung. Wenn der Punkt nicht mehr zu sehen ist, dann ALT + X. Spieler 1 wird mit Pfeiltasten gesteuert, Spieler 2 mit WASD.


    Wenn ihr bei Highscore senden auf Ja geht, dann wird eine eMail mit eurem angegebenen Username (Am besten der aus dem Forum), eurer Punktzahl, eurer Bonuschance und eurer Zeit geschickt. Letztere beiden um Betrug zu verhindern... Aber es gibt noch genug andere Möglichkeiten da zu mogeln, aber lasst es bitte, es soll ja Spaß machen^^ Ich denke, wenn ich ganz wenig Zeit haben sollte, wird das hier einmal in der Woche aktualisiert, sonst alle 1 - 3 Tage. Danke für die Idee an Jeahaha. ;) (Esc-Menü ist in Arbeit!)

    Highscores:

    Spoiler anzeigen


    Bitte passt die Variablen (Zeit und Bonuschance) dementsprechend, bei welcher Disziplin ihr mitmachen wollt, an!
    Scores ohne Namen werden ignoriert.;)


    Disziplin Classic (60 Sekunden Zeit, Bonuschance 5):

    • chesstiger (924 Punkte)
    • coderxyz (799 Punkte)
    • ---
    • ---
    • ---

    Disziplin Just Collect (60 Sekunden Zeit, Bonuschance 0)

    • ---
    • ---
    • ---
    • ---
    • ---

    Disziplin Fast (15 Sekunden Zeit, Bonus 10)

    • chesstiger (259 Punkte)
    • ---
    • ---
    • ---
    • ---


    Screenshot:

    Spoiler anzeigen

    Bei Fragen, fragt, oder lebt mit der Gewissheit, es nicht getan zu haben!

    Variablenerklärung:
    $SLEEPDELAY (Standart = 10) - Pause nach dem Empfangen eines Tastendruckes (Irrelevant für das Spiel, sollte nicht verändert werden.)
    $KOLLISIONMINUS_ENABLE (Standart = 1) - Legt fest, ob Punkte bei Berührung mit dem Rahmen abgezogen werden. (1 = Ja, 0 = Nein)

    $MINUS (Standart = 1) - Punkte, die bei $KOLLISIONMINUS_ENABLE = 1 und Berührung der Wand abgezogen werden.
    $BONUS_PROBABILITY (Standart = 5) - Wahrscheinlichkeit für einen Bonus. Errechnet sich wie folgt: Wenn Zufallszahl zwischen 0 und $BONUS_PROBABILITY gleich Zufallszahl zwischen 0 und $BONUS_PROBABILITY, dann Bonus.

    $LIMIT (Standart = 10) - Nach insgesammt $LIMIT gesammelten Kreisen wird das Spiel beendet. (0 für Unendlich)


    Entschuldigt bitte den Englisch-Deutsch Mischmasch im Quelltext ;)

    LG chesstiger

    Edit 1 (25.02.2012): Der Fisch dreht sich jetzt nach links und rechts! (Nur Multiplayer, Singleplayer wird am Sonntag nochmal neu überarbeitet)

  • ;D nicht schlecht

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • chesstiger
    Könntest du evtl. mal ein screen posten?
    Würde mich freuen wenn andere User auch mal screens posten würden bei ihren skript vorstellungen :D

    mfg Yellow

    §1 Ich kann nicht für meine scripts inhaftiert werden, auch wenn bereits 3 Menschen erblindeten an den Folgen der Korrekturlesung.  8o

  • Erstmal cooles erstes Spiel! :thumbup:
    Hab es aus Langeweile mal in GDI+ umgesetzt... :D
    Es ist zwar nur für einen Spieler, aber es ist so aufgebaut, dass man in ca. 10 Minuten auch den Multiplayer einbauen könnte... ;)
    Wenn ihr es ausprobieren wollt, brauch ihr die Bilder aus dem Anhang...

    Spoiler anzeigen
    [autoit]

    #include <GDIPLus.au3>
    #include <Misc.au3>
    #include <GuiConstants.au3>
    Global $Width = 400, $Height = 400, $BackgroundColor = '0xFF0932D9', $BackBuffer, $Speed = 3, $Food[2] = [50, 50], $Player[4] = [200, 200, 0, 0], $Score = 0, $GraphicMode = True
    Opt('GUIOnEventMode', 1)
    $Gui = GUICreate('Fishgame Cover', $Width, $Height)
    GUISetBkColor('0x' & StringTrimLeft($BackgroundColor, 4))
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    _GDIPlus_Startup()
    $GDI = _GDIPlus_GraphicsCreateFromHWND($Gui)
    $Bitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $GDI)
    $BackBuffer = _GDIPlus_ImageGetGraphicsContext($Bitmap)
    $BackgroundBrush = _GDIPlus_BrushCreateSolid($BackgroundColor)
    $FoodBrush = _GDIPlus_BrushCreateSolid(0xFF87E01B)
    $WhitePen = _GDIPlus_PenCreate(0xFFFFFFFF)
    $RechtsZu = _GDIPlus_ImageLoadFromFile('rz.png')
    $LinksZu = _GDIPlus_ImageLoadFromFile('lz.png')
    $RechtsAuf = _GDIPlus_ImageLoadFromFile('ra.png')
    $LinksAuf = _GDIPlus_ImageLoadFromFile('la.png')
    $FoodImage = _GDIPlus_ImageLoadFromFile('f.png')
    GUISetState()
    HotKeySet('g', '_ChangeGM')
    _GenFood()

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

    While Sleep(5)
    If _IsPressed(25) Then ; Links
    If $Player[2] = 1 Then
    $Player[2] = 0 ; Blickrichtung ändern...
    Else
    $StepStart = $Player[0] - 1
    $StepEnd = $Player[0] - $Speed
    For $i = $StepStart To $StepEnd Step -1
    If $i - 20 < 0 Then ExitLoop
    _WonAndMouth()
    $Player[0] -= 1
    Next
    EndIf
    EndIf
    If _IsPressed(26) Then ; Hoch
    $StepStart = $Player[1] - 1
    $StepEnd = $Player[1] - $Speed
    For $i = $StepStart To $StepEnd Step -1
    If $i - 10 < 0 Then ExitLoop
    _WonAndMouth()
    $Player[1] -= 1
    Next
    EndIf
    If _IsPressed(27) Then ; Rechts
    If $Player[2] = 0 Then
    $Player[2] = 1 ; Blickrichtung ändern...
    Else
    $StepStart = $Player[0] + 1
    $StepEnd = $Player[0] + $Speed
    For $i = $StepStart To $StepEnd Step +1
    If $i + 20 > $Width Then ExitLoop
    _WonAndMouth()
    $Player[0] += 1
    Next
    EndIf
    EndIf
    If _IsPressed(28) Then ; Runter
    $StepStart = $Player[1] + 1
    $StepEnd = $Player[1] + $Speed
    For $i = $StepStart To $StepEnd Step +1
    If $i + 10 > $Height Then ExitLoop
    _WonAndMouth()
    $Player[1] += 1
    Next
    EndIf
    _GDIPlus_GraphicsFillRect($BackBuffer, 0, 0, $Width, $Height, $BackgroundBrush) ; Alles mit der Hintergrundfarbe übermalen...
    _GDIPlus_GraphicsDrawString($BackBuffer, 'Drücken sie G um den Grafikmodus zu deaktivieren!', 45, 350)
    _DrawFood($Food[0], $Food[1])
    _DrawFish($Player)
    _GDIPlus_GraphicsDrawString($BackBuffer, 'Score: ' & $Score, 2, 2)
    _GDIPlus_GraphicsDrawImageRect($GDI, $Bitmap, 0, 0, $Width, $Height) ; Backbuffer auf GUI zeichnen...
    WEnd

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

    Func _DrawFish($Array)
    If $GraphicMode Then
    If $Array[2] = 0 Then
    If $Array[3] = 0 Then
    _GDIPlus_GraphicsDrawImageRect($BackBuffer, $LinksZu, $Array[0] - 22, $Array[1] - 16, 45, 35)
    Else
    _GDIPlus_GraphicsDrawImageRect($BackBuffer, $LinksAuf, $Array[0] - 22, $Array[1] - 16, 45, 35)
    EndIf
    Else
    If $Array[3] = 0 Then
    _GDIPlus_GraphicsDrawImageRect($BackBuffer, $RechtsZu, $Array[0] - 22, $Array[1] - 16, 45, 35)
    Else
    _GDIPlus_GraphicsDrawImageRect($BackBuffer, $RechtsAuf, $Array[0] - 22, $Array[1] - 16, 45, 35)
    EndIf
    EndIf
    Else
    _GDIPlus_GraphicsDrawRect($BackBuffer, $Array[0] - 10, $Array[1] - 10, 20, 20)
    If $Array[2] = 0 Then
    _GDIPlus_GraphicsFillEllipse($BackBuffer, $Array[0] - 20, $Array[1] - 10, 20, 20)
    _GDIPlus_GraphicsDrawEllipse($BackBuffer, $Array[0], $Array[1] - 10, 20, 20)
    If $Array[3] = 0 Then
    _GDIPlus_GraphicsDrawLine($BackBuffer, $Array[0] - 20, $Array[1], $Array[0] - 10, $Array[1], $WhitePen)
    Else
    _GDIPlus_GraphicsDrawLine($BackBuffer, $Array[0] - 20, $Array[1] - 5, $Array[0] - 10, $Array[1], $WhitePen)
    _GDIPlus_GraphicsDrawLine($BackBuffer, $Array[0] - 20, $Array[1] + 5, $Array[0] - 10, $Array[1], $WhitePen)
    EndIf
    Else
    _GDIPlus_GraphicsDrawEllipse($BackBuffer, $Array[0] - 20, $Array[1] - 10, 20, 20)
    _GDIPlus_GraphicsFillEllipse($BackBuffer, $Array[0], $Array[1] - 10, 20, 20)
    If $Array[3] = 0 Then
    _GDIPlus_GraphicsDrawLine($BackBuffer, $Array[0] + 20, $Array[1], $Array[0] + 10, $Array[1], $WhitePen)
    Else
    _GDIPlus_GraphicsDrawLine($BackBuffer, $Array[0] + 20, $Array[1] - 5, $Array[0] + 10, $Array[1], $WhitePen)
    _GDIPlus_GraphicsDrawLine($BackBuffer, $Array[0] + 20, $Array[1] + 5, $Array[0] + 10, $Array[1], $WhitePen)
    EndIf
    EndIf
    EndIf
    EndFunc ;==>_DrawFish

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

    Func _DrawFood($X, $Y)
    If $GraphicMode Then
    _GDIPlus_GraphicsDrawImageRect($BackBuffer, $FoodImage, $X - 5, $Y - 5, 10, 10)
    Else
    _GDIPlus_GraphicsFillEllipse($BackBuffer, $X - 5, $Y - 5, 10, 10, $FoodBrush)
    _GDIPlus_GraphicsDrawEllipse($BackBuffer, $X - 10, $Y - 10, 20, 20, $WhitePen)
    EndIf
    EndFunc ;==>_DrawFood

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

    Func _GenFood()
    Dim $New[2]
    For $i = 0 To 1
    While 1
    $New[$i] = Random(5, $Width - 5, 1) ; da unser Fenster ein Quadrat ist, könne wir hier mit $Width rechnen...
    If $New[$i] <> $Food[$i] Then
    If $i = 1 Then
    If Not _PointUnderPlayer($New, $Player) Then ; Wir überprüfen ob das neue 'Essen' unter dem Spieler liegt...
    ExitLoop
    EndIf
    Else
    ExitLoop
    EndIf
    EndIf
    WEnd
    Next
    $Food[0] = $New[0]
    $Food[1] = $New[1]
    EndFunc ;==>_GenFood

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

    Func _PointUnderPlayer($Point, $Fish)
    $Return = False
    If _PointInCircle($Point[0], $Point[1], $Fish[0] - 20, $Fish[1] - 10, 20) Then $Return = True ; linker Kreis
    If _PointInCircle($Point[0], $Point[1], $Fish[0], $Fish[1] - 10, 20) Then $Return = True ; rechter Kreis
    If _PointInRect($Point[0], $Point[1], $Fish[0] - 10, $Fish[1] - 10, 20, 20) Then $Return = True ; Quadrat in der Mitte
    Return $Return
    EndFunc ;==>_PointUnderPlayer

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

    Func _WonAndMouth()
    If $Player[2] = 0 Then
    If _PointInCircle($Food[0], $Food[1], $Player[0] - 10, $Player[1], 10) Then ; Wenn 'Essen' im 'Mund'...
    _GenFood()
    $Score += 5
    EndIf
    If _CirclesCollision($Food[0], $Food[1], 10, $Player[0] - 10, $Player[1], 10) Then ; Wenn 'Essen' vor oder im 'Mund' dann...
    $Player[3] = 1 ; Mund auf
    Else
    $Player[3] = 0 ; Mund zu
    EndIf
    Else
    If _PointInCircle($Food[0], $Food[1], $Player[0] + 10, $Player[1], 10) Then ; Wenn 'Essen' im 'Mund'...
    _GenFood()
    $Score += 5
    EndIf
    If _CirclesCollision($Food[0], $Food[1], 10, $Player[0] + 10, $Player[1], 10) Then ; Wenn 'Essen' vor oder im 'Mund' dann...
    $Player[3] = 1 ; Mund auf
    Else
    $Player[3] = 0 ; Mund zu
    EndIf
    EndIf
    EndFunc ;==>_WonAndMouth

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

    Func _ChangeGM()
    If $GraphicMode Then
    $GraphicMode = False
    Else
    $GraphicMode = True
    EndIf
    EndFunc ;==>_ChangeGM

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

    Func _End()
    _GDIPlus_ImageDispose($RechtsAuf)
    _GDIPlus_ImageDispose($RechtsZu)
    _GDIPlus_ImageDispose($LinksAuf)
    _GDIPlus_ImageDispose($LinksZu)
    _GDIPlus_ImageDispose($FoodImage)
    _GDIPlus_BrushDispose($FoodBrush)
    _GDIPlus_BrushDispose($BackgroundBrush)
    _GDIPlus_PenDispose($WhitePen)
    _GDIPlus_ImageDispose($Bitmap)
    _GDIPlus_GraphicsDispose($GDI)
    _GDIPlus_Shutdown()
    GUIDelete($Gui)
    Exit
    EndFunc ;==>_End

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

    ; Funktionen für die Kollisionsberechnung:
    Func _PointInCircle($PointX, $PointY, $CircleX, $CircleY, $CircleR)
    If _Distance($PointX, $PointY, $CircleX, $CircleY) < $CircleR Then
    Return True
    Else
    Return False
    EndIf
    EndFunc ;==>_PointInCircle

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

    Func _PointInRect($PointX, $PointY, $RectX, $RectY, $RectWidth, $RectHeight)
    $Return = True
    If $PointX < $RectX Then $Return = False
    If $PointX > ($RectX + $RectWidth) Then $Return = False
    If $PointY < $RectY Then $Return = False
    If $PointY > ($RectY + $RectHeight) Then $Return = False
    Return $Return
    EndFunc ;==>_PointInRect

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

    Func _CircleInRect($CircleX, $CircleY, $CircleR, $RectX, $RectY, $RectHeight, $RectWidth)
    $Return = True
    If ($CircleX - $CircleR) < $RectX Then $Return = False
    If ($CircleX + $CircleR) > ($RectX + $RectHeight) Then $Return = False
    If ($CircleY - $CircleR) < $RectY Then $Return = False
    If ($CircleY + $CircleR) > ($RectY + $RectWidth) Then $Return = False
    Return $Return
    EndFunc ;==>_CircleInRect

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

    Func _CirclesCollision($Circle1X, $Circle1Y, $Circle1R, $Circle2X, $Circle2Y, $Circle2R)
    If _Distance($Circle1X, $Circle1Y, $Circle2X, $Circle2Y) < ($Circle1R + $Circle2R) Then
    $Return = True
    Else
    $Return = False
    EndIf
    Return $Return
    EndFunc ;==>_CirclesCollision

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

    Func _Distance($X1, $Y1, $X2, $Y2)
    Return Sqrt(($X2 - $X1) ^ 2 + ($Y1 - $Y2) ^ 2)
    EndFunc ;==>_Distance

    [/autoit]

    Drückt auch mal die Taste G ;)

    LG
    Chirstoph

  • Uah, machs weg ;)
    Nein Spaß, aber ich persönlich bin kein Fan von GDI+...

    Screenshots sind reingestellt!

    Hmm... Escape-Menü okay, das klappt^^ Aber ne globale Highscore-Liste ist mit dem jetzigen Spielprinzip nicht gut...
    Das ist ja ein Multiplayer-Spiel was das Sammeln einer festgelegten Punktzahl (ohne Bonus) erlaubt... Da würde man ja immer dasselbe rauskommen ;)
    Da müsste man dann einen Time-Modus machen... hm.... ich hab da so eine Idee wie das klappen kann... Muss ich morgen in aller Ruhe mal probieren...

    Alles in Allem: Tolles Feedback! ;) Danke!

    LG Chess

  • Ähm ...
    Nimm doch GDI+, oder wo siehst du da ein Problem ?

    OT: Zu deiner Signatur - Natürlich, jeder weiß es, das ist totaler Stuss !
    Es heißt AutoIt nicht AutoIT !
    Und das spricht sich zusammen aus "Auto" wie automatisieren und "it " wie es -> AutoIt = Automatisiere es ...

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

  • Ich weiß wie mans auspricht ;) Der Witz dabei ist ja, dass das jeder weiß... da steht nicht umsonst ein ";)" hinter. :)
    Aber egal.

    Ich hab aber keinen Plan von GDI+, und es klappt ja auch so... Deswegen lass ich das erstmal so, bis ich Zeit hab, mir das GDI+-Zeug anzugucken.

    Nebenbei, die Highscoreliste ist in Arbeit!

    LG Chess

  • bei mir geht der download für den singleplayer nicht mehr :(

    und hab noch ein kleinen bug gefunden:
    wenn der fisch an den rand der GUI kommt wird er immer wieder ein STück hoch teleportiert.

    §1 Ich kann nicht für meine scripts inhaftiert werden, auch wenn bereits 3 Menschen erblindeten an den Folgen der Korrekturlesung.  8o

  • Ja, ich hab grad eine neue Datei hochgeladen^^

    An jedem Rand hoch oder nur am unteren?
    Weil der Fisch bei Berührung mit dem Rand immer ein bisschen zurück Richtung Mitte geworfen wird... Weil sonst die Gefahr besteht das man einfach am Rand stehen bleibt und in einer Endlosschleife Punkte abgezogen werden^^

    Danke und LG chess

  • An jedem Rand.
    ich hab nur den multiplayer gestestet

    mfg Yellow

    §1 Ich kann nicht für meine scripts inhaftiert werden, auch wenn bereits 3 Menschen erblindeten an den Folgen der Korrekturlesung.  8o

  • Hm ja ich weiß... aber wie gesagt, sonst kommt der fisch einmal an den Rand, und ihm werden in einer endloschleife Punkte abgezogen... dann werden auch keine Tastendrücke mehr registriert, sprich der Fisch bleibt auch so hängen^^

    LG chess

    PS: vll mach ich einfach nur 1PX zurücksetzen, dann fällts nicht auf^^