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. oetzn

Beiträge von oetzn

  • Problem beim Zahl definieren

    • oetzn
    • 23. Juni 2010 um 08:00
    [autoit]


    For $i = 0 To 999
    If $i < 100 Then $i = "00" & $i
    If MsgBox(4,"Zahlen von 000 bis 999", "Zahl: " & $i & @CRLF & "Abbrechen?") = 6 Then ExitLoop
    Next

    [/autoit]
  • Wieso klappt das mit dem Array schon wieder nicht

    • oetzn
    • 22. Juni 2010 um 07:45

    Die Erfahrung musste ich auch schon leidvoll machen X(

  • Arrays?? wie funktionieren sie??

    • oetzn
    • 22. Juni 2010 um 07:41

    Ich weiß nicht wie das geht, da ich die Gedanken deines Freundes leider nicht kenne.
    Aber mal etwas allgemeines, beim Programmieren/Skripten in einer gewissen Sprache gibt es meist eine gewisse Anzahl von Standardbefehlen. Die Kunst des Programmierenes/Skriptens liegt nun darin, diese Befehle so anzuwenden, das ein bestimmtes Problem gelöst wird. Daher kann man nicht einfach eine Standardantwort auf Fragen geben wie,
    "Mal ne andere Frage ein Freund sagte das man das auch mit den namen in einer ini datei machen kann

    wie geht das??"

    Eine Vermutung meinerseits wäre, dass dein Freund meint, dass man die verschiedenen Namen, die man für die Videos benutzen möchte in einer Ini-Datei speichern könnte. Der einzige Vorteil gegen über einer Speicherung im Skript liegt darin, dass du die Namen auch bei einem kompeiliertem Skript noch ändern kannst, was aber eigentlich nur für den Endandwender Vorteile bringt.

  • GDI+ Snake (Funktioniert jetzt!)

    • oetzn
    • 20. Juni 2010 um 14:24

    Sorry für die Doppelposts, aber Edits werden bei den News nicht angezeigt, meinen Wissens nach zumindest!

    Hab jetzt die Performance verbessert. Der Array für die Ecken war versehentlich noch auf 999 Elemente definiert, was natürlich eine gewisse Zeit dauert, bis dieser abgearbeitet ist (noch dazu wenn die ersten 999 Elemente sinnlos überprüft werden^^)
    Hat jemand noch ne Idee, wie ich möglichst schnell ein Element aus dem zwei-dimensionalen Array löschen kann?
    Wenn ich es so belasse wie es jetzt ist, dann werden die Ecken, an denen schon alle Teile vorbei sind, einfach für nichtig erklärt indem die Richtung auf "" gesetzt wird. Dadurch erhöht sich aber die Größe des Arrays je länger man spielt bzw je nachdem wieviele Ecken man fährt. Deshalb möchte ich gerne die ungültigen Ecken einfach aus dem Array löschen. Die Frage ist, ob es möglich ist, ein Element aus einem zwei-dimensionalen Array so schnell zu löschen, dass man einen Geschwindigkeitsvorteil hat.

    Gibt ne viel einfachere Lösung, hab es jetzt so realisiert, dass die Laufvariable für die Ecken nicht immer bei 0 zu zählen beginnt, sondern erst bei der ersten noch gültigen Ecke. Somit bleibt die Anzahl der zudruchlaufenden Arrayelemente sehr gering.
    Neue Version Post #1

  • GDI+ Snake (Funktioniert jetzt!)

    • oetzn
    • 20. Juni 2010 um 13:38

    Neue Version siehe Post #1.

    Hab noch immer Probleme mit der Performance! Wenn die Schlange eine Länge von ca 30 Parts erreicht hat, benötigt,
    Der Kollisionscheck 17 ms
    Das Bewegen und Prüfen auf Ecken 97 ms
    Das Zeichnen 121 ms

    Hier steckt sicher noch Optimierungspotential drinnen, ein vorzeitiger Workaround wäre, wenn ich einfach ab einer bestimmten Länge ein Item anzeigen lassen würde, dass die Schlange verkürzt. Aber das wäre halt nur eine vorrübergehende Lösung.

  • GDI+ Snake (Funktioniert jetzt!)

    • oetzn
    • 20. Juni 2010 um 13:18

    Ich hab auch ein 64bit Windows, zwar XP aber naja.

    Versuch mal es als 32bit Application auszuführen. Kompeilier es als 32 bit und probier es dann. Vielleicht funktioniert das dann ja.

  • GDI+ Snake (Funktioniert jetzt!)

    • oetzn
    • 20. Juni 2010 um 12:58

    hä? gibts nich bei mir funktioniert..
    kleinen Moment..

    EDIT: Ich habs gerade getestet mit der Version aus Post #1 und mit der funktioniert es tadellos.

  • GDI+ Snake (Funktioniert jetzt!)

    • oetzn
    • 20. Juni 2010 um 12:12
    Zitat von Ineluki

    -mir ist die Schlange viiieeel zu langsam

    Kannst du in der Ini-Datei einstellen, Variable DefSpeed, aber das ist begrenzt nach oben, da am Ende der Berechnungsschleife ein Sleep steht das so aufgebaut ist:

    [autoit]

    Sleep(1000 / $iSpeed)

    [/autoit]

    und die Berechnung selbst benötigt ja auch eine gewisse Zeit.
    Das mit der globalen Variable ist wohl ein Flüchtigkeitsfehler :D

    name22 Hab das Problem erfasst und eine If-Abfrage eingebaut.
    Wegen dem extra Bitmap, wie meinst du das genau? Nochmal den Befehl

    [autoit]

    _GDIPlus_BitmapCreateFromGraphics

    [/autoit]

    anwenden? Ich muss ja auch irgendwie die Kollision mit der Mauer überprüfen. Wenn ich das mit dem neuen Bitmap mache, kann ich dann bei meiner Art die Welt zu erstellen bleiben (Mit dem zweidimensionalen Array?) ?

  • GDI+ Snake (Funktioniert jetzt!)

    • oetzn
    • 20. Juni 2010 um 12:05

    Hmm, naja da würde auch eine einfache If-Abfrage reichen um dies zu verhindern.
    Aber wie meinst du zu häufig? Ein grünes Teilchen hat genau die selbe Wahrscheinlichkeit wie ein rotes, gelbes oder ein blaues, nämlich 1/4 (Random zwischen 0 und 3)

    Edit: Vorpost wurde gelöscht..

  • GDI+ Snake (Funktioniert jetzt!)

    • oetzn
    • 20. Juni 2010 um 11:58

    So morgen Leute,

    Ich hab mir gedacht ich probier auch mal was in GDI+ und dabei ist dann das rausgekommen:

    Spoiler anzeigen
    [autoit]


    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Compression=4
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_UseX64=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.1
    Author: oetzn (autoit.de)

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

    Script Function:
    Snake Mini-Game

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

    TO-DO:
    * Items einbauen CHECK
    * Level einbauen
    * Verhältnis Normale Items | Special Items in Ini-Speichern (If Abfrage Random Wert)

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

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

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

    #include <GDIPlus.au3>
    #include <GUIConstants.au3>
    #include <Misc.au3>
    #include <WinAPI.au3>

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

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    Opt("GuiCloseOnEsc", 0)
    Opt("GuiOnEventMode", 1)
    Opt("TrayOnEventMode", 1)
    Opt("TrayMenuMode", 1)
    Opt("MustDeclareVars", 1)

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

    ; STRINGS
    Global Const $sTitle = "GDI+ SNAKE"
    Global Const $sIniPath = @ScriptDir & "\" & $sTitle & ".ini"
    Global Const $sString = "PRESS 'UP', 'DOWN', 'RIGHT' OR 'LEFT' TO BEGIN!"

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

    ; ARRAYS
    Global $aC[1][3]
    Global $aI[1][3]
    Global $aP[1][3]
    Global $aW[5][80][60] ; 5 Welten mit jeweils einer Größe von 80x60
    Global $aITyp[4][2] = [["FASTER", 0xFF0000FF],["SLOWER", 0xFFFFFF00],["DOUBLE", 0xFFFF0000],["HALF", 0xFF00FF00]]

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

    ; WORLD 0 (CROSS)
    For $i = 5 To 54
    $aW[0][40][$i] = 1
    Next

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

    For $i = 4 To 74
    $aW[0][$i][29] = 1
    Next

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

    ; GUI
    Global $GUIWidth = 320 * 3
    Global $GUIHeight = 240 * 3

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

    Local $hGUI, $hHelpGui, $hBitmap, $hBitmapWorld, $hGraphics, $hBuffer, $bBufferWorld, $hPenRed, $hPenGrey, $hPenBlue, $hPenGreen, $hPenYellow, $ButtonOK

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

    ; INTEGER
    Global $iSpeed
    Global $iDefSpeed
    Global $iDefParts
    Global $iParts
    Global $iSize
    Global $iMovement
    Global $iScaleFactor
    Global $iLevel
    Global $iGrowOnFeed
    Global $iTimerFaster
    Global $iTimerSlower
    Global $iSpeedFactor
    Global $iCornerStart = 0
    Local $iXTemp
    Local $iYTemp
    Local $i, $j

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

    ; BOOLEAN
    Global $bRunning = False
    Global $bPaused = False
    Global $bRestart = False
    Global $bFaster = False
    Global $bSlower = False

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

    ; FLOAT
    Global $PlayTimer
    Global $SpeedTimer

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

    ; INTERNAL USE
    Global $bTimerDebug = False
    Global $bElseDebug = True
    Global $bDebugParts = False
    Global $Timer

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

    ; READ INI
    $iDefSpeed = IniRead($sIniPath, "Values", "Speed", 10)
    $iDefParts = IniRead($sIniPath, "Values", "DefaultParts", 10)
    $iScaleFactor = IniRead($sTitle, "Values", "ScaleFactor", 1)
    $iGrowOnFeed = IniRead($sIniPath, "Values", "GrowOnFeed", 2)
    $iTimerFaster = IniRead($sIniPath, "Values", "TimeFaster", 10)
    $iTimerSlower = IniRead($sIniPath, "Values", "TimeSlower", 10)
    $iSpeedFactor = IniRead($sIniPath, "Values", "Speedfactor", 5)

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

    If $CmdLine[0] > 0 Then
    If Not IsNumber($CmdLine[1]) Then
    MsgBox(16, $sTitle, "ERROR!" & @CRLF & "Falscher Startparameter!")
    Exit
    ElseIf $CmdLine[1] > 5 Then
    MsgBox(16, $sTitle, "ERROR!" & @CRLF & "Maximale Levelanzahl: 5!")
    Exit
    Else
    $iLevel = $CmdLine[1]
    EndIf
    EndIf

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

    If Not IsNumber($iLevel) Then $iLevel = 0

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

    $iSpeed = $iDefSpeed
    $GUIWidth *= $iScaleFactor
    $GUIHeight *= $iScaleFactor
    $iSize = $GUIWidth / 80
    $iParts = $iDefParts
    $iMovement = $iSize

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

    $aP[0][0] = $iSize
    $aP[0][1] = $iSize

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

    _GDIPlus_Startup()

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

    $hGUI = GUICreate($sTitle, $GUIWidth, $GUIHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit", $hGUI)

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

    $hHelpGui = GUICreate($sTitle & " Hilfe", 368, 288, 200, 117)
    GUICtrlCreateGroup("Kommandozeilenparameter ", 8, 8, 353, 121)
    GUICtrlCreateLabel("Gültige Parameter sind natürliche Zahlen zwischen 0 und 5.", 16, 32, 284, 17)
    GUICtrlCreateLabel("Zum Beispiel:", 16, 56, 67, 17)
    GUICtrlCreateLabel("GDI+ Snake.exe 3", 88, 56, 92, 17)
    GUICtrlCreateLabel("GDI+ Snake.exe 0", 200, 56, 92, 17)
    GUICtrlCreateLabel("Kein Parameter entspricht dem Parameter 0.", 16, 80, 211, 17)
    GUICtrlCreateLabel("Der Parameter gibt die Welt an, die zu Spielbeginn geladen werden soll. ", 16, 104, 344, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlCreateGroup("Itemlegende ", 8, 136, 353, 113)
    GUICtrlCreateLabel("Ein rotes Item verdoppelt die Länge der Schlagen.", 16, 152, 240, 17)
    GUICtrlCreateLabel("Ein grünes Item halbiert die Länge der Schlagen.", 16, 176, 233, 17)
    GUICtrlCreateLabel("Ein blaues Item lässt die Schlange kurzzeitig schneller werden.", 16, 200, 298, 17)
    GUICtrlCreateLabel("Ein gelbes Item lässt die Schlange kurzzeitig langsamer werden.", 16, 224, 304, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $ButtonOK = GUICtrlCreateButton("OK", 136, 256, 75, 25, $WS_GROUP)
    GUICtrlSetOnEvent($ButtonOK, "_Help")

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

    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)

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

    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($GUIWidth, $GUIHeight, $hGraphics)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    $hBitmapWorld = _GDIPlus_BitmapCreateFromGraphics($GUIWidth, $GUIHeight, $hGraphics)
    $bBufferWorld = _GDIPlus_ImageGetGraphicsContext($hBitmapWorld)

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

    $hPenGrey = _GDIPlus_PenCreate(0xFF808080)
    $hPenBlue = _GDIPlus_PenCreate($aITyp[0][1])
    $hPenYellow = _GDIPlus_PenCreate($aITyp[1][1])
    $hPenRed = _GDIPlus_PenCreate($aITyp[2][1])
    $hPenGreen = _GDIPlus_PenCreate($aITyp[3][1])

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

    For $i = 0 To 79
    For $j = 0 To 59
    If $aW[$iLevel][$i][$j] == 1 Then
    _GDIPlus_GraphicsDrawRect($bBufferWorld, $i * $iSize, $j * $iSize, $iSize, $iSize, $hPenGrey)
    EndIf
    Next
    Next

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

    HotKeySet("p", "_Pause")
    HotKeySet("{F1}", "_Help")
    HotKeySet("{F2}","_PlaceItem")

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

    TrayTip($sTitle, $sString, 1)

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

    GUISetState(@SW_SHOW, $hGUI)

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

    While Not $bRunning
    Sleep(10)
    If _IsPressed(25) Or _IsPressed(26) Or _IsPressed(27) Or _IsPressed(28) Then $bRunning = True
    WEnd

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

    _PlaceItem()

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

    AdlibRegister("_CheckInput", 10)

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

    While 1

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

    If $bTimerDebug Then $Timer = TimerInit()
    _CheckCollision()
    _CheckTimer()
    If $bTimerDebug Then ConsoleWrite("COLLISION & TIMER CHECKING: " & TimerDiff($Timer) & @CRLF)

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

    If $bTimerDebug Then $Timer = TimerInit()

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

    For $i = 0 To UBound($aP, 1) - 1

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

    If $i == UBound($aP, 1) - 1 And $iParts > 0 Then
    $iXTemp = $aP[$i][0]
    $iYTemp = $aP[$i][1]
    EndIf

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

    Switch $aP[$i][2]
    Case "LEFT"
    $aP[$i][0] -= $iMovement
    Case "UP"
    $aP[$i][1] -= $iMovement
    Case "RIGHT"
    $aP[$i][0] += $iMovement
    Case "DOWN"
    $aP[$i][1] += $iMovement
    EndSwitch

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

    If $i == UBound($aP, 1) - 1 And $iParts > 0 Then
    ReDim $aP[UBound($aP, 1) + 1][3]
    $aP[UBound($aP, 1) - 1][0] = $iXTemp
    $aP[UBound($aP, 1) - 1][1] = $iYTemp
    $aP[UBound($aP, 1) - 1][2] = $aP[UBound($aP, 1) - 2][2]
    $iParts -= 1
    EndIf

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

    For $j = $iCornerStart To UBound($aC, 1) - 1
    Select
    Case $aC[$j][2] = ""
    ContinueLoop
    Case $aP[$i][0] == $aC[$j][0] And $aP[$i][1] == $aC[$j][1]
    $aP[$i][2] = $aC[$j][2]
    Select
    Case $i == UBound($aP, 1) - 1
    $iCornerStart = $j
    EndSelect
    EndSelect
    Next

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

    Next

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

    If $bTimerDebug Then ConsoleWrite("MOVING & CORNER & ADDING: " & TimerDiff($Timer) & @CRLF)

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

    If $bTimerDebug Then $Timer = TimerInit()

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

    _GDIPlus_GraphicsClear($hBuffer, 0xFFFFFFFF)

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

    For $i = 0 To UBound($aP, 1) - 1
    _GDIPlus_GraphicsDrawRect($hBuffer, $aP[$i][0], $aP[$i][1], $iSize, $iSize, 0)
    Next

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

    _DisplayItem()

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

    _GDIPlus_GraphicsDrawImageRect($hBuffer, $hBitmapWorld, 0, 0, $GUIWidth, $GUIHeight)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $GUIWidth, $GUIHeight)

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

    If $bTimerDebug Then ConsoleWrite("DRAWING EVERYTHING: " & TimerDiff($Timer) & @CRLF)
    If $bDebugParts Then ConsoleWrite("PARTS: " & UBound($aP,1) -1 & @TAB & "ECKEN: " & UBound($aC, 1) -1 & @CRLF & @CRLF)

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

    Sleep(1000 / $iSpeed)
    WEnd

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

    Func _Pause()
    If Not WinActive($sTitle) Then
    HotKeySet("p")
    Send("p")
    HotKeySet("p", "_Pause")
    Return
    EndIf

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

    $bPaused = Not $bPaused
    While $bPaused
    Sleep(100)
    WEnd
    EndFunc ;==>_Pause

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

    Func _CheckInput()
    If $bPaused Then Return
    Local $bPressed = True

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

    Select
    Case _IsPressed(25) = 1
    If $aP[0][2] <> "RIGHT" Then $aP[0][2] = "LEFT"
    Case _IsPressed(26) = 1
    If $aP[0][2] <> "DOWN" Then $aP[0][2] = "UP"
    Case _IsPressed(27) = 1
    If $aP[0][2] <> "LEFT" Then $aP[0][2] = "RIGHT"
    Case _IsPressed(28) = 1
    If $aP[0][2] <> "UP" Then $aP[0][2] = "DOWN"
    Case Else
    $bPressed = False
    EndSelect

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

    If $bPressed = False Then Return

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

    If $bElseDebug Then ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : UBound($aC, 1) - 1 = ' & UBound($aC, 1) - 1 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    ReDim $aC[UBound($aC, 1) + 1][3]
    If $bElseDebug Then ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : UBound($aC, 1) - 1 = ' & UBound($aC, 1) - 1 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $aC[UBound($aC, 1) - 1][0] = $aP[0][0]
    ;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $aC[UBound($aC, 1) - 1][0] = ' & $aC[UBound($aC, 1) - 1][0] & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $aC[UBound($aC, 1) - 1][1] = $aP[0][1]
    ;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $aC[UBound($aC, 1) - 1][1] = ' & $aC[UBound($aC, 1) - 1][1] & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $aC[UBound($aC, 1) - 1][2] = $aP[0][2]
    ;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $aC[UBound($aC, 1) - 1][2] = ' & $aC[UBound($aC, 1) - 1][2] & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    EndFunc ;==>_CheckInput

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

    Func _CheckCollision()
    If $aP[0][0] < 0 Or $aP[0][0] > $GUIWidth Or $aP[0][1] < 0 Or $aP[0][1] > $GUIHeight Then _GameOver()
    If Not $iParts > 0 Then
    For $i = 1 To UBound($aP, 1) - 1
    If $aP[0][0] = $aP[$i][0] And $aP[0][1] = $aP[$i][1] Then _GameOver()
    Next
    EndIf

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

    For $i = 0 To 79
    For $j = 0 To 59
    If $aW[$iLevel][$i][$j] == 1 Then
    If $aW[$iLevel][$i][$j] == 1 And $aP[0][0] == $i * $iSize And $aP[0][1] == $j * $iSize Then _GameOver()
    EndIf
    Next
    Next

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

    If $aP[0][0] = $aI[0][0] And $aP[0][1] = $aI[0][1] Then
    Switch $aI[0][2]
    Case "NORMAL"
    $iParts += $iGrowOnFeed

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

    Case $aITyp[0][0]
    $iSpeed *= $iSpeedFactor
    $bFaster = True
    $SpeedTimer = TimerInit()

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

    Case $aITyp[1][0]
    $iSpeed /= $iSpeedFactor
    $bSlower = True
    $SpeedTimer = TimerInit()

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

    Case $aITyp[2][0]
    $iParts += (UBound($aP, 1) - 1)

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

    Case $aITyp[3][0]
    ReDim $aP[(UBound($aP, 1) - 1) / 2][3]

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

    EndSwitch
    _PlaceItem()
    EndIf
    EndFunc ;==>_CheckCollision

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

    Func _CheckTimer()
    If $bFaster Then
    If TimerDiff($SpeedTimer) > $iTimerFaster * 1000 Then
    $iSpeed /= $iSpeedFactor
    $bFaster = False
    EndIf
    EndIf

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

    If $bSlower Then
    If TimerDiff($SpeedTimer) > $iTimerSlower * 1000 Then
    $iSpeed *= $iSpeedFactor
    $bSlower = False
    EndIf
    EndIf
    EndFunc ;==>_CheckTimer

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

    Func _PlaceItem()
    Local $iRandom = Random(0, 10, 1)
    ;~ Local $iRandom = 8
    Local $iX
    Local $iY
    Local $bDisplay = False
    Local $bValid = False

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

    Do

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

    $iX = Random(5, 75, 1)
    $iY = Random(5, 55, 1)

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

    For $i = 0 To UBound($aP, 1) - 1
    If $aP[$i][0] <> $iX * $iSize And $aP[$i][1] <> $iY * $iSize And $aW[$iLevel][$iX][$iY] <> 1 Then
    $bDisplay = True
    ExitLoop
    EndIf
    Next

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

    Until $bDisplay = True

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

    $aI[0][0] = $iX * $iSize
    $aI[0][1] = $iY * $iSize

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

    If $iRandom < 7 Then
    $aI[0][2] = "NORMAL"
    Else
    Do
    $iRandom = Random(0, 3, 1)
    ;~ $iRandom = 2
    Switch $bFaster
    Case True
    If $iRandom <> 0 Then $bValid = True
    Case False
    $bValid = True
    EndSwitch

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

    Switch $bSlower
    Case True
    If $iRandom <> 1 Then $bValid = True
    Case False
    $bValid = True
    EndSwitch

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

    If $iRandom = 3 And UBound($aP, 1) - 1 = 1 Then $bValid = False

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

    Until $bValid = True

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

    $aI[0][2] = $aITyp[$iRandom][0]
    EndIf
    EndFunc ;==>_PlaceItem

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

    Func _DisplayItem()
    Switch $aI[0][2]
    Case "NORMAL"
    _GDIPlus_GraphicsFillRect($hBuffer, $aI[0][0], $aI[0][1], $iSize, $iSize)
    Case $aITyp[0][0]
    _GDIPlus_GraphicsFillRect($hBuffer, $aI[0][0], $aI[0][1], $iSize, $iSize, $hPenBlue)
    Case $aITyp[1][0]
    _GDIPlus_GraphicsFillRect($hBuffer, $aI[0][0], $aI[0][1], $iSize, $iSize, $hPenRed)
    Case $aITyp[2][0]
    _GDIPlus_GraphicsFillRect($hBuffer, $aI[0][0], $aI[0][1], $iSize, $iSize, $hPenYellow)
    Case $aITyp[3][0]
    _GDIPlus_GraphicsFillRect($hBuffer, $aI[0][0], $aI[0][1], $iSize, $iSize, $hPenGreen)
    EndSwitch
    EndFunc ;==>_DisplayItem

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

    Func _Help()
    If Not WinActive($sTitle) Then
    HotKeySet("{F1}")
    Send("{F1}")
    HotKeySet("{F1}", "_Help")
    Return
    EndIf

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

    Switch _WinAPI_IsWindowVisible($hHelpGui)
    Case True
    GUISetState(@SW_HIDE, $hHelpGui)
    Case False
    GUISetState(@SW_SHOW, $hHelpGui)
    EndSwitch
    EndFunc ;==>_Help
    Func _GameOver()
    If MsgBox(4, $sTitle, "GAME OVER" & @CR & "TRY AGAIN?") = 6 Then $bRestart = True
    _Exit()
    EndFunc ;==>_GameOver

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

    Func _Exit()
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    IniWrite($sIniPath, "Values", "Speed", $iDefSpeed)
    IniWrite($sIniPath, "Values", "DefaultParts", $iDefParts)
    IniWrite($sIniPath, "Values", "ScaleFactor", $iScaleFactor)
    IniWrite($sIniPath, "Values", "GrowOnFeed", $iGrowOnFeed)
    IniWrite($sIniPath, "Values", "TimeFaster", $iTimerFaster)
    IniWrite($sIniPath, "Values", "TimeSlower", $iTimerSlower)
    IniWrite($sIniPath, "Values", "Speedfactor", $iSpeedFactor)
    If $bRestart Then ShellExecute(@ScriptFullPath)
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Es funktioniert auch schon ganz gut, nur die Performance ist das Problem. Sobald die Schlange länger als 20 - 30 Teile ist, braucht das Skript ewig (3-5 ms) um EINEN Part auf eine ECKE zu überprüfen.
    Vielleicht kann sich ja das mal jemand ansehen und mir Optimierungsmöglickeiten vorschlagen. Wie gesagt, das Hauptproblem ist die Überprüfung, ob ein Teil (Part) der Schlange grade bei einer Ecke ist und somit abbiegen muss.

    kleine Erklärung:
    $aP = Array mit den Parts
    $aW = Array mit der Welt
    $aI = Array mit den Items
    $aC = Array mit den Ecken
    $aITyp = Array mit den Itemtypen

    $aP, $aC sind so aufgebaut, dass im 1. Element (Index 0) der 2. Dimension ( also [0][0] zB) die x-Koordinate steht und im 2. Element (Index 1) die y-Koordinate. Im dritten Element (Index 2) steht entweder "LEFT, RIGHT, UP oder DOWN".
    Beim Array der Teile gibt dies die Richtung an, in die sich ein Teil bewegt. Bei den Ecken gibt dieser Teil an, in welche Richtung sich ein Teil weiterbewegen muss, wenn er zu einer Ecke kommt.

    Ich hoffe das erleichtert das Verständnis ein bisschen.

    Noch eine Frage zum Schluss, hat jemand eine bessere Idee, wie ich die Welt noch zeichnen könnte? (So wie es jetzt ist, dauert es 25 ms pro Durchlauf)

    Danke schon mal im Vorraus.

    mfg oetzn

    TO-DO:
    * Mehrere Welten einbauen
    * Punktezähler einbauen

    EDIT: 20. Juni 12:14:
    Ausgebesserte Version hochgeladen. Bug gefixt, dass die Schlange eine Länge von 0 erreichen kann.
    EDIT: 20. Juni 12:59:
    Dateianhang hinzugefügt.
    EDIT: 20. Juni 13:31:
    Hinzugefügt: Bei F2 wird das Item neu gezeichnet, da es vorkommen kann, dass kein Item erscheint.
    Verbessert: Eigene Bitmap für die Welt ( name22, meintest du das so, wie ich es jetzt realisiert habe?)
    Dateianhang upgedatet!
    EDIT: 20. Juni 14:11:
    Performance verbessert. Hatte den Ecken-Array noch auf 999 Elemente definiert, wodurch die Eckenüberprüfung lange dauerte.
    EDIT: 20. Juni 14:28:
    Geschwindigkeit des Spiels ist nun (fast) unabhängig von der Anzahl der Elemente. Diese Version würde ich nun als Alpha bezeichnen :D

    Dateien

    Snake.au3 12,71 kB – 496 Downloads Snake_14-11.au3 13,61 kB – 475 Downloads Snake_14-29.au3 13,65 kB – 502 Downloads
  • Arrays?? wie funktionieren sie??

    • oetzn
    • 17. Juni 2010 um 20:21

    einfach den Namen des zuletzt gespeichertern in einem Array speichern bzw in einer Variable..

  • _Radio UDF

    • oetzn
    • 13. Juni 2010 um 14:30

    Ich würd nicht unbedingt ein EXIT in eine UDF einbauen^^
    Das kommt eher nicht so gut, denn was soll es denn bringen wenn sich bei einem Error gleich das ganze Skript beendet? Da du eine Fehlerabfrage machst (If $bla = "" Then...) genügt es SetError anzuwenden, was du ja auch machst, daher würd ich die EXITs wieder rausnehmen..

  • Arrays?? wie funktionieren sie??

    • oetzn
    • 10. Juni 2010 um 18:23

    Is doch eh in der Hilfe genau beschrieben...
    du findest ihn unter "Gui OnEvent Mode"! -> Lesen dann fragen stellen^^

  • PixelGetColor Frage! - Keine NoobFrage

    • oetzn
    • 9. Juni 2010 um 19:11

    Überleg dir einfach in der Theorie wie du das von Hand machen würdst, wenn du jedes Pixel überprüfst, dann kommst sicher auf eine Lösung^^

  • WICHTIGE FRAGE ZU gui!!

    • oetzn
    • 7. Juni 2010 um 19:25

    Angenommen du hast 30 Labels und willst überall die selbe Schrift haben, aber nur bei den Labels, dann müsstest du eigentlich den Befehl auf jedes anwenden und er wollte wissen ob das auch kürzer geht => CTRL-IDs in Array speichern => For-Schleife ist der einzige kürzere Weg..

  • WICHTIGE FRAGE ZU gui!!

    • oetzn
    • 7. Juni 2010 um 19:18

    Alle Control-IDs von Labels etc wo du das halt haben willst in einem Array speichern und mit einer For-Schleife den GuiCtrlSetFont Befehl anwenden..

  • Arrays?? wie funktionieren sie??

    • oetzn
    • 7. Juni 2010 um 17:22

    Naja, du kannst dir ja mal die FPS anzeigen lassen (TrayTip zB)
    Wenn du die FPS einstellen willst, musst du das so machen:

    [autoit]


    $iFPS = 30 ; Das sind die gemessenen FPS
    $iFPSNew = 25 ; Das sind die FPS die du zum Schluss haben willst

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

    Func _CalcSleep($iFPSIn, $iFPSOut)
    Local $iSleep
    Return $iSleep = ( 1 - $iFPSIn / $iFPSOut ) / $iFPSOut
    Endfunc

    [/autoit]

    Müsste stimmen, falls nicht, bitte korrigieren.
    Das Ganze müsstest du dann so bauen:

    [autoit]


    While 1

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

    _CaptureImage() ; Bild aufnehmen..
    Sleep(_CalcSleep(_GetFPS, $iNewFPS))

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

    Wend

    [/autoit]


    Wobei hier $iNewFPS die FPS sind die du haben möchtest und _GetFPS die aktuellen FPS misst..

  • Arrays?? wie funktionieren sie??

    • oetzn
    • 7. Juni 2010 um 16:02

    Willst du die FPS nur messen oder einstellen?
    Wenn du sie nur messen willst dann geht das mit TimerInit, weil FPS = Bilder PRO Sekunde, wenn du die Zeit misst in der 1 Bild gemacht wird, kannst du dir ausrechnen, wieviele Bilder pro Sekunde gemacht werden (1000 / Timerdiff() ) wie mein Vorposter schon geschrieben hat..
    Wenn du die FPS steuern willst, wird das ganze etwas schwieriger, ich hätte da mit Sleep gearbeitet, aber mehr als (1000 / Zeit für ein Bild in Millisekunden) FPS wirst du nicht schaffen, und btw 5 FPS sind verdammt wenig, das menschliche Auge sieht eine Bewegung ab 23.97 FPS flüssig..

  • TCP Startup

    • oetzn
    • 7. Juni 2010 um 15:26
    Zitat von Nighty

    dient lediglich zur Überprüfung welcher PC eingeschalten ist

    Wieso machst du das dann mit TCP? Mit Ping geht es doch viel einfacher^^

    [autoit]


    Local $aIP[10] = ["192.168.0.1","..","..","..","..","..","..","..","..",".."]
    Local $iTimeout = 200 ; in ms
    For $i=0 to UBound($aIP,1) -1
    If Ping($aIP[$i],$iTimeout) > 0 Then
    ; Aktion ausführen falls erfolgreich
    Else
    ; Aktion ausführen falls nicht erfolgreich
    EndIf
    Next

    [/autoit]
  • falls process existiert cmdline weitergeben

    • oetzn
    • 3. Juni 2010 um 19:57

    Die einfachste Möglichkeit wäre, mit _Singleton auf eine 2. Instanz prüfen und dann die Parameter in eine Textdatei schreiben => 1.Inst wartet auf eine Textdatei, liest diese aus und löscht sie wieder, während sich die 2. Inst nach schreiben der Textdatei wieder beendet!

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™