鱼C论坛

 找回密码
 立即注册
查看: 1155|回复: 17

[已解决]pygame图像定在原地

[复制链接]
发表于 2023-9-2 10:55:34 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 风眠 于 2023-9-2 10:59 编辑

源码:
  1. import pygame
  2. import sys

  3. pygame.init()

  4. size = width , height = 600,600
  5. speed = [-2,1]
  6. bg = (255,255,255)

  7. screen = pygame.display.set_mode(size)
  8. pygame.display.set_caption('初次见面,请大家多多关照!')

  9. turtle = pygame.image.load('turtle.png')
  10. position = turtle.get_rect()

  11. while True:
  12.     for event in pygame.event.get():
  13.         if event.type == pygame.QUIT:
  14.             sys.exit()

  15.     position = position.move(speed)

  16.     if position.left < 0 or position.right > width:
  17.         turtle = pygame.transform.flip(turtle,True,False)
  18.         speed[0] = -speed[0]

  19.     if position.top  < 0 or position.bottom > height:
  20.         speed[1] = -speed[1]

  21.     screen.fill(bg)
  22.     screen.blit(turtle,position)
  23.     pygame.display.flip()
  24.     pygame.time.delay(10)#延迟10毫秒
复制代码

图像一直在原地闪烁(pygame2.5.1)
最佳答案
2023-9-2 11:07:49
如果您的乌龟没有移动,这可能是由于您的代码中缺少了一些必要的部分。在您提供的代码中,乌龟的位置被计算并更新,但是您需要确保乌龟的图像也被更新到新的位置。为了使乌龟移动,您可以尝试以下修改:
  1. import pygame
  2. import sys

  3. pygame.init()

  4. size = width, height = 600, 600
  5. speed = [-2, 1]
  6. bg = (255, 255, 255)

  7. screen = pygame.display.set_mode(size)
  8. pygame.display.set_caption('初次见面,请大家多多关照!')

  9. turtle = pygame.image.load('turtle.png')
  10. position = turtle.get_rect()

  11. while True:
  12.     for event in pygame.event.get():
  13.         if event.type == pygame.QUIT:
  14.             sys.exit()

  15.     position = position.move(speed)
  16.     if position.left < 0 or position.right > width:
  17.         turtle = pygame.transform.flip(turtle, True, False)
  18.         speed[0] = -speed[0]
  19.     if position.top < 0 or position.bottom > height:
  20.         speed[1] = -speed[1]

  21.     screen.fill(bg)
  22.    
  23.     # 在新位置绘制乌龟图像
  24.     screen.blit(turtle, position)
  25.    
  26.     pygame.display.flip()
  27.     pygame.time.delay(10)
复制代码

请确保在新位置绘制乌龟图像,这样它才会在屏幕上移动。如果您仍然遇到问题,可能是与图像文件或其他问题有关,您可以检查乌龟图像文件是否位于正确的路径并且可读。如果问题仍然存在,请提供更多细节,以便我可以帮助您更好地解决问题。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-2 10:55:50 | 显示全部楼层
问题出在每次循环时,都会重新绘制背景并将乌龟图像绘制在新的位置上,导致图像闪烁。解决这个问题的方法是在每次循环开始前,先清除屏幕上的内容,然后再绘制背景和乌龟图像。

以下是修改后的代码:

  1. import pygame
  2. import sys

  3. pygame.init()

  4. size = width, height = 600, 600
  5. speed = [-2, 1]
  6. bg = (255, 255, 255)

  7. screen = pygame.display.set_mode(size)
  8. pygame.display.set_caption('初次见面,请大家多多关照!')

  9. turtle = pygame.image.load('turtle.png')
  10. position = turtle.get_rect()

  11. while True:
  12.     for event in pygame.event.get():
  13.         if event.type == pygame.QUIT:
  14.             sys.exit()

  15.     position = position.move(speed)

  16.     if position.left < 0 or position.right > width:
  17.         turtle = pygame.transform.flip(turtle, True, False)
  18.         speed[0] = -speed[0]

  19.     if position.top < 0 or position.bottom > height:
  20.         speed[1] = -speed[1]

  21.     screen.fill(bg)
  22.     screen.blit(turtle, position)
  23.     pygame.display.flip()
  24.     pygame.time.delay(10)  # 延迟10毫秒
复制代码


这样修改后,每次循环开始前都会清除屏幕上的内容,然后再绘制背景和乌龟图像,避免了图像闪烁的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-2 10:56:07 | 显示全部楼层
根据你提供的代码,图像一直在原地闪烁的问题是因为在每一帧循环中,你都将背景填充颜色并且重新绘制了图像。由于每一帧都使用相同的背景颜色和图像位置,所以会出现闪烁的效果。

要解决这个问题,你可以将填充背景颜色的代码移动到主循环之外,只执行一次。这样背景只会填充一次,不会出现闪烁效果。以下是修改后的代码:

  1. import pygame
  2. import sys

  3. pygame.init()

  4. size = width, height = 600, 600
  5. speed = [-2, 1]
  6. bg = (255, 255, 255)

  7. screen = pygame.display.set_mode(size)
  8. pygame.display.set_caption('初次见面,请大家多多关照!')

  9. turtle = pygame.image.load('turtle.png')
  10. position = turtle.get_rect()

  11. while True:
  12.     for event in pygame.event.get():
  13.         if event.type == pygame.QUIT:
  14.             sys.exit()
  15.    
  16.     position = position.move(speed)
  17.     if position.left < 0 or position.right > width:
  18.         turtle = pygame.transform.flip(turtle, True, False)
  19.         speed[0] = -speed[0]
  20.     if position.top < 0 or position.bottom > height:
  21.         speed[1] = -speed[1]
  22.    
  23.     screen.fill(bg)  # 将背景填充颜色放在主循环之外
  24.    
  25.     screen.blit(turtle, position)
  26.     pygame.display.flip()
  27.     pygame.time.delay(10)
复制代码


通过将背景填充颜色的代码移动到主循环之外,图像将保持在原地而不会闪烁。希望这可以解决你的问题!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-2 10:56:31 | 显示全部楼层
图片自己画的,代码跟着小甲鱼打的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-2 10:58:20 | 显示全部楼层
陶远航 发表于 2023-9-2 10:56
根据你提供的代码,图像一直在原地闪烁的问题是因为在每一帧循环中,你都将背景填充颜色并且重新绘制了图像 ...

还在闪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-2 10:59:04 | 显示全部楼层
isdkz 发表于 2023-9-2 10:55
问题出在每次循环时,都会重新绘制背景并将乌龟图像绘制在新的位置上,导致图像闪烁。解决这个问题的方法是 ...

额,也在闪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-2 11:01:53 | 显示全部楼层
本帖最后由 陶远航 于 2023-9-2 11:03 编辑

我注意到您仍然遇到闪烁的问题。如果图像仍然闪烁,您可以尝试以下两种方法来进一步解决问题:

1. **双缓冲绘制**:使用双缓冲技术可以减少闪烁。在您的代码中,您可以创建一个隐藏的屏幕表面,先在隐藏表面上绘制所有内容,然后一次性将隐藏表面的内容复制到可见屏幕上。这可以通过pygame.Surface实现。

   下面是修改后的代码:

  
  1.    import pygame
  2.    import sys

  3.    pygame.init()
  4.    size = width, height = 600, 600
  5.    speed = [-2, 1]
  6.    bg = (255, 255, 255)
  7.    screen = pygame.display.set_mode(size)
  8.    pygame.display.set_caption('初次见面,请大家多多关照!')
  9.    turtle = pygame.image.load('turtle.png')
  10.    position = turtle.get_rect()
  11.    # 创建一个隐藏的屏幕表面
  12.    hidden_screen = pygame.Surface(screen.get_size())
  13.    while True:
  14.        for event in pygame.event.get():
  15.            if event.type == pygame.QUIT:
  16.                sys.exit()
  17.        position = position.move(speed)
  18.        if position.left < 0 or position.right > width:
  19.            turtle = pygame.transform.flip(turtle, True, False)
  20.            speed[0] = -speed[0]
  21.        if position.top < 0 or position.bottom > height:
  22.            speed[1] = -speed[1]

  23.        # 在隐藏表面上绘制所有内容
  24.        hidden_screen.fill(bg)
  25.        hidden_screen.blit(turtle, position)

  26.        # 将隐藏表面的内容一次性复制到可见屏幕上
  27.        screen.blit(hidden_screen, (0, 0))
  28.        pygame.display.flip()
  29.        pygame.time.delay(10)
  30.    
复制代码

   使用这种方法,您可以减少闪烁效果,因为所有绘制操作都先在隐藏表面上进行,然后一次性将其复制到可见屏幕上。

2. **使用pygame.time.Clock 控制帧率**:您可以使用pygame.time.Clock来控制帧率,以确保每秒的帧数是一致的。这有助于减少闪烁。在主循环中添加以下代码:

  
  1.    clock = pygame.time.Clock()
  2.    while True:
  3.        clock.tick(60)  # 控制帧率为每秒60帧
  4.        # ... 其他代码不变 ...
  5.    
复制代码


   这将确保游戏以每秒60帧的速度运行,帮助减少闪烁。


尝试这些方法中的一个或两者组合,应该能够减少或解决闪烁问题。希望这能帮助您!如果您有更多问题,请随时提出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-2 11:06:34 | 显示全部楼层
陶远航 发表于 2023-9-2 11:01
我注意到您仍然遇到闪烁的问题。如果图像仍然闪烁,您可以尝试以下两种方法来进一步解决问题:

1. **双 ...

效果不大——对了我的乌龟为什么不走?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-2 11:07:49 | 显示全部楼层    本楼为最佳答案   
如果您的乌龟没有移动,这可能是由于您的代码中缺少了一些必要的部分。在您提供的代码中,乌龟的位置被计算并更新,但是您需要确保乌龟的图像也被更新到新的位置。为了使乌龟移动,您可以尝试以下修改:
  1. import pygame
  2. import sys

  3. pygame.init()

  4. size = width, height = 600, 600
  5. speed = [-2, 1]
  6. bg = (255, 255, 255)

  7. screen = pygame.display.set_mode(size)
  8. pygame.display.set_caption('初次见面,请大家多多关照!')

  9. turtle = pygame.image.load('turtle.png')
  10. position = turtle.get_rect()

  11. while True:
  12.     for event in pygame.event.get():
  13.         if event.type == pygame.QUIT:
  14.             sys.exit()

  15.     position = position.move(speed)
  16.     if position.left < 0 or position.right > width:
  17.         turtle = pygame.transform.flip(turtle, True, False)
  18.         speed[0] = -speed[0]
  19.     if position.top < 0 or position.bottom > height:
  20.         speed[1] = -speed[1]

  21.     screen.fill(bg)
  22.    
  23.     # 在新位置绘制乌龟图像
  24.     screen.blit(turtle, position)
  25.    
  26.     pygame.display.flip()
  27.     pygame.time.delay(10)
复制代码

请确保在新位置绘制乌龟图像,这样它才会在屏幕上移动。如果您仍然遇到问题,可能是与图像文件或其他问题有关,您可以检查乌龟图像文件是否位于正确的路径并且可读。如果问题仍然存在,请提供更多细节,以便我可以帮助您更好地解决问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-2 11:11:23 | 显示全部楼层
本帖最后由 风眠 于 2023-9-2 11:14 编辑
陶远航 发表于 2023-9-2 11:07
如果您的乌龟没有移动,这可能是由于您的代码中缺少了一些必要的部分。在您提供的代码中,乌龟的位置被计算 ...


额,难道是我pygame的问题?为什么还不动?!对了路径没问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-2 11:17:11 | 显示全部楼层
风眠 发表于 2023-9-2 11:11
额,难道是我pygame的问题?为什么还不动?!对了路径没问题


Pygame应该是没问题的,版本差别不大。你确定代码跟小甲鱼的一样?

你可以再检查一下,再不行我就不知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-2 11:17:38 | 显示全部楼层
陶远航 发表于 2023-9-2 11:17
Pygame应该是没问题的,版本差别不大。你确定代码跟小甲一样?

你可以再检查一下,再不行我就不知道了

好的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-2 11:18:11 | 显示全部楼层
陶远航 发表于 2023-9-2 11:17
Pygame应该是没问题的,版本差别不大。你确定代码跟小甲一样?

你可以再检查一下,再不行我就不知道了

不管了,麻烦了你这么久,最佳答案给你了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-2 11:18:42 | 显示全部楼层
风眠 发表于 2023-9-2 11:18
不管了,麻烦了你这么久,最佳答案给你了

这就不用了吧,你解决了再说
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-2 11:19:13 | 显示全部楼层
风眠 发表于 2023-9-2 11:18
不管了,麻烦了你这么久,最佳答案给你了

好吧,你再核对一遍代码看看吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-2 11:21:29 | 显示全部楼层
风眠 发表于 2023-9-2 11:11
额,难道是我pygame的问题?为什么还不动?!对了路径没问题

我是没有问题的,我试了一下,正常运行,并没有出现你说的闪烁的情况。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-2 11:29:40 | 显示全部楼层
陶远航 发表于 2023-9-2 11:18
这就不用了吧,你解决了再说

那个抱歉,是我自己画的龟兄太大了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-2 11:30:18 | 显示全部楼层
风眠 发表于 2023-9-2 11:29
那个抱歉,是我自己画的龟兄太大了

好吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 19:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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