鱼C论坛

 找回密码
 立即注册
查看: 4723|回复: 11

[技术交流] 《零基础》 81课和82课 的bug修复

[复制链接]
发表于 2017-9-3 12:51:11 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 黎明§末日 于 2017-9-3 13:23 编辑

由于小甲鱼在视频中演示的例子有些小问题,so供上参考
代码有点乱

第81课 (自带详细注释)

my2.gif
修复以下几个bug:
  • 出界问题
  • 放大缩小后的方向(我用的是比较强硬的方法,期待大家有别的想法)
  • 缩放后的边界问题

还有一些,但记不清了

  1. '''导入模块'''
  2. # 导入pygame
  3. import pygame
  4. # 导入sys
  5. import sys
  6. # 导入pygame的locals的所有内容
  7. from pygame.locals import *


  8. '''设置变量'''
  9. # pygame初始化
  10. pygame.init()
  11. # 设置初始尺寸
  12. init_size = [600, 400]
  13. full_size = [1024, 768]
  14. # 设置初始移动速度
  15. speed = [-5, 5]
  16. # 设置背景颜色 RGB
  17. bg = (255, 255, 255)
  18. # 打开纪录事件文件
  19. f = open('record.txt', 'w')
  20. # 是否属于全屏
  21. fullscreen = False
  22. # 设置可调节尺寸的桌布
  23. screen = pygame.display.set_mode(init_size, RESIZABLE)
  24. # 设置初始标题
  25. pygame.display.set_caption("初次见面,请大家多多关照!")
  26. # 初始图片比例
  27. ratio = 1.0
  28. # 导入图片,为此设置一个常量
  29. oturtle = pygame.image.load("turtle.png")
  30. # 设置一个常变的图片变量
  31. turtle = oturtle
  32. # 获得固定图片的位置矩形
  33. oturtle_rect = oturtle.get_rect()
  34. # 设置位置和常变图片的位置矩形
  35. position = turtle_rect = oturtle_rect
  36. # 朝左的图像变量
  37. l_head = turtle
  38. # 朝右的图像变量
  39. r_head = pygame.transform.flip(turtle, True, False)
  40. # 设置倍数:宽
  41. multiple_width = 1
  42. # 设置倍数:高
  43. multiple_height = 1

  44. '''主循环'''

  45. # 死循环
  46. while True:

  47.     '''事件循环'''
  48.     # 获得事件信息
  49.     for event in pygame.event.get():
  50.         # 将事件的信息写入事件文件
  51.         f.write(str(event) + '\n')
  52.         # 判断是否点击关闭按钮
  53.         if event.type == pygame.QUIT:
  54.             # 事件文件关闭
  55.             f.close()
  56.             # 退出
  57.             sys.exit()

  58.         '''键盘事件'''
  59.         # 判断是否有键盘操作
  60.         if event.type == KEYDOWN:
  61.             '''键盘改变方向'''
  62.             # 如果输入键为 ←
  63.             if event.key == K_LEFT:

  64.                 # 如果要出界
  65.                 if position.left > 0:
  66.                     # 头朝左
  67.                     turtle = l_head
  68.                     print('左')
  69.                     # 设置移动方向和速度
  70.                     speed = [-5, 0]

  71.             # 如果输入键为 →
  72.             if event.key == K_RIGHT:
  73.                 # 如果要出界
  74.                 if position.right < init_size[0]:
  75.                     turtle = r_head
  76.                     # 头朝右
  77.                     print('右')
  78.                     # 设置移动方向和速度
  79.                     speed = [5, 0]

  80.             # 如果输入键为 ↑
  81.             if event.key == K_UP:
  82.                 # 如果要出界
  83.                 if position.top > 0:
  84.                     print('上')
  85.                     # 设置移动方向和速度
  86.                     speed = [0, -5]

  87.             # 如果输入键为 ↓
  88.             if event.key == K_DOWN:
  89.                 # 如果要出界
  90.                 if position.bottom < init_size[1]:
  91.                     print('下')
  92.                     # 设置移动方向和速度
  93.                     speed = [0, 5]

  94.             '''全屏'''
  95.             # 如果输入键为 F11
  96.             if event.key == K_F11:

  97.                 # 设置变量'fullscreen',更改其状态
  98.                 fullscreen = not fullscreen
  99.                 # 设置倍数:宽
  100.                 multiple_width = (position[0] // init_size[0])
  101.                 # 设置倍数:高
  102.                 multiple_height = (position[1] // init_size[1])
  103.                 # 如果'fullscreen'为True
  104.                 if fullscreen:
  105.                     # 使其改变为全屏,并开启硬件加速
  106.                     screen = pygame.display.set_mode(full_size, FULLSCREEN | HWSURFACE)
  107.                     # 通过缩放倍数来设置图片位置的宽
  108.                     position[0] = full_size[0]*multiple_width
  109.                     # 将结果四舍五入
  110.                     position[0] = int(position[0]+0.5)
  111.                     # 通过缩放倍数来设置图片位置的高
  112.                     position[1] = full_size[1]*multiple_height
  113.                     # 将结果四舍五入
  114.                     position[1] = int(position[1] + 0.5)
  115.                     # 保存旧的宽和高
  116.                     old_width, old_height = init_size[0], init_size[1]
  117.                     # 设置宽和高
  118.                     init_size = full_size
  119.                     # 刷新图片位置
  120.                     screen.blit(turtle, position)

  121.                 # 否则
  122.                 else:
  123.                     # 回到全屏前尺寸
  124.                     screen = pygame.display.set_mode([old_width, old_height], RESIZABLE)
  125.                     # 设置边框位置(易发bug)
  126.                     init_size = [old_width, old_height]
  127.                     # 通过缩放倍数来设置图片位置的宽
  128.                     position[0] = init_size[0]*multiple_width
  129.                     # 通过缩放倍数来设置图片位置的高
  130.                     position[1] = init_size[1]*multiple_height
  131.                     # 刷新图片位置
  132.                     screen.blit(turtle, position)

  133.             '''缩放图片'''
  134.             # 如果为'=','-',' '
  135.             if event.key == K_EQUALS or event.key == K_MINUS or event.key == K_SPACE:
  136.                 # 如果输入键为'='
  137.                 if event.key == K_EQUALS and ratio < 2:
  138.                     # 放大缩放倍数
  139.                     ratio += 0.1

  140.                 # 如果输入键为'-'
  141.                 if event.key == K_MINUS and ratio > 0.5:
  142.                     # 缩小缩放倍数
  143.                     ratio -= 0.1

  144.                 # 如果输入键为' '
  145.                 if event.key == K_SPACE:
  146.                     # 恢复缩放倍数
  147.                     ratio = 1.0

  148.                 # 保留一位小数
  149.                 ratio = float('%1f' % ratio)
  150.                 # 使用图片常量的缩放结果更改常变的图片变量
  151.                 turtle = pygame.transform.smoothscale(oturtle, (int(oturtle_rect.width * ratio), int(oturtle_rect.height * ratio)))
  152.                 # 获得旧的位置
  153.                 old_position = position
  154.                 # 获得新的图片矩形(易发bug)
  155.                 position = turtle.get_rect()
  156.                 # 取得旧位置
  157.                 position[0], position[1] = int(old_position[0]), int(old_position[1])
  158.                 # 获得新尺寸朝左的图像变量
  159.                 l_head = turtle
  160.                 # 获得新尺寸朝右的图像变量
  161.                 r_head = pygame.transform.flip(l_head, True, False)

  162.             '''更改桌布'''
  163.             # 如果更改了桌布尺寸
  164.             if event.type == VIDEORESIZE:
  165.                 # 更改桌布尺寸
  166.                 size = event.size
  167.                 # 输出更改后的桌布尺寸
  168.                 # 设置桌布
  169.                 screen = pygame.display.set_mode(size, RESIZABLE)

  170.     # 移动图片
  171.     position = position.move(speed)

  172.     '''如果图片在左右两边出界'''
  173.     if position.left < 0:
  174.         # 回到边框
  175.         position.left = 0
  176.         # 更改移动方向
  177.         speed[0] = -speed[0]
  178.     if position.right > init_size[0]:
  179.         # 回到边框
  180.         position.right = init_size[0]
  181.         # 更改移动方向
  182.         speed[0] = -speed[0]

  183.     '''如果图片在上下两边出界'''
  184.     if position.top < 0:
  185.         # 回到边框
  186.         position.top = 0
  187.         # 更改移动方向
  188.         speed[1] = -speed[1]
  189.     if position.bottom > init_size[1]:
  190.         # 回到边框
  191.         position.bottom = init_size[1]
  192.         # 更改移动方向
  193.         speed[1] = -speed[1]

  194.     '''强行转向'''
  195.     if speed[0] < 0:
  196.         turtle = l_head
  197.     if speed[0] > 0:
  198.         turtle = r_head

  199.     '''刷新图片'''
  200.     # 绘制桌布
  201.     screen.fill(bg)
  202.     # 刷新图片位置
  203.     screen.blit(turtle, position)
  204.     # 绘制
  205.     pygame.display.flip()
  206.     # 暂停
  207.     pygame.time.delay(10)
复制代码

(此代码已测试)如有问题请回复


                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

###我叫分割线

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

第82课 (自带注释)

my.gif
修复以下几个bug:
  • 从下往上拖时的bug


  1. '''导入模块'''
  2. import pygame
  3. import sys
  4. from pygame.locals import *
  5. pygame.init()

  6. '''设置变量'''
  7. size = width, height = 640, 480
  8. bg = (255, 255, 255)

  9. clock = pygame.time.Clock()
  10. screen = pygame.display.set_mode(size)
  11. pygame.display.set_caption('FishC Demo')

  12. turtle = pygame.image.load("turtle.png")
  13. position1 = turtle.get_rect()
  14. # 使图片居中
  15. position1.center = width//2, height//2
  16. # 0 -> 未选择,1 -> 选择中,2 -> 完成选择
  17. select = 0
  18. select_rect = pygame.Rect(0, 0, 0, 0)
  19. # 0 -> 未拖拽,1 -> 拖拽中,2 -> 完成拖拽
  20. drag = 0


  21. '''主循环'''
  22. while True:
  23.     for event in pygame.event.get():
  24.         if event.type == QUIT:
  25.             sys.exit()

  26.         elif event.type == MOUSEBUTTONDOWN:
  27.             if event.button == 1:
  28.                 print('鼠标按下左键')
  29.                 if select == 0 and drag == 0:
  30.                     # 第一次点击,选择范围
  31.                     start = event.pos
  32.                     select = 1
  33.                 if select == 2 and drag == 0:
  34.                     # 第二次点击,推拽图像
  35.                     capture = screen.subsurface(select_rect).copy()
  36.                     cap_rect = capture.get_rect()
  37.                     drag = 1
  38.                 if select == 2 and drag == 2:
  39.                     # 第三次点击,初始化
  40.                     select = 0
  41.                     drag = 0

  42.         elif event.type == MOUSEBUTTONUP:
  43.             if event.button == 1:
  44.                 print('鼠标松开左键')
  45.                 if select == 1 and drag == 0:
  46.                     # 第一次释放,结束选择
  47.                     stop = event.pos
  48.                     select = 2
  49.                 if select == 2 and drag == 1:
  50.                     # 第二次释放,结束拖拽
  51.                     drag = 2
  52.                     position2 = pygame.mouse.get_pos()

  53.     screen.fill(bg)
  54.     screen.blit(turtle, position1)

  55.     if select != 0:
  56.         position2 = pygame.mouse.get_pos()
  57.         if select == 1:
  58.             stop = position2

  59.         # 判断(从下往上拖时的bug)
  60.         if start[0] < stop[0] and start[1] < stop[1]:
  61.             select_rect.x, select_rect.y = start
  62.             select_rect.width, select_rect.height = stop[0] - start[0], stop[1] - start[1]
  63.         if start[0] > stop[0] and start[1] > stop[1]:
  64.             select_rect.x, select_rect.y = stop
  65.             select_rect.width, select_rect.height = start[0] - stop[0], start[1] - stop[1]
  66.         pygame.draw.rect(screen, (0, 0, 0), select_rect, 1)

  67.         print(select_rect)

  68.         if drag != 0:
  69.             if drag == 1:
  70.                 cap_rect.center = position2
  71.             screen.blit(capture, cap_rect)

  72.     pygame.display.flip()
  73.     clock.tick(10)
复制代码

(此代码已测试)如有问题请回复



                               
登录/注册后可看大图

                               
登录/注册后可看大图

###我叫分割线

                               
登录/注册后可看大图

                               
登录/注册后可看大图

希望大家帮忙看看有没有bug
别水

回复‘吾爱鱼c’见隐藏:
游客,如果您要查看本帖隐藏内容请回复

呵呵,隐藏内容果然是‘隐藏内容’

turtle.png(如果没有将无法执行)

turtle.png(如果没有将无法执行)

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
小伤口 + 2 + 2 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-9-3 13:26:28 | 显示全部楼层
吾爱鱼c
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-3 13:27:33 | 显示全部楼层
厉害,高手啊,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-25 16:33:39 | 显示全部楼层
1
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-25 15:50:26 | 显示全部楼层
吾爱鱼c
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-12 16:53:22 | 显示全部楼层
围观大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-11 21:12:09 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-29 15:53:50 | 显示全部楼层
吾爱鱼C感谢楼主
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-12 12:36:40 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-4-28 10:24:39 | 显示全部楼层
吾爱鱼c
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-28 18:46:44 | 显示全部楼层
您好 请教以下 在调整窗口尺寸之后乌龟并不会使用新的窗口尺寸,我看您代码里面 # 输出更改后的桌布尺寸后面并没有代码,我试了一下通过改变init_size[0],init_size[1] = size,并不会调整桌布尺寸,小乌龟会移动出新桌布之外。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-1-22 12:57:30 | 显示全部楼层
az
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-6 04:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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