69 lines
2.8 KiB
Python
69 lines
2.8 KiB
Python
import sys
|
|
import sdl2
|
|
import sdl2.ext
|
|
|
|
# Create a resource container, so that we can easily access all
|
|
# resource, we bundle with our application. We are using the current
|
|
# file's location and define the "resources" subdirectory as the
|
|
# location, in which we keep all data.
|
|
RESOURCES = sdl2.ext.Resources(__file__, "resources")
|
|
|
|
def run():
|
|
# Initialize the video subsystem, create a window and make it visible.
|
|
sdl2.ext.init()
|
|
window = sdl2.ext.Window("Sprite Transformations", size=(800, 600))
|
|
window.show()
|
|
|
|
# Create a hardware-accelerated sprite factory. The sprite factory requires
|
|
# a rendering context, which enables it to create the underlying textures
|
|
# that serve as the visual parts for the sprites.
|
|
renderer = sdl2.ext.Renderer(window)
|
|
factory = sdl2.ext.SpriteFactory(sdl2.ext.TEXTURE, renderer=renderer)
|
|
|
|
# Create a simple rendering system for the window. We will use it to
|
|
# display the sprites.
|
|
rendersystem = factory.create_sprite_render_system(window)
|
|
|
|
# Create the sprite to display.
|
|
sprite = factory.from_image(RESOURCES.get_path("hello.bmp"))
|
|
|
|
# Use the sprite.center tuple to change the center of the sprite for
|
|
# rotation. You can reset a changed center simply by assinging None to it.
|
|
#
|
|
# sprite.center = 10, 30 # Changes the center
|
|
# sprite.center = None # Resets the center
|
|
|
|
running = True
|
|
while running:
|
|
events = sdl2.ext.get_events()
|
|
for event in events:
|
|
if event.type == sdl2.SDL_QUIT:
|
|
running = False
|
|
break
|
|
elif event.type == sdl2.SDL_KEYDOWN:
|
|
# Flip the sprite over its vertical axis on pressing down or up
|
|
if event.key.keysym.sym in (sdl2.SDLK_DOWN, sdl2.SDLK_UP):
|
|
sprite.flip ^= sdl2.SDL_FLIP_VERTICAL
|
|
# Flip the sprite over its horizontal axis on pressing left or
|
|
# right
|
|
elif event.key.keysym.sym in (sdl2.SDLK_LEFT, sdl2.SDLK_RIGHT):
|
|
sprite.flip ^= sdl2.SDL_FLIP_HORIZONTAL
|
|
# Rotate the sprite around its center on pressing plus or
|
|
# minus. The center can be changed via sprite.center.
|
|
elif event.key.keysym.sym == sdl2.SDLK_PLUS:
|
|
sprite.angle += 1.0
|
|
if sprite.angle >= 360.0:
|
|
sprite.angle = 0.0
|
|
elif event.key.keysym.sym == sdl2.SDLK_MINUS:
|
|
sprite.angle -= 1.0
|
|
if sprite.angle <= 0.0:
|
|
sprite.angle = 360.0
|
|
renderer.clear()
|
|
rendersystem.render(sprite, 100, 75)
|
|
sdl2.SDL_Delay(10)
|
|
sdl2.ext.quit()
|
|
return 0
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(run())
|