2020年9月12日星期六

80 《零基礎入門學習Python》筆記 第080講:Pygame:事件

《零基礎入門學習Python》第080講:Pygame:事件


這節課我們來談談事件,什麼是事件呢?
事實上,我們可以看到,遊戲就是一個死循環,如果我們不去干預它的話,它會自己玩得很開心,像之前我們寫的亂跑的小蛇。而事件就是Pygame 提供給我們去干預它的機制,例如我們點關閉,就會產生QUIT 事件,我們處理這個QUIT 事件的方法就是調用sys.exut() 方法來退出整個程序。
事件隨時都可能發生,比如你在窗口上面移動鼠標,點擊鼠標或者敲擊鍵盤的按鍵,這些都會產生事件,並且信息量是非常大的。Pygame 的做法就是將這所有產生的事件都放在一個叫做事件隊列裡,然後我們通過for 語句迭代出每一個事件,對我們關注的事件進行處理,像我們剛才關注的QUIT 事件。如下面代碼:
  1. for event in pygame.event.get():
  2. if event.type == pygame.QUIT:
  3. sys.exit()
我們現在來寫一個代碼,將程序運行期間產生的所有事件記錄並保存到一個文件中。大家可以先寫一下,再看下面的代碼:
  1. import pygame
  2. import sys
  3. # 初始化Pygame
  4. pygame.init()
  5. size = width, height = 800, 600
  6. screen = pygame.display.set_mode(size)
  7. pygame.display.set_caption("初次见面,请大家多多关照!")
  8. f = open("record.txt", "w") #创建文件,写入形式
  9. while True:
  10. for event in pygame.event.get(): #迭代每一个事件
  11. f.write(str(event) + "\n") #将每一个事件写入文件,以换行符隔开
  12. if event.type == pygame.QUIT:
  13. f.close() #关闭文件
  14. sys.exit()
得到的record.txt 文件裡面就可以看到在程序運行期間的所有事件。
接下來我們希望將這些事件顯示在屏幕上,這就涉及到要在屏幕上顯示文本的功能,或者要求我們在Surface 對像上來打印文字,但是很遺憾的告訴大家,Pygame 並沒有辦法讓你在一個Surface 對像上面繪製你想要的文字,但是Pygame 也提供了可以達到同樣效果的途徑,我們就需要使用到font 模塊的render() 方法。
這個render() 方法就是將顯示的文字活生生的渲染成一個Surface 對象,這樣你就可以調用blit() 方法將一個Surface 對象複製到另一個Surface 上面。
我們就來開始寫代碼吧:
  1. import pygame
  2. import sys
  3. # 初始化Pygame
  4. pygame.init()
  5. size = width, height = 800, 600
  6. screen = pygame.display.set_mode(size)
  7. pygame.display.set_caption("Python Demo")
  8. bg = (0, 0 , 0)
  9. position = 0
  10. #实例化Font对象
  11. font = pygame.font.Font(None, 20)
  12. line_height = font.get_linesize()
  13. screen.fill(bg) #背景画布填充为黑色
  14. while True:
  15. for event in pygame.event.get(): #迭代每一个事件
  16. if event.type == pygame.QUIT:
  17. sys.exit()
  18. screen.blit(font.render(str(event), True, (0, 255, 0)), (0, position))
  19. position += line_height
  20. if position > height:
  21. position = 0
  22. screen.fill(bg)
  23. pygame.display.flip()
在代碼運行過程中,會將產生的事件依次顯示在屏幕上,大家可能對於打印的事件內容和含義還搞不清楚,下表列出了所有常用的Pygame 事件及其含義。
例如MOUSEMOTION,它有3個屬性,pos 表示當前坐標位置,rel 表示距離上一個位置的相對距離,buttons 是一個三元組,表示你按下了哪一個按鈕。
接下來我們就可以做一件事了,讓瘋狂的小蛇受控制了。
我們就不止關注QUIT 事件了,我們還需要關注KEYDOWN。(按鍵事件)
  1. import pygame
  2. import sys
  3. # 初始化Pygame
  4. pygame.init()
  5. size = width, height = 600, 400
  6. speed = [-2, 1]
  7. bg = (255, 255, 255) # RGB
  8. #实例化Pygame 的time 模块的 Clock 对象
  9. clock = pygame.time.Clock()
  10. # 创建指定大小的窗口 Surface
  11. screen = pygame.display.set_mode(size)
  12. # 设置窗口标题
  13. pygame.display.set_caption("初次见面,请大家多多关照!")
  14. # 加载图片
  15. turtle = pygame.image.load("python.png")
  16. # 获得图像的位置矩形
  17. position = turtle.get_rect()
  18. l_head = turtle
  19. r_head = pygame.transform.flip(turtle, True, False)
  20. while True:
  21. for event in pygame.event.get():
  22. if event.type == pygame.QUIT:
  23. sys.exit()
  24. if event.type == pygame.KEYDOWN:
  25. if event.key == pygame.K_LEFT: #按下方向键左键
  26. turtle = l_head #调头
  27. speed = [-1, 0]
  28. if event.key == pygame.K_RIGHT:
  29. turtle = r_head #调头
  30. speed = [1, 0]
  31. if event.key == pygame.K_UP:
  32. speed = [0, -1]
  33. if event.key == pygame.K_DOWN:
  34. speed = [0, 1]
  35. # 移动图像
  36. position = position.move(speed)
  37. if position.left < 0 or position.right > width:
  38. # 翻转图像
  39. turtle = pygame.transform.flip(turtle, True, False)
  40. # 反方向移动
  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(turtle, position)
  48. # 更新界面
  49. pygame.display.flip()
  50. # 延迟10毫秒
  51. #pygame.time.delay(10)
  52. #设置帧率
  53. clock.tick(200)


0 留言:

發佈留言