GDI+ Spiel: AutoIt Arena Fight.

  • Das istn guter Ansatz zum aufräumen, ich hab zuerzeit leider mit Schule, Umzug etc. wichtigeres zu tun. Ich werde mal schauen, ob ich das noch einbaue, denn eigentlich wollte ich das Script komplett über den Haufen werfen und von Neuem schreiben. Aber ich kann deine Vorschläge ja eventuell in der nächsten Version verwenden (die vermutlich noch einige Zeit hin ist)...

  • okay, ich helf dann gerne mit (ich schreib jetzt einfach nochmal was ich zu _Options() grad gemacht habe - leider ist das nicht ganz richtig, aber darauf komm ich gleich)

    Spoiler anzeigen
    [autoit]

    Func _Options()
    $hBitmapBG = _GDIPlus_BitmapCreateFromHBITMAP($hGDI_Bitmap)
    $hGraphicTmp = _GDIPlus_ImageGetGraphicsContext($hBitmapBG)
    _GDIPlus_GraphicsFillRect($hGraphicTmp, 0, 0, $iGUIWidth, $iGUIHeight, $hBrush_BG_Menu)
    _GDIPlus_GraphicsDispose($hGraphicTmp)

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

    $nT_Sleep = TimerInit() + $nSleepTime
    $nT_UpdateFPS = TimerInit()
    $nT_AdjustSleepTime = TimerInit()

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

    While Not _IsPressed("50", $vUser32Dll) Or Not WinActive($hWnd) ; mit [P] würde man wieder zurück kommen
    DllStructSetData($tPrecSleep, "time", -10000 * ($nSleepTime - TimerDiff($nT_Sleep) + $nOffsetSleepTime))
    DllCall($vNTdll, "dword", "ZwDelayExecution", "int", 0, "ptr", $pPrecSleep)
    $nFrameTime = TimerDiff($nT_Sleep)
    $nT_Sleep = TimerInit()

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

    $nFPS_Cur = 1000 / $nFrameTime
    If TimerDiff($nT_UpdateFPS) >= 500 Then
    $nFPS_Average = ($nFPS_Average * ($iFPS_Counter - 1) + $nFPS_Cur) / $iFPS_Counter
    $iFPS_Counter += 1
    $nFPS_Display = $nFPS_Cur
    $nT_UpdateFPS = TimerInit()
    EndIf
    If TimerDiff($nT_AdjustSleepTime) >= 5000 Then
    If $nFPS_Average - $nFPS < -2 Then $nOffsetSleepTime -= 0.5
    If $nFPS_Average - $nFPS > 2 Then $nOffsetSleepTime += 0.5
    $iFPS_Counter = 1
    $nT_AdjustSleepTime = TimerInit()
    EndIf

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

    Global $aCursorInfo = GUIGetCursorInfo($hWnd)

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

    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmapBG, 0, 0, $iGUIWidth, $iGUIHeight)
    If _DrawMenuItem($tLayout_MOpt_Resolution,"Change Resolution") Then Sleep(10); Nächster Schritt -> Funktion mit neuem Menü, in dem man auswählen kann (kann ich wg. mangelnder GDI+-Kenntnisse leider nicht umsetzen)
    If _DrawMenuItem($tLayout_MOpt_Control,"Set Control") Then Sleep(10); Hier um die Steuerung zu verändern -> $sControl_Pause = "50" usw sollte dann so vorhanden sein, dass mans ändern kann, die änderungen am Besten in ner "Arena Fight.ini" verewigen
    ; kann ich machen, falls du mir im Vorraus das GDI+ Zeug scriptest
    If _DrawMenuItem($tLayout_MOpt_Return,"Return") Then ExitLoop

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

    _GDIPlus_GraphicsDrawEllipse($hGraphic, $aCursorInfo[0] - 8, $aCursorInfo[1] - 8, 16, 16, $hPen_Cursor)
    _GDIPlus_GraphicsDrawStringEx($hGraphic, "FPS " & Int($nFPS_Display), $hFont_FPS, $tLayout_FPS, $hStringFormat, $hBrush_FPS)
    _GDIPlus_GraphicsDrawLine($hGraphic, $aCursorInfo[0], $aCursorInfo[1] - 11, $aCursorInfo[0], $aCursorInfo[1] - 4, $hPen_Cursor)
    _GDIPlus_GraphicsDrawLine($hGraphic, $aCursorInfo[0] - 11, $aCursorInfo[1], $aCursorInfo[0] - 4, $aCursorInfo[1], $hPen_Cursor)
    _GDIPlus_GraphicsDrawLine($hGraphic, $aCursorInfo[0], $aCursorInfo[1] + 11, $aCursorInfo[0], $aCursorInfo[1] + 4, $hPen_Cursor)
    _GDIPlus_GraphicsDrawLine($hGraphic, $aCursorInfo[0] + 11, $aCursorInfo[1], $aCursorInfo[0] + 4, $aCursorInfo[1], $hPen_Cursor)
    _WinAPI_BitBlt($hDC, 0, 0, $iGUIWidth, $iGUIHeight, $hCDC_Buffer, 0, 0, 0x00CC0020)
    WEnd
    ; Das Zeug ovn _Pause() wiederherstellen: (bin nicht sicher, ob das so passt)
    $hBitmapBG = _GDIPlus_BitmapCreateFromHBITMAP($hGDI_Bitmap)
    $hGraphicTmp = _GDIPlus_ImageGetGraphicsContext($hBitmapBG)
    _GDIPlus_GraphicsFillRect($hGraphicTmp, 0, 0, $iGUIWidth, $iGUIHeight, $hBrush_BG_Menu)
    _GDIPlus_GraphicsDispose($hGraphicTmp)

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

    Do
    Sleep(20)
    Until Not _IsPressed("50", $vUser32Dll)
    EndFunc ;==>_Options

    [/autoit]

    und weiter oben beim initialisieren von dem ganzen:

    Spoiler anzeigen
    [autoit]

    #region Menu-Items für das Menü Options
    $tLayout_MOpt_Resolution = _CreateMenuItem("Change Resolution",100)
    $tLayout_MOpt_Control = _CreateMenuItem("Set Control",150)
    $tLayout_MOpt_Return = _CreateMenuItem("Return",200)
    #endregion

    [/autoit]

    also zum einen gibts jetzt zwar die menüpunkte, allerdings noch nicht anklickbar -> kann ich nicht machen wegen mangelnden GDI+ Kenntnissen... (muss man ja ne auswahlliste oder so erstellen, bzw. beim andren ein Feld mit ner Funktion wie _GetPressed() wo es auch an der grafischen Umsetzungsmöglichkeit fehlt... für mich)

    und zum andren hab ich kein plan, wie ich das alte menü wegmache, wenn ich das neue hinmache (so sieht man durch das neue noch das alte menü, und das ist hald blöd...)

    wenn dus von neuem schreibst, dann kommts häufig vor, dass die leute mittendrin die lust verlieren, dass wär dann auch blöd, aber musst du wissen

    grüße

    edit: habs mal in nen spoiler gepackt, is ja schlimm unübersichtlich ohne..

  • Zitat

    wenn dus von neuem schreibst, dann kommts häufig vor, dass die leute mittendrin die lust verlieren, dass wär dann auch blöd, aber musst du wissen


    Ja, aber im Moment kann ich mit dem Script so nicht wirklich weiterarbeiten. Es ist einfach zu ineffizient geschrieben. Am Anfang war das ganze nur ein kleiner Test, ob ich es schaffe 2 Kreise voneinander abprallen zu lassen. Daraus ist dann das geworden. Davor hatte ich ja schon mal eine Version ohne realistische Kollisionen, dann hat mich jemand darauf hingewiesen. Ich wollte das noch mal neu schreiben, weil der Code nicht übersichtlich genug ist um ihn zu ergänzen. Vor allem müsste ich ziemlich viel ersetzen....

  • ich will dich nich von irgendwas abhalten, aber eine frage zu dem abprallen hätte ich noch,
    läuft das nur mit geschwindigkeit oder auch mit impuls (also wenn man annimmt, dass größere kreise schwerer sind als kleinere, also näherungsweise die fläche als maße nimmt)
    aber das ist echt cool geworden, muss ich sagen :thumbup: auch das mit den Kreisen - faszinierend

    dann drück ich die daumen, dass das umschreiben dann gut klappt ;)

  • Zitat

    läuft das nur mit geschwindigkeit oder auch mit impuls (also wenn man annimmt, dass größere kreise schwerer sind als kleinere, also näherungsweise die fläche als maße nimmt)


    Ja, das basiert auf Impuls. In meiner Signatur ist ein kleines "Physics Engine" (wenn man das so nennen kann ^^), bei dem man das auch sieht. Hier habe ich nämlich der einfachheit halber die Formel verkürzt weil ja eh alle Kreise identisch sind.

  • okay, cool ;)

    an alle, die sich daran stören, dass man so oft daneben klickt, hab cih mal die version bisschen abgeändert (weils einige änderungen + nen neue datei sind, hab ichs neu hochgeladen)

    credits gehn natürlich an name22 - hab mich auch nirgends verewigt oder so..

    (die Maus wird wieder freigegeben, wenn ihr das Spiel beendet: [P] -> Quit, [ESC])

    ihr könnt das fenster auch nach wie vor verschieben, nur eben mit der maus das fenster nicht mehr verlassen / neben das fenster klicken

    (hab Options mal "ausgegraut", ich hoffe, das passt scripttechnisch so...)

    edit: hab noch hinzugefügt, dass es nun nur solang das fenster auch aktiv ist, die maus fängt
    edit2: irgendwie kann man unten und rechts immernoch rausklicken ganz nah am fenster (naja mal -5 gemacht)
    edit3: okay, noch nen kleines improvement: die maus wird nur während dem spiel gefangen, nicht im Pause/Start-menü...

  • okay, habs nochmal bisschen verändert, jetzt sind die größen des Fensters frei wählbar
    (stehen momentan auf @DesktopHeight, @DesktopWidth - also fullscreen)
    weil das bisschen weiter oben glaub gefragt wurde...

    edit: $bIsFullScreen hinzugefügt - wenn ihr den auf True setzt, dann verschwindet der Windows-Rahmen -> was ja bei FullScreen normal ist,
    drum auch nur mit @DesktopHeight, @DesktopWidth benutzen

  • Ich finde das Spiel echt endgeil :thumbup: - Wohl besser wie jedes andere Spiel für zwischendurch, weil es total gute Laune macht und echt nie langweilig wird. Genial wäre ja auf jedenfall noch ein MultiplayerModi im LAN oder WWW, aber das ist ja erstmal überhaupt nicht wichtig ^^. Das Interface (sprich die bunten Balken) sind gut gemacht und stören auch nicht. Der Zeitlupenmodus ist wohl das Sahnehäupchen und noch alles darüber hinaus :D und die Idee mit dem Energiebalken dazu mag ich auch total. Sonst ist das Spiel auch interessant, da die Gegner immer beträchtlich stärker werden - habs bis jetzt noch nicht soweit geschaft. Hoffentlich machst du weiter, das ist echt top!

    Nur keine Hektik - das Leben ist stressig genug

  • Zitat

    Gibbets da auch ein Online-Highscore?


    Nein. Aber wenn ich nächste Woche Zeit und einen festen Internetanschluss habe, kann ich mich ja mal daran versuchen. Dann bekomme ich vielleicht wieder Lust an dem Spiel weiterzuarbeiten. Ich muss allerdings diese Woche für 2 Klassenarbeiten lernen und am Wochenende ziehe ich um... Momentan bleibt mir also nicht sehr viel Zeit für sowas :S.

  • Ich hab erstmal sofort das GUI von 600x400 zu meinem gesamten Bildschirm gemacht. ^^
    Sooo ist es einfach über Wave 20 zu kommen. ^^
    Aber das ist ja schon wieder cheaten <.<


    SUPER DING... Da sieht man, was man alles nicht kann und auch erst Jahre braucht, um das zu können. ^^

  • Shit... 1. Versuch nur lvl 13 :D...
    Aber echt SEHR geil!!!


    Auf was mich das bringt... Multiplayer wäre geil... ABER... :D Die Möglichkeit KI's zu schreiben und nen Wettbewerb starten! DAS wärs :D!!!
    So wie Robowar & Co in den Hochsprachen^^... Vllt. müsste man sich das noch komplexer ausdenken dann, ein 2on2 z.B., dass die als Team zusammenarbeiten können/müssen...^^

    Wäre HAMMER, wenn es sowas auch für AutoIt gibt! Perfekt für Einsteiger. Spielerisches Erlernen ;)...

    Dass dann also in dein "Schiedprogramm" die beiden Teams included werden und dann gehts los mit der Spannung :D!


    LG,
    Aca