Audio Slide Beta 0.7b

  • Hi,
    In den letzen Wochen schreibe ich ein an Audio Surf angelehntes Game. Es geht darum so viel wie möglich Punkte zu bekommen das heißt ballern bis der Arzt kommt und Diamanten einsammeln. In den nächsten Versionen wird es ein Soudpack, Vollbild Modus und eine Highscore geben.

    Ein Dank geht an
    moritz1243 für die Quickdraw Grafik Engine
    Faweyr für RectCollision
    die Macher der Bass DLL und seinen kleinen Brüdern
    prog@ndy, BrettF und eukalyptus für die Bass UDF, Bass FX und Bass Tags
    Xero Harrison für Hurricane SupaDupa Serif
    Hilmar Brinkmann für die super geilen Sprites
    eukalyptus für die tollen Bass FX Beispiele
    yxyx für den Download Button

    Todo

    • Items und Schätze
    • Highscore (!) nächste Version
    • Schwierigkeitsgrade
    • Ende erkennen & Auswertung (!) nächste Version
    • Größere Spielfläche. (!) nächste Version
    • Bass Lizenz Bestätigung (!) nächste Version

    Bekannte Bugs
    -Sounds für Schuss und Blocker Kollision sind temporär deaktivert.
    -FPS zähler zeigt zu wenig an

    Audio Slide steht unter der [Blockierte Grafik: http://i.creativecommons.org/l/by-nd/3.0/88x31.png] Creative Commons Lizenz

    Downloads: [Blockierte Grafik: http://sprenger120.homeip.net/Projekte/Projektverwaltung/DownloadContent/AudioSlide.php]

    Feedback ausdrücklich erwünscht :)

  • Ich kenn Audiosurf, das Spiel ist echt super.
    Einziger Kritikpunkt:
    Mach den Hintergrund des Wagenbilds transparent, sonst sieht man den Stein nicht mehr

    Und ich mag lieber Auto von links nach Rechts fahren, aber das ist eigentlich egal

    EDIT:
    Es flackert, wenn du DoubleBufferin benutzt ist das besser

  • Hier habe mal das Flackern entfernt:

    Spoiler anzeigen
    [autoit]


    #NoTrayIcon
    #include <WindowsConstants.au3>
    #include <Bass.au3>
    #include <GDIPlus.au3>
    #include <GuiConstantsEx.au3>
    #include <Timers.au3>
    #include <Misc.au3>
    Opt("GUIOnEventMode", 1)
    HotKeySet("{Esc}", "_Exit")

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

    ;~ Global $sFile = "K:\Eigene Musik\The_Last_Prophecy-SynthR.mp3"
    Global $iMid, $iPlay = 1, $Timer, $Punkte = 0
    Global $iWidth = 25
    Global $iHeight = 25
    Dim $Objeckts[30][2]
    Dim $Schiff[2] = [900, 250]

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

    SetArray($Objeckts, 0)
    OnAutoItExitRegister("_Exit")
    $hDll = DllOpen("user32.dll")
    _BASS_Startup()
    _BASS_Init(0, -1, 44100, 0, "")

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

    _GDIPlus_Startup()
    $FFtStruct = DllStructCreate('float[128]')
    $StructPionter = DllStructGetPtr($FFtStruct)

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

    $hGui = GUICreate("AudioSlide Beta 0.1", 1024, 550, -1, -1)
    GUISetState(@SW_SHOW)
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "_Mini")
    GUISetOnEvent($GUI_EVENT_RESTORE, "_Rest")
    GUISetOnEvent($GUI_EVENT_CLOSE,"_Exit")
    GUIRegisterMsg($WM_ACTIVATEAPP, "_MY_WM_ACTIVATEAPP")

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $hBuffer = _GDIPlus_BitmapCreateFromGraphics(1024,550,$hGraphic)
    $hBGraphic = _GDIPlus_ImageGetGraphicsContext($hBuffer)

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

    $hB_Weiss = _GDIPlus_BrushCreateSolid(0xFF000000 + 0xFFFFFF)
    $hP_Black = _GDIPlus_PenCreate(0xFF000000, 5)

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

    _GDIPlus_GraphicsFillRect($hBGraphic, 0, 0, 1024, 550, $hB_Weiss)
    Redraw()

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

    $hImg_Block = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Img\Block.jpg")
    $hImg_White = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Img\White.jpg")
    $hImg_Schiff = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Img\Raumschiff.jpg")
    $hImg_Speed = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Img\Speed.jpg")

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

    $sFile = FileOpenDialog("Musikdatei wählen", "", "MP3 (*.mp3)|OGG (*.ogg)", 1 + 2,"",$hGui)
    If @error Then Exit 999

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

    $hMusik = _BASS_StreamCreateFile(False, $sFile, 0, 0, 0)

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

    _BASS_ChannelPlay($hMusik, 0)
    _Timer_SetTimer($hGui, 200, "AddObjT")
    AdlibRegister("DrawPunktestand", 50)

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

    While Sleep(25)
    If Not $iPlay Then ContinueLoop
    $iMid = 0
    $Lev = 2000
    _BASS_ChannelGetData($hMusik, $StructPionter, $BASS_DATA_FFT256)
    For $x = 1 To 63
    $iMid += DllStructGetData($FFtStruct, 1, $x) * $Lev
    Next
    $iMid = Int($iMid / 63)
    ;~ If $iMid > 50 Then AddObjN()

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

    _GDIPlus_GraphicsFillRect($hBGraphic, 0, 55, 1024, 440, $hB_Weiss)

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

    For $x = 0 To UBound($Objeckts) - 1
    If $Objeckts[$x][0] Then
    $Objeckts[$x][0] += $iMid
    If $Objeckts[$x][0] > 1024 Then
    $Objeckts[$x][0] = 0
    ContinueLoop
    EndIf
    _GDIPlus_GraphicsDrawImage($hBGraphic, $hImg_Block, $Objeckts[$x][0], $Objeckts[$x][1])
    EndIf
    Next

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

    If _IsPressed(26, $hDll) Then $Schiff[1] -= 15 ;Up
    If _IsPressed(28, $hDll) Then $Schiff[1] += 15 ;Down
    If _IsPressed(27, $hDll) Then $Schiff[0] += 15 ;Right
    If _IsPressed(25, $hDll) Then $Schiff[0] -= 15 ;Left

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

    ;0=X
    ;1=Y

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

    If $Schiff[0] > 950 Then $Schiff[0] = 950
    If $Schiff[0] < 50 Then $Schiff[0] = 50
    If $Schiff[1] > 420 Then $Schiff[1] = 420
    If $Schiff[1] < 60 Then $Schiff[1] = 60

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

    _GDIPlus_GraphicsDrawImage($hBGraphic, $hImg_Schiff, $Schiff[0], $Schiff[1])
    _GDIPlus_GraphicsDrawImage($hGraphic, $hBuffer, 0, 0)

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

    For $x = 0 To UBound($Objeckts) - 1
    If $Objeckts[$x][0] Then
    $iRet = _RectCollision($Objeckts[$x][0], $Objeckts[$x][1], $Objeckts[$x][0] + $iWidth, $Objeckts[$x][1] + $iWidth, $Schiff[0], $Schiff[1], $Schiff[0] + 50, $Schiff[1] + 50)
    If $iRet Then $Punkte -= 100
    If $Punkte < 0 Then $Punkte = 0
    EndIf
    Next

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

    WEnd

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

    Func DrawPunktestand()
    Local $iPercent
    If $iMid > 100 Then
    $iPercent = 100
    Else
    $iPercent = $iMid
    EndIf
    If $iMid > 1 Then $Punkte += 5
    _GDIPlus_GraphicsFillRect($hBGraphic, 50, 530, 100, 20, $hB_Weiss)

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

    _GDIPlus_GraphicsDrawString($hBGraphic, $Punkte, 50, 530)
    _GDIPlus_GraphicsDrawImage($hBGraphic, $hImg_Speed, 200, 530)
    _GDIPlus_GraphicsFillRect($hBGraphic, 200 + ($iPercent * 500 / 100), 530, 500 - ($iPercent * 500 / 100), 20, $hB_Weiss)
    EndFunc ;==>DrawPunktestand

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

    Func AddObjN()
    AddObjT(0, 0, 0, 0)
    EndFunc ;==>AddObjN

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

    Func AddObjT($hWnd, $Msg, $iIDTimer, $dwTime)
    If Not $iPlay Then Return
    If $iMid < 5 Then Return
    $iEx = 0
    For $x = 0 To UBound($Objeckts) - 1
    If Not $Objeckts[$x][0] Then
    Switch Random(1, 3, 1)
    Case 1
    $Objeckts[$x][1] = $iHeight + Random(50, 100, 1)
    Case 2
    $Objeckts[$x][1] = (10 + $iHeight) * 2 + 50 + Random(0, 100, 1)
    Case 3
    $Objeckts[$x][1] = (10 + $iHeight) * 3 + 150 + Random(0, 200, 1)
    EndSwitch
    $Objeckts[$x][0] = 1
    $iEx += 1
    If $iEx Then Return

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

    EndIf
    Next
    EndFunc ;==>AddObjT

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

    Func _Exit()
    _BASS_ChannelStop($hMusik)
    _BASS_StreamFree($hMusik)
    _BASS_Free()
    _GDIPlus_ImageDispose($hImg_Speed)
    _GDIPlus_ImageDispose($hImg_Block)
    _GDIPlus_ImageDispose($hImg_White)
    _GDIPlus_ImageDispose($hImg_Schiff)
    _GDIPlus_PenDispose($hP_Black)
    _GDIPlus_BrushDispose($hB_Weiss)
    _GDIPlus_GraphicsDispose($hBGraphic)
    _GDIPlus_BitmapDispose($hBuffer)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    DllClose($hDll)
    Exit
    EndFunc ;==>_Exit

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

    Func SetArray(ByRef $aArray, $sSet = -1)
    Local $x, $y
    Switch UBound($aArray, 0)
    Case 1
    For $x = 0 To UBound($aArray) - 1
    $aArray[$x] = $sSet
    Next
    Case Else
    For $x = 0 To UBound($aArray, 0) - 1
    For $y = 0 To UBound($aArray) - 1
    $aArray[$y][$x] = $sSet
    Next
    Next
    EndSwitch
    EndFunc ;==>SetArray

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

    Func _Mini()
    $iPlay = 0
    _BASS_ChannelPause($hMusik)
    EndFunc ;==>_Mini

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

    Func _Rest()
    $iPlay = 1
    _BASS_ChannelPlay($hMusik, 0)
    Redraw()
    EndFunc ;==>_Rest

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

    Func Redraw($i = 0)
    Switch $i
    Case 0
    _GDIPlus_GraphicsDrawLine($hBGraphic, 0, 50, 1024, 50, $hP_Black)
    _GDIPlus_GraphicsDrawLine($hBGraphic, 0, 500, 1024, 500, $hP_Black)
    _GDIPlus_GraphicsDrawString($hBGraphic, "Punkte:", 0, 530)
    _GDIPlus_GraphicsDrawString($hBGraphic, "Speed:", 150, 530)
    Case Else
    _GDIPlus_GraphicsDrawString($hBGraphic, "Punkte:", 0, 530)
    _GDIPlus_GraphicsDrawString($hBGraphic, "Speed:", 150, 530)
    EndSwitch
    EndFunc ;==>Redraw

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

    Func _MY_WM_ACTIVATEAPP($hWnd, $uMsg, $wParam, $lParam)
    Switch $wParam
    Case True
    _Rest()
    Case Else
    _Mini()
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>_MY_WM_ACTIVATEAPP

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

    Func _RectCollision($Rect1X1, $Rect1Y1, $Rect1X2, $Rect1Y2, $Rect2X1, $Rect2Y1, $Rect2X2, $Rect2Y2)
    ; Prog@ndy
    Local Const $tagRECT = "long;long;long;long"
    Local $1 = DllStructCreate($tagRECT)
    Local $2 = DllStructCreate($tagRECT)
    Local $3 = DllStructCreate($tagRECT)
    DllStructSetData($1, 1, $Rect1X1)
    DllStructSetData($1, 2, $Rect1Y1)
    DllStructSetData($1, 3, $Rect1X2)
    DllStructSetData($1, 4, $Rect1Y2)
    DllStructSetData($2, 1, $Rect2X1)
    DllStructSetData($2, 2, $Rect2Y1)
    DllStructSetData($2, 3, $Rect2X2)
    DllStructSetData($2, 4, $Rect2Y2)
    Local $r = DllCall("User32.dll", "int", "IntersectRect", "ptr", DllStructGetPtr($3), "ptr", DllStructGetPtr($1), "ptr", DllStructGetPtr($2))
    If @error Then Return SetError(1, 0, 0)
    Return $r[0] <> 0
    EndFunc ;==>_RectCollision

    [/autoit]

    EDIT:
    Und das Transparente Bild ist im Anhang (du musst im Quelltext also dann .png machen)

  • geil ^^ ich krieg aber immer beim schließen einen error:

    Code
    C:\Program Files\AutoIt3\Include\GDIPlus.au3 (1671) : ==> Subscript used with non-Array variable.:
    Local $aResult = _GDIPlus_GraphicsDrawStringEx($hGraphics, $sString, $hFont, $aInfo[0], $hFormat, $hBrush)
    Local $aResult = _GDIPlus_GraphicsDrawStringEx($hGraphics, $sString, $hFont, $aInfo^ ERROR
    ->18:24:34 AutoIT3.exe ended.rc:1

    vielleicht baust du noch ein speed limit ein, bei David Guetta (?) - Memories gehts kann schön ab.

  • Die Geschwindigkeitsregulierung ist bemerkbar geworden. Der Fehler aber liegt immernoch vor.

  • @Sprenger ich kann dir vllt helfen beim tags lesen (ist ja mit der bass.dll oder??)

    Spoiler anzeigen
    [autoit]

    $MusicHandle = _BASS_StreamCreateFile(False, $file, 0, 0, 0) ;hast du ja wahrscheinlich schon!
    $ID3Title = _Bass_Tags_Read($MusicHandle, '%IFV1(%TRCK,%TRCK. )%IFV2(%ARTI,%ICAP(%ARTI), Nichts) - %IFV2(%TITL,%ICAP(%TITL) , Nichts )')
    $ID3Album = _Bass_Tags_Read($MusicHandle, '%IFV1(%ALBM,%IUPC(%ALBM))')
    GUICtrlSetData($Label1,$ID3Title&" - "&$ID3Album)

    [/autoit]

    ich hoffe ich habe mich da richtig informiert^^

  • Ist ja echt Cool :thumbup:

    ...ich Liebe Audiosurf!
    ABER dein Script läuft bei mir nur im kompilierten Zustand mit x86, wenn ich es direkt starte Kommt die Gui und das Fahrzeug und auch sogar die Steine kommen; aber die Mucke läuft nicht und die Blöcke werden nur an den linken Bildschirmrand gesetzt und bewegen sich nicht.
    Und es ist immer noch rasend schnell, d.H. ich kann den Blöcken kaum ausweichen, so schnell sind diese.

    Ich habe Win7 x64

    Aber sonst finde ich es echt TOP!
    Weiter so, und dicke Grüsse

    Techmix

  • ABER dein Script läuft bei mir nur im kompilierten Zustand mit x86, wenn ich es direkt starte Kommt die Gui und das Fahrzeug und auch sogar die Steine kommen; aber die Mucke läuft nicht und die Blöcke werden nur an den linken Bildschirmrand gesetzt und bewegen sich nicht.


    Das liegt an der Bass DLL, die kommt nicht mit x64 zurecht.
    Einfach am anfang #AutoIt3Wrapper_UseX64=n setzen dann funzt´s vlt. Kanns jetze nicht Testen

    Und es ist immer noch rasend schnell, d.H. ich kann den Blöcken kaum ausweichen, so schnell sind diese.


    Hm ja ich setz mich noch mal ran