123 lines
4 KiB
Python
123 lines
4 KiB
Python
|
import pygame
|
||
|
import sdl2
|
||
|
import sdl2.ext
|
||
|
import sys
|
||
|
|
||
|
# Initialize Pygame
|
||
|
pygame.init()
|
||
|
|
||
|
# Initialize SDL2
|
||
|
if sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO) != 0:
|
||
|
print(f"SDL2 initialization failed: {sdl2.SDL_GetError().decode('utf-8')}")
|
||
|
exit(1)
|
||
|
|
||
|
# Screen dimensions
|
||
|
WIDTH, HEIGHT = 640, 480
|
||
|
sdl_window = sdl2.SDL_CreateWindow(b"Pygame with SDL2 Rendering",
|
||
|
sdl2.SDL_WINDOWPOS_CENTERED,
|
||
|
sdl2.SDL_WINDOWPOS_CENTERED,
|
||
|
WIDTH, HEIGHT,
|
||
|
sdl2.SDL_WINDOW_SHOWN)
|
||
|
|
||
|
if not sdl_window:
|
||
|
print(f"Window creation failed: {sdl2.SDL_GetError().decode('utf-8')}")
|
||
|
sdl2.SDL_Quit()
|
||
|
exit(1)
|
||
|
|
||
|
sdl_renderer = sdl2.SDL_CreateRenderer(sdl_window, -1, sdl2.SDL_RENDERER_ACCELERATED)
|
||
|
if not sdl_renderer:
|
||
|
print(f"Renderer creation failed: {sdl2.SDL_GetError().decode('utf-8')}")
|
||
|
sdl2.SDL_DestroyWindow(sdl_window)
|
||
|
sdl2.SDL_Quit()
|
||
|
exit(1)
|
||
|
|
||
|
# Colors
|
||
|
BLACK = sdl2.ext.Color(0, 0, 0)
|
||
|
WHITE = sdl2.ext.Color(255, 255, 255)
|
||
|
RED = sdl2.ext.Color(255, 0, 0)
|
||
|
|
||
|
# Set up the clock for managing the frame rate
|
||
|
clock = pygame.time.Clock()
|
||
|
font = pygame.font.Font(None, 24) # Reduce font size for better fit
|
||
|
|
||
|
# Object properties
|
||
|
object_size = 50
|
||
|
object_x = WIDTH // 2
|
||
|
object_y = HEIGHT // 2
|
||
|
object_speed = 5
|
||
|
|
||
|
# Event text
|
||
|
event_text = ""
|
||
|
|
||
|
# Helper function to create SDL texture from Pygame surface
|
||
|
def create_texture_from_surface(surface):
|
||
|
width, height = surface.get_size()
|
||
|
texture = sdl2.SDL_CreateTexture(sdl_renderer,
|
||
|
sdl2.SDL_PIXELFORMAT_ARGB8888,
|
||
|
sdl2.SDL_TEXTUREACCESS_STREAMING,
|
||
|
width, height)
|
||
|
pixels = pygame.image.tostring(surface, "ARGB")
|
||
|
sdl2.SDL_UpdateTexture(texture, None, pixels, width * 4)
|
||
|
return texture
|
||
|
|
||
|
# Main loop
|
||
|
running = True
|
||
|
while running:
|
||
|
for event in pygame.event.get():
|
||
|
if event.type == pygame.QUIT:
|
||
|
running = False
|
||
|
if event.type in [pygame.KEYDOWN, pygame.KEYUP]:
|
||
|
event_text = f"Event: {pygame.event.event_name(event.type)}, Key: {pygame.key.name(event.key)}"
|
||
|
print(event_text)
|
||
|
|
||
|
# Get the current state of all keyboard buttons
|
||
|
keys = pygame.key.get_pressed()
|
||
|
if keys[pygame.K_LEFT]:
|
||
|
object_x -= object_speed
|
||
|
if keys[pygame.K_RIGHT]:
|
||
|
object_x += object_speed
|
||
|
if keys[pygame.K_UP]:
|
||
|
object_y -= object_speed
|
||
|
if keys[pygame.K_DOWN]:
|
||
|
object_y += object_speed
|
||
|
|
||
|
# Ensure the object stays within the screen bounds
|
||
|
object_x = max(0, min(WIDTH - object_size, object_x))
|
||
|
object_y = max(0, min(HEIGHT - object_size, object_y))
|
||
|
|
||
|
# Clear the screen
|
||
|
sdl2.SDL_SetRenderDrawColor(sdl_renderer, WHITE.r, WHITE.g, WHITE.b, WHITE.a)
|
||
|
sdl2.SDL_RenderClear(sdl_renderer)
|
||
|
|
||
|
# Draw the moveable object
|
||
|
rect = sdl2.SDL_Rect(object_x, object_y, object_size, object_size)
|
||
|
sdl2.SDL_SetRenderDrawColor(sdl_renderer, RED.r, RED.g, RED.b, RED.a)
|
||
|
sdl2.SDL_RenderFillRect(sdl_renderer, rect)
|
||
|
|
||
|
# Calculate and display FPS
|
||
|
fps = clock.get_fps()
|
||
|
fps_surface = font.render(f'FPS: {int(fps)}', True, (0, 0, 0))
|
||
|
fps_texture = create_texture_from_surface(fps_surface)
|
||
|
sdl2.SDL_RenderCopy(sdl_renderer, fps_texture, None, sdl2.SDL_Rect(10, 10, fps_surface.get_width(), fps_surface.get_height()))
|
||
|
|
||
|
# Display the event text
|
||
|
event_surface = font.render(event_text, True, (0, 0, 0))
|
||
|
event_texture = create_texture_from_surface(event_surface)
|
||
|
sdl2.SDL_RenderCopy(sdl_renderer, event_texture, None, sdl2.SDL_Rect(10, 50, event_surface.get_width(), event_surface.get_height()))
|
||
|
|
||
|
# Update the display
|
||
|
sdl2.SDL_RenderPresent(sdl_renderer)
|
||
|
|
||
|
# Cap the frame rate at 60 FPS
|
||
|
clock.tick(60)
|
||
|
|
||
|
# Destroy textures to avoid memory leaks
|
||
|
sdl2.SDL_DestroyTexture(fps_texture)
|
||
|
sdl2.SDL_DestroyTexture(event_texture)
|
||
|
|
||
|
# Clean up and close the SDL2 window
|
||
|
sdl2.SDL_DestroyRenderer(sdl_renderer)
|
||
|
sdl2.SDL_DestroyWindow(sdl_window)
|
||
|
sdl2.SDL_Quit()
|
||
|
pygame.quit()
|
||
|
sys.exit()
|