1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Ealendil

Beiträge von Ealendil

  • Array

    • Ealendil
    • 20. Januar 2014 um 16:04

    Mag vielleicht ünnotig sein, aber ich hab ewig und drei Tage gebraucht um zu verstehen was eine for-each Schleife ist. (oder for-in)

    [autoit]


    Local $array[5] = [1, 2, 3, 4, 5]
    For $item In $array
    Msgbox(0, "", "$item: " & $item)
    Next

    [/autoit]

    Ich finds um einiges einfacher damit alle Array-Elemente zu durchlaufen, anstatt immer die typische For-Schleifen (mit Indexvariable) zu verwenden.

  • Mutex frage

    • Ealendil
    • 17. August 2012 um 19:14

    Deine Funktion returnt höchstwahrscheinlich "0", da "$aGLE[0]" <> 127.

  • Wie kriege ich ein anderen Inhalt in List3

    • Ealendil
    • 23. Mai 2012 um 15:31

    Anstelle von:

    [autoit]


    GUICtrlSetData ($h_List3, $a_Inhalt[$i][1])

    [/autoit]

    Einfach:

    [autoit]


    GUICtrlSetData ($h_List3, $a_Inhalt[$i][0])

    [/autoit]

    Sollte dein Problem lösen.



    Zudem kanst du die

    [autoit]


    GUICtrlSetData ($h_List2, "")
    GUICtrlSetData ($h_List3, "")

    [/autoit]


    weglassen, da du die Daten mit dem jeweils nächsten "GUICtrlSetData()" sowieso neu setzt.

  • mehrzeilige Variable nach @CRLF Splitten

    • Ealendil
    • 20. Mai 2012 um 14:45

    Soweit ich weiß ist "@CRLF" ein Doppelzeichen, dementsprechend müsste

    [autoit]

    StringSplit($savedText, @CRLF, 1)

    [/autoit]


    funktionieren.

  • Grafik Engine Erstellen

    • Ealendil
    • 6. Mai 2012 um 19:58
    Zitat

    Und btw wie soll ein server bei so wenig berechnung überlastet werden?


    Ein Fehler im Programm, geschieht jedem irgendwann mal.
    Zuviele Spieler, irgendwas nicht eingeplantes.

    Nur weil es anfangs nicht vorhersehbar ist, heißt es nicht, dass es nicht geschieht.
    Der Programmierer trägt nun mal die Verantwortung, dass selbst unter miesesten Bedingungen kein Fehler auftritt.

    Zitat

    Glaub mir ich bin kein Anfänger.


    Hab ich nie behauptet oder gedacht.
    Ich habe dich lediglich auf einen, mMn., Fehler aufmerksam gemacht.

  • Grafik Engine Erstellen

    • Ealendil
    • 6. Mai 2012 um 19:49

    Ohne dich ärgern zu wollen, auch wenn es danach ausschaut.

    Selbst wenn es der Server regelt, muss die Bewegung korrekt berechnet werden.
    Was wäre wenn der Server gerade überlastet ist und dasselbe Problem, siehe oberen Post von mir, auftritt.

  • Grafik Engine Erstellen

    • Ealendil
    • 6. Mai 2012 um 18:48

    Sry, hab mich falsch ausgedrückt.
    Mit "ruckeln" meinte ich nicht geringe Framerate, da kann man nichts ändern.
    Ich meinte, dass sich deine Objekte, im Beispiel "Link", viel zu langsam bewegen würden, da du eine "pro Frame Bewegung" implementiert hast.

  • Grafik Engine Erstellen

    • Ealendil
    • 6. Mai 2012 um 01:12

    Gute Idee.
    Mir gefällt vorallem, wie du das Framerate Problem gelöst hast.

    Als Verbesserung:
    1) Ich würde dir empfehlen den Code zu kommentieren, da es schnell mal unübersichtlich werden kann.
    2) Was machst du wenn du einen PC hast, der ungewöhnlich lange für das Rendern braucht, also länger als die angegebenen FPS?
    Dann würde deine If Abfrage in _Garfik_Update() nicht mehr anschlagen und die Anwendung würde erst recht wieder ruckeln.
    3) Empfehle ich dir den Zeiger auf die DllStuct in $hGarfik[8] bereits vorzuspeichern, damit du nicht in jedem Update-Aufruf DllStructGetPtr() benötigst.

  • Render Wissen - flexible Framerate Management

    • Ealendil
    • 6. Mai 2012 um 00:31

    name22: Ich meinte die Parameter und möglichen Rückgabewerte von ZwDelayExecution.
    Das eine Funktion, welche "warten" im Namen trägt etwas dergleichen macht, dachte ich mir. ;)
    Trotzdem danke für deine Erklärung.

    @Skincke: Weiß nicht ob du meinst, dass du es durch mich eingebaut hast oder nicht.
    Falls ja, Freut mich, wenn ich helfen konnte.
    Falls nein, sei gewiss ich habs dir nicht gestohlen.

    Hab mir dein Update gerade angeschaut und gleich nen Post in deinem Thread geschrieben.

  • Render Wissen - flexible Framerate Management

    • Ealendil
    • 6. Mai 2012 um 00:02

    name22:
    1)Danke für dein Feedback.
    Kurz ist es, aber mMn. benötigt es nicht mehr.

    2)Versteh meine Frage nicht falsch.
    Inwiefern meinst du ausgefeilter?

    Kannte ZwDelayExecution() nur vom "HörenSagen", habe allerdings noch keine genaue Beschreibung zu dieser Funktion gefunden.
    Kennst du/jemand eine Detaillierte?

  • [OpenGL] glEasy2D + glCube Klasse

    • Ealendil
    • 5. Mai 2012 um 23:44

    Der enum-Typ wäre nur der Übersicht halber gedacht, so dass man die Zahlen nicht auswendig lernen muss sondern einfach nur der Text (Konstantenname).

    Zitat

    ... in OpenGL wird eh jeder Typ als 32 Bit portiert, da OpenGL auf einer 32-Bit Lib beruht


    Wie meinst du das?
    Wenn du unsigned char return'st ist die Größe des Rückgabewerts 1 Byte groß oder irre mich?

    Da AutoIt den return-Typ "enum" nicht kennt, wie sollte es auch, wäre es wichtig die enum-Größe konstant zu halten (32 Bit als Beispiel).

    DllProgrammierung/Exportierung ist recht einfach:

    In deinem Header:

    Spoiler anzeigen
    Code
    __declspec(dllexport)   //wird nur gebraucht, falls der Compiler eine .lib Datei anlegen, soll. Wird benötigt, falls du exportierte Dll-Funktionen ohne "GetProcAdrs()" aufrufen möchtest.
    extern "C"
    return type
    __stdcall
    function-name (parameter-list);

    In deiner .cpp-Datei:

    Spoiler anzeigen
    Code
    __declspec(dllexport)   //wird nur gebraucht, falls der Compiler eine .lib Datei anlegen, soll. Wird benötigt, falls du exportierte Dll-Funktionen ohne "GetProcAdrs()" aufrufen möchtest.
    extern "C"
    return type
    __stdcall
    function-name (parameter-list)
    {
            //hier die Implermentierung
    }

    Wichtig ist, dass du Funktionen, die als extern "C" deklariert sind, nicht überladen kannst.

    EDIT:
    Ebenso kann es sein, dass manche Compiler trotz extern "C" die Exportfunktionsnamen ein wenig umbennen.
    Aus "MyDllExport" kann also "MyDllExport@4" werden.
    Um trotzdem an die richtigen Namen zu kommen, empfehle ich dir ein Programm, wie DllExplorer, welches dir alle Funtionen einer Dll aufzeigt.

  • Render Wissen - flexible Framerate Management

    • Ealendil
    • 5. Mai 2012 um 23:32

    Hi,

    Vorwort:
    Da mittlerweile die GDI+ Projekte/Programme immer zahlreicher werden,
    sowie mich die Lust gepackt hat dieses Wissen zu teilen, in der Hoffnung
    auf weiterhin gute Skripte.

    Ebenfalls zu notieren:
    Ich habe dieses Thema, bzw. Technik einfach nur so getauft.
    Sie wird weltweit als Render Basis für jedwege Engine verwendet (es gibt auch andere Arten, aber dies ist die Geläufigste).


    Hauptteil:
    Programmiert man ein simples 2D Spiel, in welchem sich einfach nur eine Figur/Sprite
    bewegt.
    So würde man sporadisch gesehen folgenden AutoIt-Code schreiben:

    Spoiler anzeigen
    [autoit]


    Global Const $g_fStepCount = 5.0 ;soviele Pixel soll sich die Figur bewegen
    Global $g_fPlayerPositionX = 150.0, ;X-Position der Spielfigur
    $g_fPlayerPositionY = 150.0 ;Y-Position der Spielfigur

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

    While Game_Running
    Render_Game() ;Rendert/Zeichnet das Spiel
    Sleep(xyz) ;Lässt das Programm pausieren, um die Framerate zu "drücken", Resourcenverbrauch zu mindern.
    WEnd

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

    Func Render_Game()
    $g_fPlayerPositionX += $g_fStepCount
    $g_fPlayerPositionY += $g_fStepCount

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

    Render_Player()
    EndFunc

    [/autoit]

    Obiger Code ist zwar nicht falsch, was mache man allerdings, wenn das Skript nur als decompile-resistente .exe
    vorliegt, sprich der Code nicht mehr veränderbar ist, der Sleep()-Wert konstant ist.

    Wozu Sorgen machen?
    Nun schreibt man ein Programm für einen PC mit 2.0 GHz und alles klappt, stellt sich diese Frage nicht.
    Sollte das Programm allerdings nun auf einen überschnellen PC mit 300.0 GHz ausgeführt werden,
    so wird der Render_Game()-Code entsprechend schneller ausgeführt.
    Aus "lächerlichen" 20 FPS können rasch 200 FPS werden.
    Dies bedeutet nun, dass sich die Spielfigur pro Frame um 5 Pixel bewegt, der Code 10x so oft aufgerufen
    wird. D.h. der Charakter bewegt sich nun statt 100 Pixel (=5*20) um 1000 Pixel (=5*20*10) pro Sekunde.
    Ein Fehler welcher nicht auftreten soll und darf.

    Wie umgehe ich dies?
    In dem man einen Timer in die Schleife einbaut und nach jedem Render() Aufruf prüfe wieviel Sekunden!!!
    vergangen sind.
    Diesen Wert übergibt man dann dem nächsten Render() Aufruf.

    Spoiler anzeigen
    [autoit]


    Global Const $g_fStepCount = 5.0 ;soviele Pixel soll sich die Figur bewegen
    Global $g_fPlayerPositionX = 150.0, ;X-Position der Spielfigur
    $g_fPlayerPositionY = 150.0 ;Y-Position der Spielfigur

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

    Local $timer = 0
    Local $fSecsPassed = 0.0
    While Game_Running
    $timer = TimerInit() ;Initialisiere den Timer

    Render_Game($fSecsPassed) ;Rendert/Zeichnet das Spiel

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

    $fSecsPassed = TimerDiff($timer) / 1000.0
    WEnd

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

    Func Render_Game($fTime)
    $g_fPlayerPositionX += $g_fStepCount * $fTime
    $g_fPlayerPositionY += $g_fStepCount * $fTime

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

    Render_Player() ;Zeichnet die Spielfigur
    EndFunc

    [/autoit]

    Obiger Code führt dazu, dass die Spielfigur im 1. Frame um 0 Pixel bewegt wird und ab dem 2. Frame um
    $g_fStepCount - Pixel pro Sekunde bewegt wird.
    Wie nun der Teil mit dem Sleep() gelöst wird bleibt jedem selbst überlassen.


    Und nun das Ganze mal mit einem Beispiel:

    Spoiler anzeigen


    Skript-Aufbau:

    Spoiler anzeigen


    Das Beispiel zeichnet einfach nur ein Rechteck, welches sich konstant um 35.0 Grad/Sekunde um seinen Mittelpunkt dreht.

    1.) Das "Hauptprogramm" wird in einer "main()"-Funktion gehalten.
    2.) Zum "Erstellen"/"Zerstören" werden "Create"/"Destroy"-Funktionen genutzt.
    3.) Zum "Zeichnen" eine "Draw()"-Funktion.
    4.) Zum "Bewegen" der Szene eine "Update()"-Funktion.
    5.) Rückgabewerte in obigen Funktionen sind immer: 0 - Fehler. 1 - Erfolg; Bei Fehlschlag enthält @error nähere Informationen.
    6.) Erweiterte Rückgabe, wird durch ByRef realisiert.
    7.) Berechnung der Rotationsmatrix wird in der "Render"-Funktion erledigt.
    8.) Berechnung der Anzahl der Grade, also um wieviel Grad sich das Rechteck beim nächsten "Render"-Aufruf rotieren soll, in der "Update"-Methode.
    9.) Handles welche einen Wert von 0 haben, müssen/sollen nicht Dispose'ed() werden.

    Skript:

    Spoiler anzeigen
    [autoit]


    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.1
    Author: Dennis a.k.a Ealendil/CentuCore

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

    Script Function:
    Example for "flexible Framerate Management".

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

    Copyright:
    To nobody and all. At the same moment. ;)

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

    #ce ----------------------------------------------------------------------------

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

    #include <GDIPlus.au3> ;um überhaupt zeichnen zu können

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

    Opt("MustDeclareVars", 1)

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

    If $CMDLine[0] Then
    Local $TmpCMDLine[$CMDLine[0] - 1] ;erstellt ein 1-dimensionales Array mit sovielen "Spalten", wie es Command Line Parameter gibt.
    For $i = 1 To $CMDLine[0]
    $TmpCMDLine[$i - 1] = $CMDLine[$i] ;kopiere die Parameter von $CMDLine nach $TmpCMDLine
    Next
    main($CMDLine[0], $TmpCMDLine)
    Else
    main($CMDLine[0], Int(0))
    EndIf
    Exit(@error)

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

    Func main($NumCMDParams, $CMDParams)

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

    ;Daten für das Hauptfenster
    Local Const $GUIWidth = 500
    Local Const $GUIHeight = 500

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

    ;Daten für das zu zeichnende Rechteck
    Local Const $fRectWidth = 150.0
    Local Const $fRectCenterX = $GUIWidth / 2.0
    Local Const $fRectCenterY = $GUIHeight / 2.0

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

    Local $hGUI, $hFrontbufferGraphics, $hBackbufferBitmap, $hBackbufferGraphics
    Local $hTranslateMatrix = 0

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

    ;Starte GDI+
    If Not _GDIPlus_Startup() Then Return SetError(1, 0, 0)

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

    If Not Create("GDI+ Example by Ealendil", $GUIWidth, $GUIHeight, $hGUI, $hFrontbufferGraphics, $hBackbufferBitmap, $hBackbufferGraphics) Then

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

    ;Fehler beim erstellen der Szene
    Destroy($hGUI, $hFrontbufferGraphics, $hBackbufferBitmap, $hBackbufferGraphics)
    _GDIPlus_Shutdown()
    Return SetError(-1, 0, 0)
    EndIf

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

    ;berechne Offsets um das Rechteck korrekt zu verschieben
    ;Der Mittelpunkt des Rechtecks entspricht dem Mittelpunkt des Fensters
    Local Const $fTranslateOffsetX = $GUIWidth / 2.0
    Local Const $fTranslateOffsetY = $GUIHeight / 2.0

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

    Local Const $fNumDegPerSec = 35.0
    Local $fDegToRotate = 0.0
    Local $fTime = 0.0
    Local $timer = TimerInit()
    While GUIGetMsg() <> (-3)

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

    ;übermale/lösche Szene mit Weiß
    _GDIPlus_GraphicsClear($hBackbufferGraphics, 0xFFffFFff)

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

    ;zeichne Szene in den Backbuffer
    Render($fTime, $hBackbufferGraphics, $fTranslateOffsetX, $fTranslateOffsetY, $fDegToRotate, $fNumDegPerSec, $fRectWidth)

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

    ;präsentiere die gezeichnete Szene
    _GDIPlus_GraphicsDrawImage($hFrontbufferGraphics, $hBackbufferBitmap, 0, 0)

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

    ;setze vergangene Sekunden und initialisiere den Timer neu
    $fTime = TimerDiff($timer) / 1000.0
    $timer = TimerInit()
    WEnd

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

    Destroy($hGUI, $hFrontbufferGraphics, $hBackbufferBitmap, $hBackbufferGraphics)
    Return SetError(0, 0, 1)
    EndFunc

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

    Func Render(Const $fSecsPassed, $hGraphics, Const $fTranslateOffsetX, Const $fTranslateOffsetY, ByRef $fDegToRotate, Const $fNumDegPerSec, Const $fRectWidth)

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

    ;erstelle Rotations/Translations Matrix
    Local $l_hMatrix = _GDIPlus_MatrixCreate()
    If Not $l_hMatrix Then Return SetError(1, 0, 0)

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

    ;berechne Anzahl an Grad, um welche das Rechteck in derzeitigen Frame rotiert werden soll
    $fDegToRotate += $fNumDegPerSec * $fSecsPassed
    _GDIPlus_MatrixTranslate($l_hMatrix, $fTranslateOffsetX, $fTranslateOffsetY)
    _GDIPlus_MatrixRotate($l_hMatrix, $fDegToRotate)

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

    ;setze die berechnete Matrix und zeichne das Rechteck
    _GDIPlus_GraphicsSetTransform($hGraphics, $l_hMatrix)
    _GDIPlus_GraphicsDrawRect($hGraphics, -($fRectWidth / 2.0), -($fRectWidth / 2.0), $fRectWidth, $fRectWidth)

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

    ;lösche die Matrix
    _GDIPlus_MatrixDispose($l_hMatrix)

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

    Return SetError(0, 0, 1)
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: Create
    ; Description ...: Creates the given resources
    ; Syntax.........: Create(Const $GUIName, Const $GUIWidth, Const $GUIHeight, ByRef $HGUIOut, ByRef $hFrontbufferOut, ByRef $hGUIBitmapOut, ByRef $hBackbufferOut)
    ; Parameters ....: $GUIName - The window's name.
    ; $GUIWidth - The width for the window.
    ; $GUIHeight - The height for the window.
    ; $hGUIOut - A handle to the created window.
    ; $hFrontbufferOut - A handle to a Graphics object.
    ; $hGUIBitmapOut - A handle to a Bitmap object.
    ; $hBackbufferOut - A handle to a Graphics object for "$hGUIBitmapOut"
    ; Return values .: Success - 1
    ; Failure - 0
    ; @error - 1 = Couldn't create the window-
    ; - 2 = Couldn't create the frontbuffer Graphics object.
    ; - 3 = Couldn't create the backbuffer Bitmap object.
    ; - 4 = Couldn't create the backbuffer Graphics object.
    ; Author ........: Dennis (Ealendil/CentuCore)
    ; ===============================================================================================================================
    Func Create(Const $GUIName, Const $GUIWidth, Const $GUIHeight, ByRef $hGUIOut, ByRef $hFrontbufferGraphicsOut, ByRef $hBackbufferBitmapOut, ByRef $hBackbufferGraphicsOut)
    $hGUIOut = 0
    $hFrontbufferGraphicsOut = 0
    $hBackbufferBitmapOut = 0
    $hBackbufferGraphicsOut = 0

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

    ;erstelle das Hauptfenster
    $hGUIOut = GUICreate($GUIName, $GUIWidth, $GUIHeight)
    If Not $hGUIOut Then Return SetError(1, 0, 0)
    GUISetState(@SW_SHOW, $hGUIOut)

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

    ;erstelle Frontbuffer Graphics Objekt
    $hFrontbufferGraphicsOut = _GDIPlus_GraphicsCreateFromHWND($hGUIOut)
    If Not $hFrontbufferGraphicsOut Then Return SetError(2, 0, 0)

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

    ;erstelle Backbuffer Bitmap Objekt
    $hBackbufferBitmapOut = _GDIPlus_BitmapCreateFromGraphics($GUIWidth, $GUIHeight, $hFrontbufferGraphicsOut)
    If Not $hBackbufferBitmapOut Then Return SetError(3, 0, 0)

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

    ;erstelle Backbuffer Graphics Objekt
    $hBackbufferGraphicsOut = _GDIPlus_ImageGetGraphicsContext($hBackbufferBitmapOut)
    If Not $hBackbufferGraphicsOut Then Return SetError(4, 0, 0)

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

    Return SetError(0, 0, 1)
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: Destroy
    ; Description ...: Destroys the given resources.
    ; Syntax.........: Destroy(ByRef $hGUI, ByRef $hFrontbufferGraphics, ByRef $hGUIBitmap, ByRef $hBackbufferGraphics)
    ; Parameters ....: $hGUI - Handle to a window
    ; $hFrontbufferGraphics - A handle to a Graphics object.
    ; $hGUIBitmap - A handle to a Bitmap object.
    ; $hBackbufferGraphics - A handle to a Graphics object.
    ; Return values .: Success - 1
    ; Failure - None!
    ; Author ........: Dennis (Ealendil/CentuCore)
    ; Remarks .......: Each parameter will be set to zero after deleting.
    ; ===============================================================================================================================
    Func Destroy(ByRef $hGUI, ByRef $hFrontbufferGraphics, ByRef $hBackbufferBitmap, ByRef $hBackbufferGraphics)

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

    ;Zerstöre Backbuffer's Graphics Objekt
    If $hBackbufferGraphics Then
    _GDIPlus_GraphicsDispose($hBackbufferGraphics)
    $hBackbufferGraphics = 0
    EndIf

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

    ;Zerstöre Backbuffer Bitmap Objekt - enthält die Daten des Backbuffers
    If $hBackbufferBitmap Then
    _GDIPlus_BitmapDispose($hBackbufferBitmap)
    $hBackbufferBitmap = 0
    EndIf

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

    ;Zerstöre das Frontbuffer Graphics Objekt
    If $hFrontbufferGraphics Then
    _GDIPlus_GraphicsDispose($hFrontbufferGraphics)
    $hFrontbufferGraphics = 0
    EndIf

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

    ;Zerstöre das Fenster
    If $hGUI Then
    GUIDelete($hGUI)
    $hGUI = 0
    EndIf

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

    Return 1
    EndFunc

    [/autoit]


    Nachwort:
    Diese Technik soll helfen, dass Skripte auf jedem PC gleich "flüssig" laufen,
    also jede Figur sich gleich weit pro Tastendruck oder ähnliches bewegt.

    Ich hoffe ich habe es verständlich erklärt.
    Sollten Fragen auftreten, scheut euch nicht diese zu stellen.


    LG,
    Dennis a.k.a Ealendil

    EDIT: Beispiel hinzugefügt!

  • [OpenGL] glEasy2D + glCube Klasse

    • Ealendil
    • 5. Mai 2012 um 22:49

    Hi,

    gute Idee.


    Als Verbesserungsvorschlag, bzw. Änderung würde ich dir empfehlen statt int einen
    selbst definierten Typ a la "enum GLEASY2D_RESULT" oder dergleichen zu return'en.

    Wichtig: Falls du vorhast glEasy2D nach AutoIt zu portieren, also per "DllCall()",
    solltest du in die enum einen ungenutzten Wert, z.b. "__GLEASY2D_RESULT__FORCE__DWORD__ = 0x7fffffff" einsetzen.
    Dies führt dazu, dass der Compiler den enum-Typ als 32-Bit Größe kompiliert wird.

  • [Q][OpenGL] Licht Einstellung

    • Ealendil
    • 4. Mai 2012 um 16:34

    Deiner Erklärung nach muss es sich um ein "Directional Light" handeln.

  • Physik Engine Tutorials

    • Ealendil
    • 3. März 2011 um 00:03

    Hi,
    ohne mich sonderlich gut mit Physik-Engines auszukennen stell ich trotzdem mal ein paar (Gegen)Fragen, vlt. helfen sie dir, bzw. jmd. der sich auskennt.

    Inwiefern kommst du nicht weiter, was hast du schon alles?

    Hast du Kollisionserkennung eingebaut, wenn ja, auf welcher Basis (also Kugel-Kugel-Kollision oder Linie-Dreieck-Kollision, etc.)?
    Hat zwar nichts mit Physik am Hut, würde deine Engine allerdings interessanter machen, vorallem wenn sie 2D und 3D unterstützen würde.

    Hoffe dir ein paar Anregungen gegeben zu haben.

  • C++ DLL Problem

    • Ealendil
    • 1. Februar 2011 um 02:29

    Änder die Funktion folgendermaßen:

    Code
    char* DLLversion(void) {
         string sDLLversion = "0.0.0.1";
         return sDLLversion.c_str();
    }

    Und in AutoIt:

    [autoit]


    $return = DllCall ( "Project1.dll", "str", "DLLversion")
    If @error Then
    MsgBox(0,"","Fehlercode : "&@error)
    Else
    MsgBox(0,"",$return[0])
    EndIf

    [/autoit]

    Du willst ja nur die Zeichenkette an AutoIt zurückgeben, nicht das String-Objekt oder?
    Das Problem bei der Sache ist, allerdings, dass das String-Objekt nach der Funktion wieder zerstört wird
    und somit der C-String(char*) ins Leere zeigt, sprich du müsstest mit "new" oder "malloc" Speicher reservieren,
    und diesen entweder durch einen Ressourcen-Manager, durch eine Funktion oder irgendwie anders wieder freigeben.

    EDIT: Quellcode ausgebessert.

  • [Gelöst] Gui-Udf

    • Ealendil
    • 13. Dezember 2010 um 19:40

    Bin mit meinem Latein leider am Ende.
    Das Sleep(INFINITE) war einfach nur ein Versuch, allerdings, laut MSDN sollte dieses entfernt, sprich von meiner Seite nicht mitgedacht.

    Das Sleep(10) habe ich deswegen entfernt, da nach einer Fenstererstellung relativ gleich danach die WM_CREATE-Nachricht behandelt werden sollte,
    wobei auch hier, nur ein Versuch, und da mMn, deswegen nicht der Prozessor zum Glühen anfangen sollte.

    Weiterer Versuch wäre, aus PeekMessage ein GetMessage zu machen, bei mir hat es so funktioniert.

  • [Gelöst] Gui-Udf

    • Ealendil
    • 13. Dezember 2010 um 12:51

    Hi,
    sry, dass ich mich erst jetzt wieder melde.

    Mach aus der Funktion:

    Spoiler anzeigen
    Code
    DWORD WINAPI _Handler(LPVOID muell)
    {
        MSG messages;
        while(msgloop)
        {
            if(PeekMessage(&messages,NULL,0,0,PM_REMOVE)) //PM_REMOVE oder 0
            {
                TranslateMessage(&messages);
                DispatchMessage(&messages);
            }
            if(newG->start)
            {
                GUI *ngui;
                ngui=gui[newG->guix];
                if(newG->useexstyle) {
                ngui->hwnd = CreateWindowEx (
                     newG->exstyle,       /* Extended possibilites for variation */
                     newG->classname,              /* Classname */
                     newG->title,         /* Title Text */
                     newG->style,         /* default window */
                     newG->posx,          /* Windows decides the position */
                     newG->posy,          /* where the window ends up on the screen */
                     newG->w,             /* The programs width */
                     newG->h,             /* and height in pixels */
                     newG->parent,        /* The window is a child-window to desktop */
                     NULL,                /* No menu */
                     hinst,               /* Program Instance handler */
                     NULL                 /* No Window Creation data */
                     );
                } else {
                ngui->hwnd = CreateWindow(
                     newG->classname,              /* Classname */
                     newG->title,         /* Title Text */
                     newG->style,         /* default window */
                     newG->posx,          /* Windows decides the position */
                     newG->posy,          /* where the window ends up on the screen */
                     newG->w,             /* The programs width */
                     newG->h,             /* and height in pixels */
                     newG->parent,        /* The window is a child-window to desktop */
                     NULL,                /* No menu */
                     hinst,               /* Program Instance handler */
                     NULL                 /* No Window Creation data */
                     );
                }
                finished=true;
                newG->start=false;
            }
            Sleep(10);
        }
        return messages.wParam;
    }
    Alles anzeigen


    Diese hier:

    Spoiler anzeigen
    Code
    DWORD WINAPI _Handler(LPVOID muell)
    {
        MSG messages;
        ZeroMemory(&messages, sizeof(MSG));
        while(msgloop)
        {
            if(newG->start)
            {
                GUI *ngui;
                ngui=gui[newG->guix];
                if(newG->useexstyle) {
                ngui->hwnd = CreateWindowEx (
                     newG->exstyle,       /* Extended possibilites for variation */
                     newG->classname,              /* Classname */
                     newG->title,         /* Title Text */
                     newG->style,         /* default window */
                     newG->posx,          /* Windows decides the position */
                     newG->posy,          /* where the window ends up on the screen */
                     newG->w,             /* The programs width */
                     newG->h,             /* and height in pixels */
                     newG->parent,        /* The window is a child-window to desktop */
                     NULL,                /* No menu */
                     hinst,               /* Program Instance handler */
                     NULL                 /* No Window Creation data */
                     );
                } else {
                ngui->hwnd = CreateWindow(
                     newG->classname,              /* Classname */
                     newG->title,         /* Title Text */
                     newG->style,         /* default window */
                     newG->posx,          /* Windows decides the position */
                     newG->posy,          /* where the window ends up on the screen */
                     newG->w,             /* The programs width */
                     newG->h,             /* and height in pixels */
                     newG->parent,        /* The window is a child-window to desktop */
                     NULL,                /* No menu */
                     hinst,               /* Program Instance handler */
                     NULL                 /* No Window Creation data */
                     );
                }
                finished=true;
                newG->start=false;
            }
            if(PeekMessage(&messages,NULL,0,0,PM_REMOVE)) //PM_REMOVE oder 0
            {
                TranslateMessage(&messages);
                DispatchMessage(&messages);
            }
        }
        Sleep(INFINITE);
        return messages.wParam;
    }
    Alles anzeigen

    Solllte dann funktionieren.

  • [Gelöst] Gui-Udf

    • Ealendil
    • 5. Dezember 2010 um 20:04

    Okay, danke dir.
    Das Problem liegt daran, dass GetMessage() die Nachrichten aus dem Message-Queue, des Threads holt, der auch das Fenster erstellt hat.
    In deinem Fall der main-"Thread".
    Als Lösung fällt mir zurzeit nur ein, dass du deinen _Handler-Thread so erweiterst, dass dieser immer wieder eine Variable testet und schaut ob diese "true" oder sonstiges ist,
    und gegenfalls ein neues Fenster erstellt, usw.
    Kann man beliebig verändern/erweitern.

  • [Gelöst] Gui-Udf

    • Ealendil
    • 4. Dezember 2010 um 22:21

    Hm, ab wann wird denn "Keine Rückmeldung" ausgegeben?

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™