adsl9999 发表于 2023-8-5 16:50:58

python

import pygame
pygame.init()
WIN_WIDTH = 400
WIN_HEIGHT = 600
window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
pygame.display.set_caption("动画")
window.fill((255, 255, 255))
pygame.display.flip()
y = 100
pygame.draw.circle(window, (255, 0, 0), (100, y), 50)
pygame.display.update()
num = 1
running = True# 添加一个标志位,用于控制循环是否继续进行
while running:
    num += 1
   
    if num % 10 == 0:
      pygame.draw.circle(window, (255, 255, 255), (100, y), 50)
      pygame.draw.circle(window, (255, 0, 0), (100, y), 50)
    pygame.display.update()
   
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
            running = False# 用户点击关闭按钮时,停止循环
pygame.quit()
为什么还是没有效果

Mike_python小 发表于 2023-8-5 16:51:16

问题分析:

根据您提供的代码,应该是在通过pygame库创建窗口并绘制圆形动画。但是,您可能没有看到效果是因为缺少一个主循环(game loop),主循环用于不断更新屏幕并响应事件。

解决方案:

以下是修改后的代码,包括了一个主循环来实时更新屏幕和处理事件:


import pygame
pygame.init()

WIN_WIDTH = 400
WIN_HEIGHT = 600

window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
pygame.display.set_caption("动画")

window.fill((255, 255, 255))
pygame.display.flip()

y = 100
pygame.draw.circle(window, (255, 0, 0), (100, y), 50)
pygame.display.update()

num = 1
running = True# 添加一个标志位,用于控制循环是否继续进行

while running:
    num += 1
   
    if num % 10 == 0:
      window.fill((255, 255, 255))# 清空屏幕内容
      pygame.draw.circle(window, (255, 0, 0), (100, y), 50)
    pygame.display.update()
   
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
            running = False# 用户点击关闭按钮时,停止循环

pygame.quit()


在这个修改后的代码中,我们添加了一个主循环,使用while语句不断更新屏幕内容。每次循环中,都会检查num的值是否是10的倍数,如果是,则清空屏幕内容并重新绘制红色圆形。

请尝试运行修改后的代码,应该能够看到圆形动画在窗口中更新。希望能对您有所帮助!

如果回答对你有帮助,请给我一个最佳答案!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 2023-8-5 16:51:18

这段代码没有效果的原因是因为在每次更新窗口后,没有添加适当的延迟,导致动画刷新速度太快,无法被人眼察觉到。解决这个问题可以使用pygame的时钟对象pygame.time.Clock()来控制刷新速度。

可以将以下代码添加到循环开始的位置,以设置帧率为30帧/秒:
clock = pygame.time.Clock()


然后在每次更新窗口后,添加以下代码来控制帧率:
clock.tick(30)


这样就可以控制动画的刷新速度,使其能够被人眼察觉到。完整的代码如下:
import pygame
pygame.init()
WIN_WIDTH = 400
WIN_HEIGHT = 600
window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
pygame.display.set_caption("动画")
window.fill((255, 255, 255))
pygame.display.flip()
y = 100
pygame.draw.circle(window, (255, 0, 0), (100, y), 50)
pygame.display.update()
num = 1
running = True# 添加一个标志位,用于控制循环是否继续进行
clock = pygame.time.Clock()# 创建时钟对象,用于控制帧率
while running:
    num += 1
   
    if num % 10 == 0:
      pygame.draw.circle(window, (255, 255, 255), (100, y), 50)
      pygame.draw.circle(window, (255, 0, 0), (100, y), 50)
    pygame.display.update()
   
    clock.tick(30)# 控制帧率为30帧/秒
   
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
            running = False# 用户点击关闭按钮时,停止循环
pygame.quit()


这样修改后,代码应该能够正常运行并显示动画效果。

smallwh 发表于 2023-8-5 17:16:20

if num % 10 == 0:
      pygame.draw.circle(window, (255, 255, 255), (100, y), 50)
      pygame.draw.circle(window, (255, 0, 0), (100, y), 50)
    pygame.display.update()
相当于先画一个白圆,再画一个红圆盖住它,最后刷新屏幕。
这样得到的圆肯定是红色的,就不会有动画效果
将两处画红圆的代码pygame.draw.circle(window, (255, 0, 0), (100, y), 50)移到循环体开头就可以解决
此外,为了获得一个好的效果,建议尽量调低一下帧率
import pygame
pygame.init()
WIN_WIDTH = 400
WIN_HEIGHT = 600
window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
pygame.display.set_caption("动画")
window.fill((255, 255, 255))
pygame.display.flip()
y = 100
pygame.display.update()
num = 1
running = True# 添加一个标志位,用于控制循环是否继续进行
clock = pygame.time.Clock()
while running:
    pygame.draw.circle(window, (255, 0, 0), (100, y), 50)
    num += 1

    if num % 10 == 0:
      pygame.draw.circle(window, (255, 255, 255), (100, y), 50)
    pygame.display.update()
    clock.tick(5)

    for event in pygame.event.get():
      if event.type == pygame.QUIT:
            running = False# 用户点击关闭按钮时,停止循环
pygame.quit()
页: [1]
查看完整版本: python