adsl9999 发表于 2023-8-4 17:15:43

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

while True:
    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:
            exit()
为什么没有动画效果

Mike_python小 发表于 2023-8-4 17:16:01

本帖最后由 Mike_python小 于 2023-8-4 14:17 编辑

根据您提供的代码,没有动画效果的原因是在主循环中没有添加延迟或时钟控制。这导致整个循环迅速执行完毕,从而无法观察到动画效果。

要解决这个问题,您可以使用 `pygame.time.Clock()` 和 `clock.tick(FPS)` 函数来控制帧率。具体操作如下:

1. 在 `pygame.init()` 之后添加以下代码来创建一个时钟对象:


clock = pygame.time.Clock()


2. 定义一个变量 `FPS`,表示您希望的帧率。例如,可以将其设置为 60:


FPS = 60


3. 在主循环的最开始调用 `clock.tick(FPS)` 来限制帧率:


while True:
    clock.tick(FPS)
   
    # 其他代码...


4.这是完整代码
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()

通过添加这些代码,您可以控制游戏循环的速度,从而实现动画效果。

请尝试修改您的代码并添加上述的时钟控制部分,然后再次运行程序,看看是否能够获得所需的动画效果。如有任何疑问,请随时提问。

学习编程中的Ben 发表于 2023-8-4 17:16:03

问题:为什么没有动画效果?

根据提供的代码,我注意到您将动画效果的更新操作放在了事件循环之外。这意味着在事件循环监听用户操作时,并没有更新显示窗口,因此没有动画效果。

为了实现动画效果,您需要在每次循环迭代中更新显示窗口并处理事件。这样可以在每个循环迭代中更新窗口显示并响应用户的退出事件。

以下是修改后的代码:

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()


通过上述修改,您应该能够获得期望的动画效果。现在,在每次循环迭代中更新窗口显示,并响应用户的退出事件。

请尝试使用修改后的代码,并确保所有缩进正确,以便程序能够正确执行。如果您还有其他问题,请随时提问。

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

isdkz 发表于 2023-8-4 17:16:04

在这段代码中,虽然使用了Pygame库来创建窗口和绘制图形,但是没有实现动画效果的原因是代码中的绘图和窗口更新操作都在一个循环内部进行,并且没有添加延时或者帧率控制的机制。

要实现动画效果,可以使用pygame.time.Clock对象来控制帧率,同时在每一帧绘制完成后,使用pygame.display.update()方法来更新窗口。

以下是修改后的代码,其中添加了帧率控制和窗口更新的操作:

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()

clock = pygame.time.Clock()# 创建Clock对象,用于控制帧率

num = 1

while True:
    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:
            exit()


这样修改后的代码会以每秒30帧的速度进行绘制和更新窗口,从而实现动画效果。

tyh小号 发表于 2023-8-4 17:16:09

在你的代码中,虽然你使用了pygame.display.update()函数来更新窗口内容,但是由于你的主循环没有进行延时操作,导致更新过快,看不到动画效果。

你可以通过添加一个适当的延时操作来实现动画效果。例如使用pygame.time.delay()函数来在每次循环之后延迟一定时间,可以让图形显示在屏幕上一段时间再进行下一次循环。以下是改进后的代码:

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))
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.time.delay(100)# 延迟100毫秒

pygame.quit()


在这个改进的代码中,我添加了pygame.time.delay(100)来每次循环后延迟100毫秒。这样就能够看到动画效果了。

希望这个改进的代码可以满足您的需求。如果您有任何其他问题,请随时提问。
如果问题已经解决,请设置最佳答案

adsl9999 发表于 2023-8-5 10:35:57

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))
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.time.delay(100)# 延迟100毫秒

pygame.quit()
还是没有动画效果,还有我这个也有延时操作,num就是这个作用。
页: [1]
查看完整版本: python