第 16 章

测试题

  1. RGB 值 [255, 255, 255] 得到白色。

  2. RGB 值 [0, 255, 0] 得到绿色;

  3. 要画矩形,可以使用 Pygame 方法 pygame.draw.rect()

  4. 要画线把多个点连在一起(如连连看),可以使用 pygame.draw.lines() 方法。

  5. “像素”是“图像元素”的简写,表示屏幕上(或纸上)的一个点。

  6. 在一个 Pygame 窗口中,位置 [0, 0] 位于左上角。

  7. 在这个图中,位置 [50, 200] 位于字母 B。

  8. 在这个图中,位置 [300, 50] 位于字母 D。

  9. 可以使用 blit() 方法在 Pygame 中复制图像。

  10. 要移动一个图像或者完成动画,可以使用以下两个步骤:

  • 从原来的位置擦除图像;

  • 在新位置上绘制图像。

动手试一试

  1. 下面的程序会在屏幕上画出一些不同的形状。也可以在 \answers 文件夹和网站上找到 TIO_CH16_1.py。
  1. import pygame, sys
  2. pygame.init()
  3. screen=pygame.display.set_mode((640, 480))
  4. screen.fill((250, 120, 0))
  5. pygame.draw.arc(screen,(255,255,0),pygame.rect.Rect(43,368,277,235),-6.25, 0, 15)
  6. pygame.draw.rect(screen,(255, 0, 0),pygame.rect.Rect(334,191,190,290))
  7. pygame.draw.rect(screen,(128, 64, 0),pygame.rect.Rect(391,349,76,132))
  8. pygame.draw.line(screen,(0, 255, 0),(268, 259),(438,84),25)
  9. pygame.draw.line(screen,(0, 255, 0),(578, 259),(438,84),25)
  10. pygame.draw.circle(screen, (0, 0, 0), (452, 409), 11, 2)
  11. pygame.draw.polygon(screen, (0, 0, 255),[(39, 39), (44, 136), (59, 136), (60,102),(92,102),(94,131),(107, 141), (111, 50), (97, 50), (93, 86), (60, 82), (58, 38)], 5)
  12. pygame.draw.rect(screen,(0,0,255), pygame.rect.Rect(143,90,23,63),5)
  13. pygame.draw.circle(screen, (0, 0, 255), (153, 60), 15, 5)
  14. clock = pygame.time.Clock()
  15. pygame.display.flip()
  16. running = True
  17. while running:
  18. clock.tick(60)
  19. for event in pygame.event.get():
  20. if event.type == pygame.QUIT:
  21. running = False
  22. elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
  23. running = False
  24. pygame.quit()
  1. 要把沙滩球图像换成一个不同的图像,只需把这行代码中的文件名:
  1. my_ball = pygame.image.load('beach_ball.png')

替换成另一个图片的文件名。

  1. 在代码清单 16-16 中,只需把
  1. x_speed = 10
  2. y_speed = 10

改为其他的值,如

  1. x_speed = 20
  2. y_speed = 8
  1. 要让球在一面“隐形”的墙上反弹,可以把代码清单 16-16 中的这行代码
  1. if x > screen.get_width() - 90 or x < 0:

改为:

  1. if x > screen.get_width() - 250 or x < 0:

这会让球在到达窗口边界之前就反向。可以对 y 坐标做同样的处理,让它在到达“地板”时也会反弹。

  1. 将代码清单 16-6 中的 display.flip 移到 while 循环内部,并增加一个延迟之后,代码如下所示:
  1. import pygame, sys, random
  2. pygame.init()
  3. screen = pygame.display.set_mode([640,480])
  4. screen.fill([255, 255, 255])
  5. for i in range (100):
  6. width = random.randint(0, 250)
  7. height = random.randint(0, 100)
  8. top = random.randint(0, 400)
  9. left = random.randint(0, 500)
  10. pygame.draw.rect(screen, [0,0,0], [left, top, width, height], 1)
  11. pygame.display.flip()
  12. pygame.time.delay(30)

应该能看到各个矩形会单独出现,因为我们放慢了程序的速度,现在画出各个矩形之后会刷新显示。如果对正弦曲线程序做这个处理,可以看到正弦曲线中的各个点分别画出。