Bild bewegen

  • Hallo,
    ich will ein Spiel aus langeweile schreiben und stoße schon an ein Problem.
    Wenn ich mit meinem Raumschiff schiesen will, dann fliegt die kugel nach oben, und wenn ich dann nochmal schiesen will dann bleibt die stehen und die neu fliegt weiter oder die erste Kugel fliegt zu Ende und die neue Kugel wartet auf die davor und fliegt erst weiter wenn die erste weg ist.
    Wie krige ich nun hin das die sofort hintereinander fliegen ?

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <Misc.au3>
    #include <GUIConstantsEx.au3>
    Global $timer = 0
    Global $schusse[1], $schuss[2]

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Spiel", 633, 447)
    GUISetBkColor(0x000000)
    $raumschiff = GUICtrlCreatePic(@ScriptDir & "\img\raumschiff.jpg", 10, 410, 50, 30)
    $schuss[1] = GUICtrlCreatePic(@ScriptDir & "\img\schuss.JPG", 33, 393, 5, 15)
    GUICtrlSetState (-1,$GUI_HIDE)
    $gegner = GUICtrlCreatePic("", 40, 64, 52, 28)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    If _IsPressed(20) Then
    While _IsPressed(20)
    Sleep(100)
    WEnd
    For $i = 1 To UBound($schuss) - 1
    If GUICtrlGetState($schuss[$i]) <> 80 Then
    GUICtrlSetState($schuss[$i], $GUI_SHOW)
    $timer = TimerInit()
    Else
    $schuss[$i] = GUICtrlCreatePic(@ScriptDir & "\img\schuss.JPG", 33, 393, 5, 15)
    _ArrayAdd($schuss, "")
    _ArrayAdd($schusse, "")
    EndIf
    Next
    EndIf
    For $i = 1 To UBound($schusse) - 1
    If GUICtrlGetState($schuss[$i]) = 80 Then
    If TimerDiff($timer) >= 100 Then
    $schuss_pos = ControlGetPos($Form1, "", $schuss[$i])
    GUICtrlSetPos($schuss[$i], $schuss_pos[0], $schuss_pos[1] - 17)
    If $schuss_pos[1] <= 0 Then
    GUICtrlSetPos($schuss[$i], $schuss_pos[0], 393)
    GUICtrlSetState($schuss[$i], $GUI_HIDE)
    GUICtrlDelete($schuss[$i])
    _ArrayDelete($schuss, "")
    _ArrayDelete($schusse, "")
    EndIf
    $timer = TimerInit()
    EndIf
    EndIf
    Next
    ToolTip(UBound($schuss) & @CRLF & UBound($schusse), 0, 0)
    WEnd

    [/autoit]
  • Bei mir geht genau das 8|
    Das geht bei mir:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <Misc.au3>
    #include <GUIConstantsEx.au3>
    Global $timer = 0
    Global $schusse[1], $schuss[2]

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Spiel", 633, 447)
    GUISetBkColor(0x000000)
    $raumschiff = GUICtrlCreatePic(@ScriptDir & "\img\raumschiff.jpg", 10, 410, 50, 30)
    $schuss[1] = GUICtrlCreatePic(@ScriptDir & "\img\schuss.JPG", 33, 393, 5, 15)
    GUICtrlSetState (-1,$GUI_HIDE)
    $gegner = GUICtrlCreatePic("", 40, 64, 52, 28)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    If _IsPressed(20) Then
    While _IsPressed(20)
    Sleep(100)
    WEnd
    For $i = 1 To UBound($schuss) - 1
    If GUICtrlGetState($schuss[$i]) <> 80 Then
    GUICtrlSetState($schuss[$i], $GUI_SHOW)
    $timer = TimerInit()
    $schuss[$i] = GUICtrlCreatePic(@ScriptDir & "\img\schuss.JPG", 33, 393, 5, 15)
    _ArrayAdd($schuss, "")
    _ArrayAdd($schusse, "")
    EndIf
    Next
    EndIf
    For $i = 1 To UBound($schusse) - 1
    If GUICtrlGetState($schuss[$i]) = 80 Then
    If TimerDiff($timer) >= 100 Then
    $schuss_pos = ControlGetPos($Form1, "", $schuss[$i])
    GUICtrlSetPos($schuss[$i], $schuss_pos[0], $schuss_pos[1] - 17)
    If $schuss_pos[1] <= 0 Then
    GUICtrlSetPos($schuss[$i], $schuss_pos[0], 393)
    GUICtrlSetState($schuss[$i], $GUI_HIDE)
    GUICtrlDelete($schuss[$i])
    _ArrayDelete($schuss, "")
    _ArrayDelete($schusse, "")
    EndIf
    $timer = TimerInit()
    EndIf
    EndIf
    Next
    ToolTip(UBound($schuss) & @CRLF & UBound($schusse), 0, 0)
    WEnd

    [/autoit]
  • Ich bin vielleicht doof...
    Ich hab jetzt erst gesehen, dass du bei den Pfaden noch ein img davor gesetzt hast. :D
    Ich dachte zuerst, dass wird ein größeres Projekt, da ich Begriffe wie Raumschiff o.Ä. gelesen habe. ^^ Deswegen habe ich dir auch GDI+ empfohlen...

    Wieso verwendest du eigentlich Arrays, wenn man sowieso nur einen Schuss abgeben kann solange der andere nicht verschwunden ist?

    Ach so das ist ja gar nicht gewollt. :wacko:

    Ich glaube immer noch, dass das einfacher in GDI+ zu realisieren ist... Wenn du möchtest könnte ich dir dabei helfen.

  • Ich will ja mehrer Schüsse abgeben ^^
    Er soll Max 5 Schüsse abgeben aber ich kriege nichtmal 2 hin :(


    Über das Forum könnte das glaube ich nichts werden ^^
    Wennschon dann über ICQ da kann ich dir 12345678 Fragen stellen ohne immer ein Post zu machen :D:D:D:D:D

  • Tadaaa :P
    Nur um zu zeigen, dass GDI+ dafür besser geeignet ist. ^^

    Spoiler anzeigen
    [autoit]

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

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

    $iGUIWidth = 400
    $iGUIHeight = 400
    $GUIColorBG = 0xFF000000

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

    $iShots = 0
    $iMaxShots = 5
    $iShotSpeed = 5
    $iCoolDownTime = 500
    $iTimerShot = $iCoolDownTime * - 1

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

    $hWnd = GUICreate("Test", $iGUIWidth, $iGUIHeight)
    GUISetState()

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

    _GDIPlus_Startup()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iGUIWidth, $iGUIHeight, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)
    _GDIPlus_GraphicsClear($hGraphic, $GUIColorBG)

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

    $hImage_Ship = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Raumschiff.jpg")
    $hBrush_Shot = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)

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

    Dim $aShot[2][2]

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

    $iX_Ship = $iGUIWidth / 2 - 25
    $iY_Ship = $iGUIHeight - 30

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

    AdlibRegister("_ReDraw", 20)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    AdlibUnRegister()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_ImageDispose($hImage_Ship)
    _GDIPlus_BrushDispose($hBrush_Shot)
    _GDIPlus_Shutdown()
    Exit
    EndSwitch
    WEnd

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

    Func _ReDraw()
    If _IsPressed("27") And $iX_Ship > 0 Then $iX_Ship += 2
    If _IsPressed("25") And $iX_Ship < $iGUIWidth Then $iX_Ship -= 2
    If _IsPressed("20") And TimerDiff($iTimerShot) >= $iCoolDownTime And UBound($aShot) < $iMaxShots Then
    _Array2DAdd($aShot, $iX_Ship + 23 & "|" & $iY_Ship - 10)
    $iTimerShot = TimerInit()
    EndIf

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

    _GDIPlus_GraphicsClear($hBuffer, $GUIColorBG)
    For $i = 1 To UBound($aShot) - 1
    If $aShot[$i][1] <> "" Then
    _GDIPlus_GraphicsFillRect($hBuffer, $aShot[$i][0], $aShot[$i][1], 5, 10, $hBrush_Shot)
    $aShot[$i][1] -= $iShotSpeed
    EndIf
    Next
    For $i = 1 To UBound($aShot) - 1
    If $aShot[$i][1] <= 0 Then
    _Array2DDelete($aShot, $i)
    ExitLoop
    EndIf
    Next
    _GDIPlus_GraphicsDrawImageRect($hBuffer, $hImage_Ship, $iX_Ship, $iY_Ship, 50, 30)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iGUIWidth, $iGUIHeight)
    EndFunc ;==>_ReDraw

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

    ;------------------------------------------------------------------------------------------------------------
    ;
    ; Function _Array2DAdd(ByRef $avArray, $sValue='')
    ;
    ; Description Redim Array Size and add an Array element at last position
    ; Works with any occurences in 2nd Dimension
    ; Works also with 1D-Array
    ;
    ; Parameter $avArray Given Array
    ; optional $sValue Value of new Element, parts must be seperate with '|'
    ;
    ; Return Succes -1
    ; Failure 0 and set @error
    ; @error = 1 given array is not array
    ; @error = 2 given parts of Element too less/much
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;------------------------------------------------------------------------------------------------------------
    Func _Array2DAdd(ByRef $avArray, $sValue='')
    If ( Not IsArray($avArray) ) Then
    SetError(1)
    Return 0
    EndIf
    Local $i
    Local $UBound2nd = UBound($avArray,2)
    If @error = 2 Then
    ReDim $avArray[UBound($avArray)+1]
    $avArray[UBound($avArray)-1] = $sValue
    Else
    Local $arValue
    ReDim $avArray[UBound($avArray)+1][$UBound2nd]
    If $sValue = '' Then
    For $i = 0 To $UBound2nd-2
    $sValue &= '|'
    Next
    EndIf
    $arValue = StringSplit($sValue, '|')
    If $arValue[0] <> $UBound2nd Then
    SetError(2)
    Return 0
    EndIf
    For $i = 0 To $UBound2nd-1
    $avArray[UBound($avArray)-1][$i] = $arValue[$i+1]
    Next
    EndIf
    Return -1
    EndFunc ;==>_Array2DAdd

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

    ;----------------------------------------------------------------------------------------------------------------------
    ; Fuction _Array2DDelete(ByRef $ARRAY, $iDEL)
    ;
    ; Description Delete one row on a given index in an 1D/2D -Array
    ;
    ; Parameter $ARRAY the array, where one row will deleted
    ; $iDEL Row-Index to delete
    ;
    ; Return Succes -1 ByRef $ARRAY
    ; Failure 0 set @error = 1; given array are not array
    ; set @error = 2; index is out of range
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;----------------------------------------------------------------------------------------------------------------------
    Func _Array2DDelete(ByRef $ARRAY, $iDEL)
    If ( Not IsArray($ARRAY) ) Then
    SetError(1)
    Return 0
    EndIf
    If ( $iDEL < 0 ) Or ( $iDEL > UBound($ARRAY)-1 ) Then
    SetError(2)
    Return 0
    EndIf
    Local $i, $k, $l
    Local $UBound2nd = UBound($ARRAY,2)
    If @error = 2 Then
    Local $arTmp[UBound($ARRAY)-1]
    $k = 0
    For $i = 0 To UBound($ARRAY)-1
    If $i <> $iDEL Then
    $arTmp[$k] = $ARRAY[$i]
    $k += 1
    EndIf
    Next
    Else
    Local $arTmp[UBound($ARRAY)-1][$UBound2nd]
    $k = 0
    For $i = 0 To UBound($ARRAY)-1
    If $i <> $iDEL Then
    For $l = 0 To $UBound2nd-1
    $arTmp[$k][$l] = $ARRAY[$i][$l]
    Next
    $k += 1
    EndIf
    Next
    EndIf
    $ARRAY = $arTmp
    Return -1
    EndFunc ;==>_Array2DDelete

    [/autoit]


    Ich hätte schon Lust auf so einen Retro Shooter, aber über die 12345678 Fragen müssen wir noch mal reden. ^^

  • Ich hatte nur die zwei If Abfragen bei _IsPressed vertauscht :D
    So stimmt es und man kann nicht zur Seite raus:

    Spoiler anzeigen
    [autoit]

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

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

    $iGUIWidth = 400
    $iGUIHeight = 400
    $GUIColorBG = 0xFF000000

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

    $iShots = 0
    $iMaxShots = 5
    $iShotSpeed = 5
    $iCoolDownTime = 500
    $iTimerShot = $iCoolDownTime * - 1

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

    $hWnd = GUICreate("Test", $iGUIWidth, $iGUIHeight)
    GUISetState()

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

    _GDIPlus_Startup()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iGUIWidth, $iGUIHeight, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)
    _GDIPlus_GraphicsClear($hGraphic, $GUIColorBG)

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

    $hImage_Ship = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Raumschiff.jpg")
    $hBrush_Shot = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)

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

    Dim $aShot[2][2]

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

    $iX_Ship = $iGUIWidth / 2 - 25
    $iY_Ship = $iGUIHeight - 30

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

    AdlibRegister("_ReDraw", 20)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    AdlibUnRegister()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_ImageDispose($hImage_Ship)
    _GDIPlus_BrushDispose($hBrush_Shot)
    _GDIPlus_Shutdown()
    Exit
    EndSwitch
    WEnd

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

    Func _ReDraw()
    If _IsPressed("27") And $iX_Ship < $iGUIWidth - 50 Then $iX_Ship += 2
    If _IsPressed("25") And $iX_Ship > 0 Then $iX_Ship -= 2
    If _IsPressed("20") And TimerDiff($iTimerShot) >= $iCoolDownTime And UBound($aShot) < $iMaxShots Then
    _Array2DAdd($aShot, $iX_Ship + 23 & "|" & $iY_Ship - 10)
    $iTimerShot = TimerInit()
    EndIf

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

    _GDIPlus_GraphicsClear($hBuffer, $GUIColorBG)
    For $i = 1 To UBound($aShot) - 1
    If $aShot[$i][1] <> "" Then
    _GDIPlus_GraphicsFillRect($hBuffer, $aShot[$i][0], $aShot[$i][1], 5, 10, $hBrush_Shot)
    $aShot[$i][1] -= $iShotSpeed
    EndIf
    Next
    For $i = 1 To UBound($aShot) - 1
    If $aShot[$i][1] <= 0 Then
    _Array2DDelete($aShot, $i)
    ExitLoop
    EndIf
    Next
    _GDIPlus_GraphicsDrawImageRect($hBuffer, $hImage_Ship, $iX_Ship, $iY_Ship, 50, 30)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iGUIWidth, $iGUIHeight)
    EndFunc ;==>_ReDraw

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

    ;------------------------------------------------------------------------------------------------------------
    ;
    ; Function _Array2DAdd(ByRef $avArray, $sValue='')
    ;
    ; Description Redim Array Size and add an Array element at last position
    ; Works with any occurences in 2nd Dimension
    ; Works also with 1D-Array
    ;
    ; Parameter $avArray Given Array
    ; optional $sValue Value of new Element, parts must be seperate with '|'
    ;
    ; Return Succes -1
    ; Failure 0 and set @error
    ; @error = 1 given array is not array
    ; @error = 2 given parts of Element too less/much
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;------------------------------------------------------------------------------------------------------------
    Func _Array2DAdd(ByRef $avArray, $sValue='')
    If ( Not IsArray($avArray) ) Then
    SetError(1)
    Return 0
    EndIf
    Local $i
    Local $UBound2nd = UBound($avArray,2)
    If @error = 2 Then
    ReDim $avArray[UBound($avArray)+1]
    $avArray[UBound($avArray)-1] = $sValue
    Else
    Local $arValue
    ReDim $avArray[UBound($avArray)+1][$UBound2nd]
    If $sValue = '' Then
    For $i = 0 To $UBound2nd-2
    $sValue &= '|'
    Next
    EndIf
    $arValue = StringSplit($sValue, '|')
    If $arValue[0] <> $UBound2nd Then
    SetError(2)
    Return 0
    EndIf
    For $i = 0 To $UBound2nd-1
    $avArray[UBound($avArray)-1][$i] = $arValue[$i+1]
    Next
    EndIf
    Return -1
    EndFunc ;==>_Array2DAdd

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

    ;----------------------------------------------------------------------------------------------------------------------
    ; Fuction _Array2DDelete(ByRef $ARRAY, $iDEL)
    ;
    ; Description Delete one row on a given index in an 1D/2D -Array
    ;
    ; Parameter $ARRAY the array, where one row will deleted
    ; $iDEL Row-Index to delete
    ;
    ; Return Succes -1 ByRef $ARRAY
    ; Failure 0 set @error = 1; given array are not array
    ; set @error = 2; index is out of range
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;----------------------------------------------------------------------------------------------------------------------
    Func _Array2DDelete(ByRef $ARRAY, $iDEL)
    If ( Not IsArray($ARRAY) ) Then
    SetError(1)
    Return 0
    EndIf
    If ( $iDEL < 0 ) Or ( $iDEL > UBound($ARRAY)-1 ) Then
    SetError(2)
    Return 0
    EndIf
    Local $i, $k, $l
    Local $UBound2nd = UBound($ARRAY,2)
    If @error = 2 Then
    Local $arTmp[UBound($ARRAY)-1]
    $k = 0
    For $i = 0 To UBound($ARRAY)-1
    If $i <> $iDEL Then
    $arTmp[$k] = $ARRAY[$i]
    $k += 1
    EndIf
    Next
    Else
    Local $arTmp[UBound($ARRAY)-1][$UBound2nd]
    $k = 0
    For $i = 0 To UBound($ARRAY)-1
    If $i <> $iDEL Then
    For $l = 0 To $UBound2nd-1
    $arTmp[$k][$l] = $ARRAY[$i][$l]
    Next
    $k += 1
    EndIf
    Next
    EndIf
    $ARRAY = $arTmp
    Return -1
    EndFunc ;==>_Array2DDelete

    [/autoit]
  • Nun ja, GDI+ ist dar eigentlich nicht so viel drinne! Es werden ja nur Linien und Punkte gezeichnet!

    Die eigentliche Herausforderung ist das Verwalten aller Objekte, Kollision, Berechnungen, etc. ;)

    Ich weiß auch nicht, ob das Skript einigermaßen verständlich ist!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯