Ich hab in den Letzten Tagen einige Spiele durch Gespielt (dazu gehört DMC 5 und Dead Space 3) Bei beiden war jeweils der Abspann um die 10 min, bei Dead Space 3 nicht Jumpf bar (überspringbar)
Da kahm mir die idee sowas in Autoit zu machen.
Hat mich einige Haare gekostet, besonders das Flakern, dank Hilfe und dem Hinweiss ich solle es mit nem back Buffer machen, hats dan funktioniert.
Beispiel.au3
#include <GuiConstants.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GdiPlus.au3>
#include 'GDI+ Game Abspann.au3'
;~
OnAutoItExitRegister("_end")
Global $width = 1000, $height = 500
;~
_GDIPlus_Startup()
;~
$hGui = GUICreate('Test', $width, $height, -1, -1)
GUISetState(@SW_SHOW, $hGui)
;~
_LastWord($hGui)
;~
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $Stop
Exit
EndSwitch
WEnd
;~
Func _end()
_GDIPlus_Shutdown()
EndFunc ;==>_end
GDI+ Abspann.au3
#include <file.au3>
#include <Array.au3>
; #FUNCTION# ====================================================================================================================
; Name ..........: _LastWord
; Beschreibung ..: Lässt die eingelessene Datei wie einen Abspann von Oben nach Unten Wandern
; Syntax ........: _LastWord($hGUI)
; Parameter .....: $hGUI - Das Handle zur HauptGUI
; Return values .: Erfolg - Lässt die eingelessene Datei wie einen Abspann von Oben nach Unten Wandern
; Fehler - 0: File 'Creator.txt' nicht gefunden
; -1: $UpDown und $DownUp enthalten beide True oder False
;
; Author ........: Skilkor
; Modified ......:
; Beispiel ......:
; ===============================================================================================================================
Func _LastWord($hGUI)
Local Const $Size = WinGetClientSize($hGUI) ;$Size[0] = Breite(X) des Fensters - $Size[1] = Höhe(Y) des Fensters
Local $Progress = GUICtrlCreateProgress(0, $Size[1] - 20, $Size[0] - 60, 20) ;Erstellt eine Progressbar am Unteren Rand der Gui
Global $Stop = GUICtrlCreateButton('Jump', $Size[0] - 60, $Size[1] - 20, 60, 20)
Local $Creator = FileRead('Creator.txt') ;Liest die Datei 'Creator.txt' ein
Local $Count[1] = [_FileCountLines(@ScriptDir & '\Creator.txt')] ;Gibt die menge an Zeilen von 'Creator.txt' zurück
If $Creator = '' Then Return SetError(1, 0, 0) ;Wenn 'Creator.txt' nicht Existiert oder Leer ist
Local $FontColor = 0xFFFFFAFA
Local $fSize = 20 ;Grüssen Angabe zu _GDIPlus_FontCreate
Local $bSize = $fSize * 3
Local $iStyle = 0 ;Style Angabe zu _GDIPlus_FontCreate (0 - Normal | 1 - Fett | 2 - Kursiv | 4 - Unterstrichen | 8 - Durchgestrichen)
Local $iUnit = 2 ;Unit Angabe zu _GDIPlus_FontCreate (0 - Weltkoordinaten, eine nichtphysikalische Einheit | 1 - Anzeigeeinheiten | 2 - Eine Einheit ist 1 Pixel
;;~ 3 - Eine Einheit ist 1 Punkt oder 1/72 Inch | 4 - Eine Einheit ist 1 Inch | 5 - Eine Einheit ist 1/300 Inch
;;~ 6 - Eine Einheit ist 1 Millimeter)
Local $UpDown = False ;Wenn True, wird der Text von Oben nach Unter Dargestellt
Local $DownUp = True ;Wenn True, Wird der Text von Untern nach Oben Dargestellt
If $UpDown = True And $DownUp = True Then Return SetError(1, 0, -1)
If $UpDown = False And $DownUp = False Then Return SetError(1, 0, -1)
Local $Speed = 5 ;Die Geschwindigkeit des Durchlaufenden Textes
Local $EndSleep = 3000 ;Die Wartezeit wie lange 'The End' in der Mitte stehenbleiben soll
Local $Distance[1] = [0] ;Distanz Array
Local $FamilyFont = 'Arial' ;Schrift Art (Kann je nach unterstützung von _GDIPlus_FontFamilyCreate beliebig geändert werden)
;;~
For $d = 1 To $Count[0]
_ArrayInsert($Distance, $d, $d * 1.2 * $fSize) ;|Erstellen des Distanz Array's
Next
;;~
$hStringFormat = _GDIPlus_StringFormatCreate()
_GDIPlus_StringFormatSetAlign($hStringFormat, 1)
$hBrush = _GDIPlus_BrushCreateSolid($FontColor)
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
$hFamily = _GDIPlus_FontFamilyCreate($FamilyFont)
$hFont = _GDIPlus_FontCreate($hFamily, $fSize, $iStyle, $iUnit)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics($Size[0], $Size[1] - 20, $hGraphic)
$hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
;;~
$bStringFormat = _GDIPlus_StringFormatCreate()
_GDIPlus_StringFormatSetAlign($bStringFormat, 1)
$bBrush = _GDIPlus_BrushCreateSolid($FontColor)
$bGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
$bFamily = _GDIPlus_FontFamilyCreate($FamilyFont)
$bFont = _GDIPlus_FontCreate($bFamily, $bSize, $iStyle, $iUnit)
$bBitmap = _GDIPlus_BitmapCreateFromGraphics($Size[0], $Size[1] - 20, $bGraphic)
$bBuffer = _GDIPlus_ImageGetGraphicsContext($bBitmap)
;;~
For $i = 0 To $Size[1] + $Distance[$Count[0]]
Switch GUIGetMsg()
Case $Stop
$i = $Size[1] + $Distance[$Count[0]]
ExitLoop
EndSwitch
;;~
GUICtrlSetData($Progress, $i / ($Distance[$Count[0]] + $Size[1]) * 100)
;;~
If $UpDown = True Then
$tLayout = _GDIPlus_RectFCreate($Size[0] / 2 - 150, $i - $Distance[$Count[0]] + $Size[1], 300, $Distance[$Count[0]])
ElseIf $DownUp = True Then
$tLayout = _GDIPlus_RectFCreate($Size[0] / 2 - 150, $Size[1] - $i, 300, $Distance[$Count[0]])
EndIf
_GDIPlus_GraphicsClear($hBuffer)
_GDIPlus_GraphicsDrawStringEx($hBuffer, $Creator, $hFont, $tLayout, $hStringFormat, $hBrush)
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $Size[0], $Size[1] - 20)
Sleep($Speed)
Next
For $i = 0 To $Size[1] + $Distance[$Count[0]]
Switch GUIGetMsg()
Case $Stop
GUICtrlSetData($Stop, 'Exit')
ExitLoop
EndSwitch
;;~
GUICtrlSetData($Progress, $i / ($Distance[$Count[0]] + $Size[1]) * 100)
;;~
If $UpDown = True Then
$tLayout = _GDIPlus_RectFCreate($Size[0] / 2 - 150, $i - $Distance[$Count[0]] + $Size[1], 300, $Distance[$Count[0]])
ElseIf $DownUp = True Then
$tLayout = _GDIPlus_RectFCreate($Size[0] / 2 - 150, $Size[1] - $i, 300, $Distance[$Count[0]])
EndIf
If $i = $Size[1] / 2 Then Sleep($EndSleep)
_GDIPlus_GraphicsClear($bBuffer)
_GDIPlus_GraphicsDrawStringEx($bBuffer, 'The End', $bFont, $tLayout, $bStringFormat, $bBrush)
_GDIPlus_GraphicsDrawImageRect($bGraphic, $bBitmap, 0, 0, $Size[0], $Size[1] - 20)
Sleep($Speed)
Next
EndFunc ;==>_LastWord
Creator.txt
Adam
Adelbert
Adelmus
Adolf
Adolph
Adolphe
Adriaen
Adrian
Adrien
Alain
Albain
Alberich
Albert
Albin
Albrecht
Aldo
Alex
Alexander
Alexandre
Alf
Alfons
Alfred
Alistair
Alister
Alois
Aloïs
Aloys
Alphons
Alphonse
Alvin
Amadeus
Ambroise
Ambrosius
Amédé
Amédée
Amos
Anastasius
Ancel
Andi
André
Andreas
Andres
Andrés
Andy
Ansgar
Anthony
Antoine
Anton
(Sämmtliche Namen sind aus einer Namensliste aus dem Netz (Nur Vorname))
Zu beachten gibt es eigentlich nur eines.
Die Liste läuft von oben nach Unten, was zur auswirkung hat, das dass eingelessene File Recursiv dargestellt wird (Letzter Name als Erstes)
Ich werde die Tage evt noch Optionen hinzufügen um Einzustellen ob es von Oben nach Unter läuft, und die Auslesung der Datei im Sinne der Bewegung von A -> B Stimmt.
Man darf es weiter verfeinern, mir aber bittezuvor ne Nachricht Senden.
Das ganze Sieht dan etwa so aus:
[Blockierte Grafik: https://dl.dropbox.com/u/49201990/AutoIt/Thread/GDI%2B%20Abspann/1.jpg]
[Blockierte Grafik: https://dl.dropbox.com/u/49201990/AutoIt/Thread/GDI%2B%20Abspann/2.jpg]
[Blockierte Grafik: https://dl.dropbox.com/u/49201990/AutoIt/Thread/GDI%2B%20Abspann/3.jpg]
[Blockierte Grafik: https://dl.dropbox.com/u/49201990/AutoIt/Thread/GDI%2B%20Abspann/4.jpg]
Ich hab das ganze versucht so einfach wie möglich zu gestallten.
Man muss keine Fenster(Gui) Coords mitgeben, lediglich #include und bei
_LastWord($hGui)
das Fenster(Gui) Handle weitergeben.
Die Fenster(Gui) Coords weden dan über das Handle mit WinGetClientSize($hGUI) ermittelt.
Die Datei 'Creator.txt' Ist von nöten (Einfach erstellen)
Sie beinhaltet den ganzen Text der Wiedergegeben wird.
Fehler und Co bitte melden, hoffe aber, dass sie Soweit eigentlich macht was sie sollte
Greez
Skilkor
*** Update 13.02.2013 22:50***
Einstellungs Möglichkeit (Text von Oben nach Unten oder Unten nach Oben) Hinzugefügt (Zeile 28 / 29) und Entrpechende Return Error gesetzt
*** Update 14.02.2013 00:30***
Jump (Skip) & Exit Funktion hinzugefügt
'The End' wird in 3facher Grösse von $fSize nach dem Abspann Wiedergegeben, dazu kann man auf Zeile 34 den Wert von $EndSleep die Dauer angeben wie lange 'The End' in der Mitte Stehen bleibt (in ms)
*** Update 14.02.2013 14:00***
Progressbar Stimmt nun mit der Wiedergabe des Textes überein