鱼C论坛

 找回密码
 立即注册
查看: 1635|回复: 4

[已解决]求助:视频81pygame 在边界颤抖的bug如何修复?

[复制链接]
发表于 2018-2-28 17:57:29 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 苏丛 于 2018-2-28 19:28 编辑

小甲鱼演示的有bug的代码是这样的
  1. import pygame
  2. import sys
  3. from pygame.locals import*

  4. #初始化Pygame
  5. pygame.init()

  6. size = width, height = 600, 400
  7. speed = [-2, 3]
  8. bg = (180, 90, 200)

  9. screen = pygame.display.set_mode(size, RESIZABLE)
  10. person = pygame.image.load('1.png')
  11. position = person.get_rect()

  12. l_head = person
  13. r_head = pygame.transform.flip(person, True, False)

  14. while True:
  15.     for event in pygame.event.get():
  16.         if event.type == pygame.QUIT:
  17.             sys.exit()

  18.         if event.type == KEYDOWN:
  19.             if event.key == K_LEFT:
  20.                 person = l_head
  21.                 speed = [-1, 0]
  22.             elif event.key == K_RIGHT:
  23.                 person = r_head
  24.                 speed = [1, 0]
  25.             elif event.key == K_UP:
  26.                 speed = [0, -1]
  27.             elif event.key == K_DOWN:
  28.                 speed = [0, 1]

  29.         #用户调整窗口尺寸
  30.         if event.type == VIDEORESIZE:
  31.             size = event.size
  32.             width, height = size
  33.             print(size)
  34.             #重新画屏幕
  35.             screen = pygame.display.set_mode(size, RESIZABLE)
  36.                
  37.     #移动图像
  38.     position = position.move(speed)

  39.     if position.left < 0 or position.right > width:
  40.         person = pygame.transform.flip(person, True, False)
  41.         speed[0] = -speed[0]

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

  44.     #填充背景
  45.     screen.fill(bg)
  46.     #更新图像
  47.     screen.blit(person, position)
  48.     #更新界面
  49.     pygame.display.flip()
  50.     #延迟10毫秒
  51.     pygame.time.delay(10)
复制代码

bug就是把界面边框拖拽到图片上时图片会在边框上抽搐

小甲鱼说课后作业有修复后的代码,但貌似没有课后作业了。

我想到的解决方法是直接改位置
代码如下
  1. import pygame
  2. import sys
  3. from pygame.locals import*

  4. #初始化Pygame
  5. pygame.init()

  6. size = width, height = 600, 400
  7. speed = [-2, 3]
  8. bg = (180, 90, 200)

  9. screen = pygame.display.set_mode(size, RESIZABLE)
  10. person = pygame.image.load('1.png')
  11. position = person.get_rect()

  12. l_head = person
  13. r_head = pygame.transform.flip(person, True, False)

  14. while True:
  15.     for event in pygame.event.get():
  16.         if event.type == pygame.QUIT:
  17.             sys.exit()

  18.         if event.type == KEYDOWN:
  19.             if event.key == K_LEFT:
  20.                 person = l_head
  21.                 speed = [-1, 0]
  22.             elif event.key == K_RIGHT:
  23.                 person = r_head
  24.                 speed = [1, 0]
  25.             elif event.key == K_UP:
  26.                 speed = [0, -1]
  27.             elif event.key == K_DOWN:
  28.                 speed = [0, 1]

  29.         #用户调整窗口尺寸
  30.         if event.type == VIDEORESIZE:
  31.             size = event.size
  32.             width, height = size
  33.             print(size)
  34.             #重新画屏幕
  35.             screen = pygame.display.set_mode(size, RESIZABLE)
  36.                
  37.     #移动图像
  38.     position = position.move(speed)

  39.     if position.left < 0 or position.right == width + 2:
  40.         person = pygame.transform.flip(person, True, False)
  41.         speed[0] = -speed[0]

  42.     if position.top < 0 or position.bottom == height + 3:
  43.         speed[1] = -speed[1]
  44.     #直接修改位置
  45.     if position.right > width + 2:
  46.         position[0] -= position.right - size[0]

  47.     if position.bottom > height + 3:
  48.         position[1] -= position.bottom - size[1]

  49.     #填充背景
  50.     screen.fill(bg)
  51.     #更新图像
  52.     screen.blit(person, position)
  53.     #更新界面
  54.     pygame.display.flip()
  55.     #延迟10毫秒
  56.     pygame.time.delay(10)
复制代码

求指点
有没有更好的解法

谢谢
最佳答案
2018-3-1 01:36:32
你的思路直接改變位置的方法是正確的
以下是我自己的代碼給你參考

改變窗口大小後邊界顫抖解決方法有兩步驟

1. 把改變後的窗口大小(width, height)重新定義給size

  1. if event.key == K_s and pygame.key.get_mods() & KMOD_LCTRL:  #縮小
  2.                 if i < len(displaylist)-1:
  3.                     i += 1
  4.                     size = width, height = displaylist[i]
  5.                     screen = pygame.display.set_mode(size)
  6.                

  7.             if event.key == K_b and pygame.key.get_mods() & KMOD_LCTRL:  #放大
  8.                 if i > 0:
  9.                     i -= 1
  10.                     size = width, height =displaylist[i]
  11.                     screen = pygame.display.set_mode(size)
复制代码


2.烏龜位置改變根據窗口邊界(width, height)大小,超過就是=窗口邊界
這樣就不會被卡住了

  1. if position.left < 0:
  2.         position.left = 0
  3.         speed[0] = -speed[0]

  4.     if position.right > width:
  5.         position.right = width
  6.         speed[0] = -speed[0]

  7.     if position.top < 0:
  8.         position.top = 0
  9.         speed[1] = -speed[1]

  10.     if position.bottom > height:
  11.         position.bottom = height
  12.         speed[1] = -speed[1]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-2-28 20:58:39 | 显示全部楼层
大佬们给点意见呗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-1 01:36:32 | 显示全部楼层    本楼为最佳答案   
你的思路直接改變位置的方法是正確的
以下是我自己的代碼給你參考

改變窗口大小後邊界顫抖解決方法有兩步驟

1. 把改變後的窗口大小(width, height)重新定義給size

  1. if event.key == K_s and pygame.key.get_mods() & KMOD_LCTRL:  #縮小
  2.                 if i < len(displaylist)-1:
  3.                     i += 1
  4.                     size = width, height = displaylist[i]
  5.                     screen = pygame.display.set_mode(size)
  6.                

  7.             if event.key == K_b and pygame.key.get_mods() & KMOD_LCTRL:  #放大
  8.                 if i > 0:
  9.                     i -= 1
  10.                     size = width, height =displaylist[i]
  11.                     screen = pygame.display.set_mode(size)
复制代码


2.烏龜位置改變根據窗口邊界(width, height)大小,超過就是=窗口邊界
這樣就不會被卡住了

  1. if position.left < 0:
  2.         position.left = 0
  3.         speed[0] = -speed[0]

  4.     if position.right > width:
  5.         position.right = width
  6.         speed[0] = -speed[0]

  7.     if position.top < 0:
  8.         position.top = 0
  9.         speed[1] = -speed[1]

  10.     if position.bottom > height:
  11.         position.bottom = height
  12.         speed[1] = -speed[1]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-2 21:31:50 | 显示全部楼层
laurence5181 发表于 2018-3-1 01:36
你的思路直接改變位置的方法是正確的
以下是我自己的代碼給你參考

这个displaylist没有定义哦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-3 09:36:17 | 显示全部楼层
苏丛 发表于 2018-3-2 21:31
这个displaylist没有定义哦
  1. displaylist = pygame.display.list_modes()
复制代码


我更改視窗大小是透過這個方法 會傳回一個所有解析度的List
再透過list的方法去做變化
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-15 06:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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