鱼C论坛

 找回密码
 立即注册
查看: 1852|回复: 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)移到循环体开头就可以解决
此外,为了获得一个好的效果,建议尽量调低一下帧率
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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

解决方案

以下是修改后的代码,包括了一个主循环来实时更新屏幕和处理事件:
import pygamepygame.init()WIN_WIDTH = 400WIN_HEIGHT = 600window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))pygame.display.set_caption("动画")window.fill((255, 255, 255))pygame.display.flip()y = 100pygame.draw.circle(window, (255, 0, 0), (100, y), 50)pygame.display.update()num = 1running = 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的倍数,如果是,则清空屏幕内容并重新绘制红色圆形。

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

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

使用道具 举报

发表于 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()

这样修改后,代码应该能够正常运行并显示动画效果。
想知道小甲鱼最近在做啥?请访问 -> 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)移到循环体开头就可以解决
此外,为了获得一个好的效果,建议尽量调低一下帧率
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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 04:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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