通过移动对象绘制像素轨迹

时间:2013-02-22 14:13:07

标签: python animation pygame pixel

我正在使用Pygame使用Python,我想知道如何根据用光标键移动某个对象来绘制像素。

所以,我想要做的是绘制一条“运动轨迹”,例如当玩家向右移动物体时,程序必须从运动开始到运动结束时在该物体后面绘制像素。

2 个答案:

答案 0 :(得分:0)

最简单的方法是使用surface.set_at()

surface.set_at((x, y), color)

x和y是移动物体的位置。 Color是一个RGB三元素元组,如(100,0,200)

答案 1 :(得分:0)

您可以跟踪对象的过去位置。
在下面的代码中,使用箭头键移动pygame.Rect。

您感兴趣的部分位于Player类,即

  1. lasts(列表)
    • 此列表记录了玩家以前的位置。
  2. update_list()(功能)
    • 此功能管理列表,
      • 将当前位置添加到列表中。
      • 删除第一个元素,一旦列表与fade一样长。
  3. draw()(功能)
    • 实际上只有for循环,它使用索引并绘制渐弱的Rects。
  4.   

    注意:这不是最有效的代码。

    守则

    import pygame
    
    bg = (255, 255, 255)
    
    def add_colors(color1, color2):
        retval = []
        for i in range(3):
            c1 = color1[i]
            c2 = color2[i]
            c = c1+c2
            if c > 255: # just basic handling
                c -= 255
            retval.append(round(int(c)))
        return tuple(retval)
    
    def calc_colors(color, fade):
        retval = []
    
        # calculating the color change rate
        diff_color = []
        for i in range(3):
            diff = bg[i] - color[i]
            c_diff = diff/float(fade)
            diff_color.append(c_diff)
        diff_color = tuple(diff_color)
    
        # get the fading colors
        lastcolor = bg
        for i in range(fade):
            new_color = add_colors(lastcolor, diff_color)
            retval.append(new_color)
            lastcolor = new_color
    
        return retval[::-1]
    
    class Player:
        def __init__(self, color, fade, pygame_Rect_args):
            """Give arguments as given to pygame.Rect"""
            self.rect = pygame.Rect(*pygame_Rect_args)
            self.size = self.rect.size
            self.vx = 0.0
            self.vy = 0.0
            self.lasts = []
    
            self.maincolor = color
            self.colors = calc_colors(color,fade)
            self.fade = fade
    
    
        def draw(self):
            for i in range(len(self.lasts)):
                pos = self.lasts[i]
                c_color = self.colors[i]
                pygame.draw.rect(screen, c_color, pygame.Rect(pos, self.size))
            pygame.draw.rect(screen, self.maincolor, self.rect)
    
        def update_list(self):
            self.lasts.append(self.rect.topleft)
            if len(self.lasts) > self.fade:
                self.lasts.remove(self.lasts[0])
    
        def update(self):
            self.rect.x += int(round(self.vx))
            self.rect.y += int(round(self.vy))
    
        def handle_keys(self):
            key = pygame.key.get_pressed()
            if key[pygame.K_UP]:    self.vy -= 0.1
            if key[pygame.K_DOWN]:  self.vy += 0.1
            if key[pygame.K_LEFT]:  self.vx -= 0.1
            if key[pygame.K_RIGHT]: self.vx += 0.1
    
    
    player = Player((255,255,0), 10, (10,10,10,10))
    
    pygame.init()
    screen = pygame.display.set_mode((640,480))
    clock = pygame.time.Clock()
    
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
                pygame.quit()
                break
    
        if not running:
            break
    
        player.handle_keys()
        player.update_list()
        player.update()
    
        screen.fill(bg)
        player.draw()
        pygame.display.flip()
    
        clock.tick(40)
    

    您可能还想this tutorial(不是整个事情,只是最后一部分(#9))