Pygame线条转圆形动画开发问题:列表元素异常修改
Pygame线条绘制异常问题
我正在开发一个基于Pygame的Python程序,需求是先绘制线条,再将其动画转换为圆形,但目前连基础的线条绘制功能都存在问题。问题出在存储鼠标左键按下起点(列表第一个元素)和当前鼠标位置(第二个元素)的列表中,Python会错误地修改其中一个或两个元素的值。
以下是两种代码状态下的不同表现:
- 保留标记的两行更新代码时:程序每帧仅在鼠标当前位置绘制单个像素,无法画出从起点到当前位置的完整线条
- 删除这两行代码时:前一帧的线条不会被覆盖,每帧都会新增一条从起点到当前鼠标位置的线条
显然这两行代码是实现前一帧覆盖所必需的,我已在代码中用注释标记出影响结果的关键行,完整代码如下:
import pygame, PIL, random print('\n') #data bubbles = [] color_options = [[87, 184, 222]] pressed = False released = False bubline_start = [] background = [50, 25, 25] size = [500, 500] #pygame display = pygame.display.set_mode(size) pygame.init() #functions def new_bub_color(): color_index = random.randint(0, len(color_options)-1) lvl = random.randrange(85, 115) bub_color = [] for val in color_options[color_index]: bub_color.append(val*(lvl/100)) return bub_color def bubble_line(): global display, pressed, bubline_start, released, bubbles, color_options if len(bubbles) > 0: if not bubbles[-1][0] == 0: #first frame of click bub_color = new_bub_color() bubbles.append([0, bub_color, [bubline_start, list(pygame.mouse.get_pos())]]) pygame.draw.line(display, bub_color, bubline_start, pygame.mouse.get_pos()) else: #draw after drags pygame.draw.line(display, bubbles[-1][1], bubbles[-1][2][0], list(pygame.mouse.get_pos())) bubbles[-1][2][1] = list(pygame.mouse.get_pos())# <-- 关键行1 else: #first bubble bub_color = new_bub_color() bubbles.append([0, bub_color, [bubline_start, list(pygame.mouse.get_pos())]]) pygame.draw.line(display, bub_color, bubline_start, pygame.mouse.get_pos()) if released: bubbles[-1][0] = 1 bubbles[-1][2][1] = list(pygame.mouse.get_pos())# <-- 关键行2 released = False def cover_prev_frame(): global bubbles, background, size min_pos = [] max_pos = [] for bubble in bubbles: min_pos = bubble[2][0] max_pos = bubble[2][0] for point in bubble[2]: #x min and max if point[0] < min_pos[0]: min_pos[0] = point[0] elif point[0] > max_pos[0]: max_pos[0] = point[0] #y min and max if point[1] < min_pos[1]: min_pos[1] = point[1] elif point[1] > max_pos[1]: max_pos[1] = point[1] max_pos = [max_pos[0]-min_pos[0]+1, max_pos[1]-min_pos[1]+1] if type(background) == str: #image background later = True elif type(background) == list: #solid color background pygame.draw.rect(display, background, pygame.Rect(min_pos, max_pos)) while True: pygame.event.pump() events = pygame.event.get() for event in events: if event.type == pygame.QUIT: pygame.quit() elif event.type == pygame.MOUSEBUTTONDOWN and not pressed: bubline_start = list(pygame.mouse.get_pos()) pressed = True elif event.type == pygame.MOUSEBUTTONUP and pressed: pressed = False released = True cover_prev_frame() if pressed or released: bubble_line() try: pygame.display.update() except: break
内容的提问来源于stack exchange,提问作者killerderp7
相关产品推荐
相关产品推荐

