Spider
unknown
python
2 years ago
5.5 kB
5
Indexable
import math import pygame import pygame.font # VARIABLES width, height = 1000, 700 Out = False active_pendulum = None # Track the active pendulum acceleration = False # COLORS white = (255, 255, 255) black = (0, 0, 0) gray = (169, 169, 169) # BEFORE START pygame.init() background = pygame.display.set_mode((width, height)) clock = pygame.time.Clock() # Set mass values and damping factor mass_pendulum1 = 2 mass_pendulum2 = 3 damped_factor = 0.01 # Damping factor for proportional damping # Load the background image background_image = pygame.image.load("pipe.png") background_image = pygame.transform.scale(background_image, (width, height)) # Load the spider images spider1_image = pygame.image.load("spider1.png") spider2_image = pygame.image.load("spider2.png") # Set up font for the timer and buttons font = pygame.font.Font(None, 20) button_font = pygame.font.Font(None, 20) # Set initial timer values timer_seconds = 0 paused = False # Set button positions pause_button_pos = (150, height - 30) reset_button_pos = (250, height - 30) class Pendulum(object): def __init__(self, XY, radius, mass, image): self.x = XY[0] self.y = XY[1] self.radius = radius self.length = 0 self.angle = 0 self.vel = 0 self.Aacc = 0 self.falling = False self.mass = mass self.image = pygame.transform.scale(image, (2*radius, 2*radius)) def draw(self, bg): rotated_image = pygame.transform.rotate(self.image, math.degrees(-self.angle)) rotated_rect = rotated_image.get_rect(center=(self.x, self.y)) bg.blit(rotated_image, rotated_rect.topleft) pygame.draw.line(bg, black, (width//2, 50), (self.x, self.y), 2) def angle_length(pendulum): length = math.sqrt(math.pow(pendulum.x - width/2, 2) + math.pow(pendulum.y - 50, 2)) angle = math.asin((pendulum.x - width/2)/ length) return angle, length def get_path(pendulum): pendulum.x = round(width/2 + pendulum.length * math.sin(pendulum.angle)) pendulum.y = round(50 + pendulum.length * math.cos(pendulum.angle)) def redraw(pendulum1, pendulum2): # Blit the background image onto the screen background.blit(background_image, (0, 0)) pendulum1.draw(background) pendulum2.draw(background) draw_timer(background) draw_buttons(background) pygame.display.update() def draw_timer(bg): timer_text = font.render(f'Time: {timer_seconds} s', True, black) bg.blit(timer_text, (10, height - 30)) def draw_buttons(bg): # Draw "P" for pause button pause_button_text = button_font.render("'P' Fo Paused", True, black) bg.blit(pause_button_text, pause_button_pos) # Draw "R" for reset button reset_button_text = button_font.render("'R' For Reset", True, black) bg.blit(reset_button_text, reset_button_pos) pendulum1 = Pendulum((int(width / 2) - 50, height - 100), 50, mass_pendulum1, spider1_image) pendulum2 = Pendulum((int(width / 2) + 50, height - 100), 50, mass_pendulum2, spider2_image) while not Out: clock.tick(120) for event in pygame.event.get(): if event.type == pygame.QUIT: Out = True if event.type == pygame.MOUSEBUTTONDOWN: # Check if the click is inside any pendulum if pendulum1.x - pendulum1.radius < event.pos[0] < pendulum1.x + pendulum1.radius \ and pendulum1.y - pendulum1.radius < event.pos[1] < pendulum1.y + pendulum1.radius: active_pendulum = pendulum1 elif pendulum2.x - pendulum2.radius < event.pos[0] < pendulum2.x + pendulum2.radius \ and pendulum2.y - pendulum2.radius < event.pos[1] < pendulum2.y + pendulum2.radius: active_pendulum = pendulum2 acceleration = True if event.type == pygame.MOUSEBUTTONUP: if active_pendulum is not None: active_pendulum.falling = True acceleration = False active_pendulum = None # Reset the active pendulum when the mouse button is released # Button actions for pausing and resetting the timer if event.type == pygame.KEYDOWN: if event.key == pygame.K_p: # Press 'p' to pause/unpause paused = not paused elif event.key == pygame.K_r: # Press 'r' to reset timer timer_seconds = 0 # Update pendulum position based on mouse movement if active_pendulum is not None: active_pendulum.x, active_pendulum.y = pygame.mouse.get_pos() active_pendulum.angle, active_pendulum.length = angle_length(active_pendulum) get_path(active_pendulum) # Update falling pendulums if pendulum1.falling: pendulum1.Aacc = -0.005 * math.sin(pendulum1.angle) / pendulum1.mass pendulum1.vel += pendulum1.Aacc pendulum1.vel += -damped_factor * pendulum1.vel # Proportional damping pendulum1.angle += pendulum1.vel get_path(pendulum1) if pendulum2.falling: pendulum2.Aacc = -0.005 * math.sin(pendulum2.angle) / pendulum2.mass pendulum2.vel += pendulum2.Aacc pendulum2.vel += -damped_factor * pendulum2.vel # Proportional damping pendulum2.angle += pendulum2.vel get_path(pendulum2) redraw(pendulum1, pendulum2) if not paused: timer_seconds += 1 pygame.quit()
Editor is loading...
Leave a Comment