Seite 1 von 1

DisplaySprite mit gewollter Verzögerung

Verfasst: 10.03.2022 09:51
von Andi
Hi,
ich habe eine Art Tetris programmiert. Das funktioniert auch alles sehr gut. Aber ich möchte, dass die neue Position von Sprites, nachdem es ein Löschen der Sprites mit gleicher Farbe gegeben hat, mit etwas Verzögerung angezeigt wird - also eine Art Animation.

Im nachfolgenden Code habe ich mal das Problem auf den Kern reduziert, wie ich hoffe. Es werden drei Boxes mit unterschiedlicher Farbe angezeigt.
Wie kann ich erreichen, dass sie beim Starten des Codes nacheinander (beispielsweise mit 1 sec Abstand) angezeigt werden?

Code: Alles auswählen

Screen_Width = GetSystemMetrics_(#SM_CXSCREEN) 
Screen_Height = GetSystemMetrics_(#SM_CYSCREEN) 
Define Resolution.DEVMODE
Resolution.DEVMODE\dmSize = SizeOf(DEVMODE)
If EnumDisplaySettings_(0, #ENUM_REGISTRY_SETTINGS, @Resolution)
   col_depth = Resolution\dmBitsPerPel
EndIf

Enumeration
#sprite1
#sprite2
#sprite3
EndEnumeration

InitSprite()
InitKeyboard()

OpenScreen(Screen_Width, Screen_Height, col_depth, "Sprite-Example")

CreateSprite(#sprite1, 50, 50)
   StartDrawing( SpriteOutput(#sprite1) )
      Box(0, 0, 50, 50, #Red)
   StopDrawing()

CreateSprite(#sprite2, 50, 50)
   StartDrawing( SpriteOutput(#sprite2) )
      Box(0, 0, 50, 50, #Blue)
   StopDrawing()

CreateSprite(#sprite3, 50, 50)
   StartDrawing( SpriteOutput(#sprite3) )
      Box(0, 0, 50, 50, #Magenta)
   StopDrawing()

Repeat   
    ClearScreen(RGB(0,0,0)) 
    DisplaySprite(#sprite1, Screen_Width/2, 250)
    DisplaySprite(#sprite2, Screen_Width/2, 350)
    DisplaySprite(#sprite3, Screen_Width/2, 450)
    FlipBuffers()
    ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)

Re: DisplaySprite mit gewollter Verzögerung

Verfasst: 10.03.2022 12:51
von Demivec
Verwenden von ElapseMilliseconds():

Code: Alles auswählen

Screen_Width = GetSystemMetrics_(#SM_CXSCREEN) 
Screen_Height = GetSystemMetrics_(#SM_CYSCREEN) 
Define Resolution.DEVMODE
Resolution.DEVMODE\dmSize = SizeOf(DEVMODE)
If EnumDisplaySettings_(0, #ENUM_REGISTRY_SETTINGS, @Resolution)
   col_depth = Resolution\dmBitsPerPel
EndIf

Enumeration
#sprite1
#sprite2
#sprite3
EndEnumeration

InitSprite()
InitKeyboard()

OpenScreen(Screen_Width, Screen_Height, col_depth, "Sprite-Example")

CreateSprite(#sprite1, 50, 50)
   StartDrawing( SpriteOutput(#sprite1) )
      Box(0, 0, 50, 50, #Red)
   StopDrawing()

CreateSprite(#sprite2, 50, 50)
   StartDrawing( SpriteOutput(#sprite2) )
      Box(0, 0, 50, 50, #Blue)
   StopDrawing()

CreateSprite(#sprite3, 50, 50)
   StartDrawing( SpriteOutput(#sprite3) )
      Box(0, 0, 50, 50, #Magenta)
   StopDrawing()
   
Define startTime = ElapsedMilliseconds(), elapsedSeconds.f, elapsedFractionalSeconds.f
Repeat   
    ClearScreen(RGB(0,0,0)) 
    elapsedSeconds = (ElapsedMilliseconds() - startTime) / 1000 ;  1 second = 1000 ms
    elapsedFractionalSeconds = elapsedSeconds - Int(elapsedSeconds)
    If elapsedSeconds > 0 
       If elapsedSeconds < 1
          DisplayTransparentSprite(#sprite1, Screen_Width/2, 250, 255 * elapsedFractionalSeconds)
       Else
          DisplaySprite(#sprite1, Screen_Width/2, 250)
       EndIf
    EndIf

    If elapsedSeconds > 1
       If elapsedSeconds < 2
          DisplayTransparentSprite(#sprite2, Screen_Width/2, 350, 255 * elapsedFractionalSeconds)
       Else
          DisplaySprite(#sprite2, Screen_Width/2, 350)
       EndIf
    EndIf

    If elapsedSeconds > 2
       If elapsedSeconds < 3
          DisplayTransparentSprite(#sprite3, Screen_Width/2, 450, 255 * elapsedFractionalSeconds)
       Else
          DisplaySprite(#sprite3, Screen_Width/2, 450)
       EndIf
    EndIf
  
    FlipBuffers()
    ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)

Re: DisplaySprite mit gewollter Verzögerung

Verfasst: 10.03.2022 14:53
von Andi
Supi! Vielen Dank! :)