[PyGame] Waiting screen until user input - PiBooth - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: Game Development (https://python-forum.io/forum-11.html) +--- Thread: [PyGame] Waiting screen until user input - PiBooth (/thread-40954.html) |
Waiting screen until user input - PiBooth - world90 - Oct-19-2023 hey guys, in advance: I'm new in PyGame. I'm working on a photo booth / photo box with the software "PiBooth" - https://github.com/pibooth/pibooth. It is possible to create your own plugins – hooks in different states. I created a plugin that displays a screen when the Photo Booth printer needs to be refilled: When the print counter reaches the refill level (after 38 prints), a message should appear with a “Done” button or something similar. My problem is: I don't know how to display the screen UNTIL user input. Here the code: @pibooth.hookimpl def state_wait_do(win, app, events): #and app.print_ok != 0 and app.find_print_event(events).printer == 1 if app.find_print_event(events) != None: LOGGER.info("sate_print_do") printed = app.count.printed if((printed % 38) == 0): text = "Bitte Transferrolle wechseln und Papier auffuellen, 38 gedruckte Bilder.\n\nStatus Drucker:\n" sendstatusmail("Transferrolle wechseln und Papier auffuellen", text) win_rect = win.get_rect() text = "Bitte warten..." font = fonts.get_pygame_font(text, fonts.CURRENT, win_rect.width//1.5, win_rect.height//1.5) text_surface = font.render(text, True, win.text_color) if isinstance(win.bg_color, (tuple, list)): win.surface.fill(win.bg_color) else: bg_surface = pictures.get_pygame_image(win.bg_color, win_rect.size, crop=True, color=None) win.surface.blit(bg_surface, (0, 0)) win.surface.blit(text_surface, text_surface.get_rect(center=win_rect.center).topleft) pygame.display.update() pygame.event.pump() n = 0 gef = False #time.sleep(5) while True: time.sleep(5) if gef: break events = pygame.event.get() print(n) n = n + 1 m = 0 for event in events: print(str(n) + str(m)) print(event) if event.type == pygame.KEYDOWN: print("Jetzat") gef = True RE: Waiting screen until user input - PiBooth - deanhystad - Oct-20-2023 What is wrong with your code? The while loop should prevent anything changing the screen until the KEYDOWN event. I think it makes more sense to connect to the PRINT plugin instead of the WAIT plugin. RE: Waiting screen until user input - PiBooth - attractalderman - Apr-19-2024 It's not necessary, in my opinion, to compute every ray point. As each point is calculated, I would review it and halt when a collision is found. basket random def illuminate_block(self, blocks, ray_point): """ Find first block that collides with ray_point, Returns block or None """ for block in blocks: if block[1].rect.collidepoint(ray_point): block[1].illuminated = True return block return None def cast_rays(self): cx = self.rect.centerx cy = self.rect.centery blocks = [] for b in self.game.level.block_dict.values(): b.illuminated = False # Cull the block list here so it doesn't have to happen for each ray point. if abs(b[0][0] - cx) < 200 and abs(b[0][1] - cy) < 200: blocks.append[b] for ray in range(0, 360, 20): # Do expensive sin and cos once per ray sin_ray = math.sin(ray) cos_ray = math.cos(ray) for depth in range(20, 100, 5): ray_point = (cx - sin_ray * depth, cy + cos_ray * depth) if self.illuminate_block(blocks, ray_point) is not None: breakThere are pygame routines that can do the task for you if they are sprites. |