鱼C论坛

 找回密码
 立即注册
查看: 1283|回复: 3

[已解决]python

[复制链接]
发表于 2023-8-5 16:50:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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()
为什么还是没有效果
最佳答案
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)移到循环体开头就可以解决
此外,为了获得一个好的效果,建议尽量调低一下帧率
  1. import pygame
  2. pygame.init()
  3. WIN_WIDTH = 400
  4. WIN_HEIGHT = 600
  5. window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
  6. pygame.display.set_caption("动画")
  7. window.fill((255, 255, 255))
  8. pygame.display.flip()
  9. y = 100
  10. pygame.display.update()
  11. num = 1
  12. running = True  # 添加一个标志位,用于控制循环是否继续进行
  13. clock = pygame.time.Clock()
  14. while running:
  15.     pygame.draw.circle(window, (255, 0, 0), (100, y), 50)
  16.     num += 1

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

  21.     for event in pygame.event.get():
  22.         if event.type == pygame.QUIT:
  23.             running = False  # 用户点击关闭按钮时,停止循环
  24. pygame.quit()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-5 16:51:16 | 显示全部楼层
问题分析

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

解决方案

以下是修改后的代码,包括了一个主循环来实时更新屏幕和处理事件:
  1. import pygame
  2. pygame.init()
  3. WIN_WIDTH = 400
  4. WIN_HEIGHT = 600
  5. window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
  6. pygame.display.set_caption("动画")
  7. window.fill((255, 255, 255))
  8. pygame.display.flip()
  9. y = 100
  10. pygame.draw.circle(window, (255, 0, 0), (100, y), 50)
  11. pygame.display.update()
  12. num = 1
  13. running = True  # 添加一个标志位,用于控制循环是否继续进行
  14. while running:
  15.     num += 1
  16.    
  17.     if num % 10 == 0:
  18.         window.fill((255, 255, 255))  # 清空屏幕内容
  19.         pygame.draw.circle(window, (255, 0, 0), (100, y), 50)
  20.     pygame.display.update()
  21.    
  22.     for event in pygame.event.get():
  23.         if event.type == pygame.QUIT:
  24.             running = False  # 用户点击关闭按钮时,停止循环
  25. pygame.quit()
复制代码

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

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

如果回答对你有帮助,请给我一个最佳答案!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-5 16:51:18 | 显示全部楼层
这段代码没有效果的原因是因为在每次更新窗口后,没有添加适当的延迟,导致动画刷新速度太快,无法被人眼察觉到。解决这个问题可以使用pygame的时钟对象pygame.time.Clock()来控制刷新速度。

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


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


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


这样修改后,代码应该能够正常运行并显示动画效果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)移到循环体开头就可以解决
此外,为了获得一个好的效果,建议尽量调低一下帧率
  1. import pygame
  2. pygame.init()
  3. WIN_WIDTH = 400
  4. WIN_HEIGHT = 600
  5. window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
  6. pygame.display.set_caption("动画")
  7. window.fill((255, 255, 255))
  8. pygame.display.flip()
  9. y = 100
  10. pygame.display.update()
  11. num = 1
  12. running = True  # 添加一个标志位,用于控制循环是否继续进行
  13. clock = pygame.time.Clock()
  14. while running:
  15.     pygame.draw.circle(window, (255, 0, 0), (100, y), 50)
  16.     num += 1

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

  21.     for event in pygame.event.get():
  22.         if event.type == pygame.QUIT:
  23.             running = False  # 用户点击关闭按钮时,停止循环
  24. pygame.quit()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-21 12:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表