2025-04-07 16:37:34 +00:00
|
|
|
|
import pygame
|
|
|
|
|
import sys
|
|
|
|
|
import math
|
|
|
|
|
import pygui
|
|
|
|
|
from pygui_pygame_backend import Render, Rect, get_mouse_pos, get_mouse_pressed, MOUSEBUTTONDOWN, MOUSEBUTTONUP, MOUSEMOTION
|
|
|
|
|
import pygui_pygame_backend as backend
|
|
|
|
|
|
|
|
|
|
pygame.init()
|
|
|
|
|
WIDTH, HEIGHT = 800, 600
|
|
|
|
|
screen = pygame.display.set_mode((WIDTH, HEIGHT))
|
|
|
|
|
pygame.display.set_caption("Bouncing Ball with Enhanced PyGUI")
|
|
|
|
|
clock = pygame.time.Clock()
|
|
|
|
|
|
|
|
|
|
# Create the backend renderer and assign the backend to PyGUI.
|
|
|
|
|
renderer = Render(screen)
|
|
|
|
|
pygui.PyGUI.set_backend(backend, renderer)
|
|
|
|
|
|
|
|
|
|
# ---------------------
|
|
|
|
|
# Ball Simulation
|
|
|
|
|
# ---------------------
|
|
|
|
|
class Ball:
|
|
|
|
|
def __init__(self, pos, velocity, radius, color):
|
|
|
|
|
self.pos = list(pos)
|
|
|
|
|
self.velocity = list(velocity)
|
|
|
|
|
self.radius = radius
|
|
|
|
|
self.color = color
|
|
|
|
|
|
|
|
|
|
def update(self):
|
|
|
|
|
self.pos[0] += self.velocity[0]
|
|
|
|
|
self.pos[1] += self.velocity[1]
|
|
|
|
|
if self.pos[0] - self.radius < 0 or self.pos[0] + self.radius > WIDTH:
|
|
|
|
|
self.velocity[0] = -self.velocity[0]
|
|
|
|
|
if self.pos[1] - self.radius < 0 or self.pos[1] + self.radius > HEIGHT:
|
|
|
|
|
self.velocity[1] = -self.velocity[1]
|
|
|
|
|
|
|
|
|
|
def draw(self, surface):
|
|
|
|
|
pygame.draw.circle(surface, self.color, (int(self.pos[0]), int(self.pos[1])), int(self.radius))
|
|
|
|
|
|
|
|
|
|
ball = Ball((WIDTH // 2, HEIGHT // 2), (4, 3), 30, (255, 100, 50))
|
|
|
|
|
ball_speed = 4.0
|
|
|
|
|
ball_direction = 0.0
|
|
|
|
|
ball_radius = 30.0
|
|
|
|
|
ball_color_r = 255.0
|
|
|
|
|
ball_color_g = 100.0
|
|
|
|
|
ball_color_b = 50.0
|
|
|
|
|
bounce_enabled = True
|
|
|
|
|
|
|
|
|
|
running = True
|
|
|
|
|
while running:
|
|
|
|
|
dt = clock.tick(60) / 1000.0
|
|
|
|
|
for event in pygame.event.get():
|
|
|
|
|
if event.type == pygame.QUIT:
|
|
|
|
|
running = False
|
|
|
|
|
pygui.PyGUI.handle_event(event)
|
|
|
|
|
|
|
|
|
|
screen.fill((30, 30, 30))
|
|
|
|
|
|
|
|
|
|
# Draw a draggable, auto–sizing GUI window.
|
|
|
|
|
pygui.PyGUI.Begin("Ball Controls", 10, 10)
|
|
|
|
|
ball_speed = pygui.PyGUI.Slider("Speed", ball_speed, 1, 10)
|
|
|
|
|
ball_direction = pygui.PyGUI.Slider("Direction", ball_direction, 0, 360)
|
|
|
|
|
ball_radius = pygui.PyGUI.Slider("Radius", ball_radius, 10, 100)
|
|
|
|
|
ball_color_r = pygui.PyGUI.Slider("Red", ball_color_r, 0, 255)
|
|
|
|
|
ball_color_g = pygui.PyGUI.Slider("Green", ball_color_g, 0, 255)
|
|
|
|
|
ball_color_b = pygui.PyGUI.Slider("Blue", ball_color_b, 0, 255)
|
|
|
|
|
bounce_enabled = pygui.PyGUI.Checkbox("Bounce", bounce_enabled)
|
|
|
|
|
if pygui.PyGUI.Button("Reset Position"):
|
|
|
|
|
ball.pos = [WIDTH // 2, HEIGHT // 2]
|
|
|
|
|
pygui.PyGUI.End()
|
|
|
|
|
|
|
|
|
|
rad = math.radians(ball_direction)
|
|
|
|
|
ball.velocity[0] = ball_speed * math.cos(rad)
|
|
|
|
|
ball.velocity[1] = ball_speed * math.sin(rad)
|
|
|
|
|
ball.radius = ball_radius
|
|
|
|
|
ball.color = (int(ball_color_r), int(ball_color_g), int(ball_color_b))
|
|
|
|
|
if not bounce_enabled:
|
|
|
|
|
ball.velocity[0] *= 0.5
|
|
|
|
|
ball.velocity[1] *= 0.5
|
|
|
|
|
|
|
|
|
|
ball.update()
|
|
|
|
|
ball.draw(screen)
|
|
|
|
|
|
|
|
|
|
pygame.display.flip()
|
|
|
|
|
pygui.PyGUI.update()
|
|
|
|
|
|
|
|
|
|
pygame.quit()
|
|
|
|
|
sys.exit()
|