In einem Spiel eine Nachricht optisch schön darstellen

  • Guten Abend,
    es geht darum, in einem Spiel (GTA San Andreas) ingame per AutoIt eine Nachricht anzeigen zu lassen, lediglich einen kleinen String.

    Ich hatte temporär den interessanten Gedanken, eine OnTop Popup-Gui zu erstellen und nach ner Zeit zu löschen. Sähe leider etwas sehr blöde aus.....
    Diesbezüglich Frage eins: Wie kann man eine GUI transparent machen, so dass lediglich ein Label NICHT transparent ist ?

    Dann hatte ich mal die Hilfedatei durchgeguckt, und kam zu diesem GDI_Plus Zeug.
    Hatte dann diesen Code versucht

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>

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

    Opt('MustDeclareVars', 1)
    HotKeySet("t","_Main")
    while 1
    sleep(500)
    wend

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

    Func _Main()
    Local $hGUI, $hWnd, $hGraphic, $hBrush, $hFormat, $hFamily, $hFont, $tLayout

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

    ; $hGUI = GUICreate("GDI+", 400, 300)
    $title = WInGetTitle("[activated]")
    $hWnd = WinGetHandle($title)
    GUISetState()

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

    ; Draw a string
    _GDIPlus_Startup ()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hWnd)
    $hBrush = _GDIPlus_BrushCreateSolid (0x7F00007F)
    $hFormat = _GDIPlus_StringFormatCreate ()
    $hFamily = _GDIPlus_FontFamilyCreate ("Arial")
    $hFont = _GDIPlus_FontCreate ($hFamily, 12, 2)
    $tLayout = _GDIPlus_RectFCreate (140, 110, 100, 20)
    _GDIPlus_GraphicsDrawStringEx ($hGraphic, "Hello world", $hFont, $tLayout, $hFormat, $hBrush)

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

    ; Loop until user exits
    Do
    Until not WinExists($title)

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

    ; Clean up resources
    _GDIPlus_FontDispose ($hFont)
    _GDIPlus_FontFamilyDispose ($hFamily)
    _GDIPlus_StringFormatDispose ($hFormat)
    _GDIPlus_BrushDispose ($hBrush)
    _GDIPlus_GraphicsDispose ($hGraphic)
    _GDIPlus_Shutdown ()

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

    EndFunc ;==>_Main

    [/autoit]


    (Grad ausm Kopf nachgeschrieben, es kamen keine Errors ;) )
    Das funktioniert in normalen programmen wie Notepad auch ganz gut, allerdings verschwindet das im Spiel nach ca. 300-500 ms, also kaum lesbar.

    Dazu Frage 2 : Kann man das irgendwie dauerhaft schreiben ?
    Also so, dass es sozusagen im Bildschirm eingebrannt ist ? Ihr wisst bestimmt was ich meine

    Und frage 3 : was könnte man noch machen, um in einem Vollbildspiel eine AutoIt-Nachricht anzuzeigen ?

    Mfg,
    Dankeschön

    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön

  • Habe jetzt gestern noch die interessante Funktion

    [autoit]

    _WinAPI_DrawText

    [/autoit]


    gesehen....

    Beispielsskript:

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <FontConstants.au3>

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

    Global $tRECT, $hFont, $hOldFont, $hDC

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

    HotKeySet("{ESC}", "_Exit")

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

    $tRECT = DllStructCreate($tagRect)
    DllStructSetData($tRECT, "Left", 50)
    DllStructSetData($tRECT, "Top", 5)
    DllStructSetData($tRECT, "Right", 250)
    DllStructSetData($tRECT, "Bottom", 50)

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

    $hDC = _WinAPI_GetDC(0)
    $hFont = _WinAPI_CreateFont(50, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, _
    $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Arial')
    $hOldFont = _WinAPI_SelectObject($hDC, $hFont)

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

    _WinAPI_SetTextColor($hDC, 0x0000FF)
    _WinAPI_SetBkColor($hDC, 0x000000)
    ; comment next line to get black background instead of transparent one
    _WinAPI_SetBkMode($hDC, $TRANSPARENT)

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

    While 1
    _WinAPI_DrawText($hDC, "Hello world!", $tRECT, $DT_CENTER)
    Sleep(100)
    WEnd

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

    Func _Exit()
    _WinAPI_SelectObject($hDC, $hOldFont)
    _WinAPI_DeleteObject($hFont)
    _WinAPI_ReleaseDC(0, $hDC)
    _WinAPI_InvalidateRect(0, 0)
    $tRECT = 0
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Nur wo kann ich die Position einstellen, wo der Text auftaucht ?
    Bei dem Left-Dingens habichs schon versucht, aber wenn ich da nen Wert ändere, verschwindet das irgendwie Oo
    Bis 50 gehts, sobalds drüber geht, isses weg

    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön

  • Hallo,
    lies mal die Hilfe zu $tagRECT nach:
    Parameter:
    Left legt die X-Koordinate der oberen linken Ecke fest
    Top legt die Y-Koordinate der oberen linken Ecke fest
    Right legt die X-Koordinate der unteren rechten Ecke fest
    Bottom legt die Y-Koordinate der unteren rechten Ecke fest

    z.B.

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <FontConstants.au3>

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

    Global $tRECT, $hFont, $hOldFont, $hDC

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

    HotKeySet("{ESC}", "_Exit")

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

    $tRECT = DllStructCreate($tagRect)

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

    $hDC = _WinAPI_GetDC(0)
    $hFont = _WinAPI_CreateFont(50, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, _
    $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Arial')
    $hOldFont = _WinAPI_SelectObject($hDC, $hFont)

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

    _WinAPI_SetTextColor($hDC, 0x0000FF)
    _WinAPI_SetBkColor($hDC, 0x000000)
    ; comment next line to get black background instead of transparent one
    _WinAPI_SetBkMode($hDC, $TRANSPARENT)

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

    While 1
    $pos=mousegetpos()
    DllStructSetData($tRECT, "Left", $pos[0])
    DllStructSetData($tRECT, "Top", $pos[1])
    DllStructSetData($tRECT, "Right", $pos[0]+250)
    DllStructSetData($tRECT, "Bottom", $pos[1]+50)

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


    _WinAPI_DrawText($hDC, "Hello world!", $tRECT, $DT_CENTER)
    Sleep(100)
    WEnd

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

    Func _Exit()
    _WinAPI_SelectObject($hDC, $hOldFont)
    _WinAPI_DeleteObject($hFont)
    _WinAPI_ReleaseDC(0, $hDC)
    _WinAPI_InvalidateRect(0, 0)
    $tRECT = 0
    Exit
    EndFunc ;==>_Exit

    [/autoit]
  • Das leigt daran das viele Vollbildspiele eine Ontop GUI sofort überdecken wenn sie aufgemacht wird, das dürfte anscheinend bei GTA san anderes anders sein.

    mfg

    Computers are like Airconditioning. They don´t work with open Windows.

  • genau wie bei vielen Videoplayern benutzen auch viele Spiele eigene Grafiktreiber bzw. sprechen die Grafikkarte direkt über den Treiber an. Daher hat Windows überhaupt keine Ahnung, was überhaupt vor sich geht. Dementsprechend wird alles, was in so ein "Fenster" per GDI+ geschrieben wird, bestenfalls mit dem nächsten Frame der Graka wieder überschrieben. Daher kann man auch im Vollbildmodus nicht einfach ein "normales Fenster" anzeigen.

  • ja schon klar war auch ehr nen Joke aber programme wie fraps bekommen das doch auch hin


    Diese Programme hooken die vom Spiel verwendete Grafikausgabe (DirectX, Direct3D, OpenGl) und fügen ihre Ausgabe dazu. Das ist wirklich komplex und AutoIt ist dafür eindeutig zu langsam. (manchaml kann man auch Overlays verwenden, das ist einfacher, aber immer noch nicht so einfach, dass man es mit AutoIt lösen könnte)

  • Es gibt eine Directshow UDF mit entsprechender .dll (im englischen Forum glaube ich).
    Damit kann man zumindest per overlay ein Bild in den Videostream mixen.

    Bei DirectX würde das vielleicht (???) funktionieren, ist aber nicht so einfach.