2020年9月12日星期六

79 《零基礎入門學習Python》筆記 第079講:Pygame:解惑

《零基礎入門學習Python》第079講:Pygame:解惑


上節課的代碼不知道大家有沒有完全理解、完全吃透,因為關於遊戲開發,有些理論基礎大家要知道,要掌握。所以這一節課我們以問答的形式對上節課大家可能存在的疑惑進行一個總結。

Q1:什麼是Surface 對象?

上節課的例子中,我們說創建兩個Surface 對象,又說將其中一個Surface 對象移動到另外一個Surface 對像上,還說Surface 對像有fill() 方法和blit() 方法。說起來很難理解似的,那什麼是Surface 對象呢?
Surface 對象就是Pygame 裡面用來表示圖像的對象。以後我們說圖像,其實就是Surface 對象,說Surface 對象,也就是圖像。

Q2:將一個圖像繪製到另一個圖像上是怎麼一回事?

比方說,我們上一節課演示了代碼,我們來一個截圖:
這條小蛇就是surface 對象的blit()方法將其移動到畫布的背景上面的,這裡有兩個surface對象嘛,一個是小蛇,一個是背景畫布。那我現在問大家,眼前的是一個圖像還是兩個圖像呢?
沒錯,答案是一個圖像。事實上,在Pygame裡面,每一刻呈現出來的也是一個圖像,我們知道,圖像是由像素組成的,比方說,我們的這條小蛇,我們將其放大,就會看到很多小方塊,就是像素。
我們使用blit() 方法將一個圖像放到另一個圖像上,其實說並不是將一個圖像真的拷貝到另一個圖像上,Pygame 只是修改另一個圖像某一部分的像素的顏色。例如,將小蛇移動到白色畫布上,Pygame只是將畫布上小蛇這一部分位置的像素的顏色改成小蛇這個surface對像對應的像素的顏色,從而達到覆蓋的效果。

Q3:移動圖像是怎麼一回事?

我們已經知道將一個圖像拷貝到兩一個圖像上事實上是修改某一個圖像的某些位置的像素的顏色。移動圖像又是怎麼實現的呢(上節課的小蛇到處走)。這就涉及到幀率的問題。
在遊戲開發和視頻製作中,我們常常會聽到幀這個關鍵詞。幀通常就是指我們的一幅圖像。幀率就是一秒鐘能夠切換多少幅這樣的圖像。Pygame 是支持40至200幀的速度。也就說,Pygame支持每秒切換40-200幅圖像。那麼小蛇是怎樣移動的呢?我們來看一下代碼:
  1. speed = [-2, 1]
  2. # 获得图像的位置矩形
  3. position = turtle.get_rect()
  4. # 移动图像
  5. position = position.move(speed)
移動圖像就是調用move()方法,事實上就是修改矩形範圍的位置。x軸減2,y軸加1。
移動之後,我們使用fill()方法將畫布背景填充為白色,我們再使用blit()方法將移動後的小蛇貼到畫布上,最後更新、延遲。

Q4:如何控制遊戲的速度?

在上節課中,由於怕我們的小蛇亂竄,我們採用了time模塊的delay() 方法進行延遲。我們剛才已經提到的幀率,其實我們的Pygame 是可以直接來設置幀率的,time 模塊有一個Clock 類,我們在前面實例化一個Clock對象,賦值給變量clock。Clock 對像有一個方法叫做tick(),參數就是設置的幀率,比如我們這裡設置為200。(得到的小蛇的幀率就是不高於200幀,大家可以運行一下)
  1. import pygame
  2. import sys
  3. # 初始化Pygame
  4. pygame.init()
  5. size = width, height = 800, 600
  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. while True:
  19. for event in pygame.event.get():
  20. if event.type == pygame.QUIT:
  21. sys.exit()
  22. # 移动图像
  23. position = position.move(speed)
  24. if position.left < 0 or position.right > width:
  25. # 翻转图像
  26. turtle = pygame.transform.flip(turtle, True, False) #水平翻转,垂直不翻转
  27. # 反方向移动
  28. speed[0] = -speed[0]
  29. if position.top < 0 or position.bottom > height:
  30. speed[1] = -speed[1]
  31. # 填充背景
  32. screen.fill(bg)
  33. # 更新图像
  34. screen.blit(turtle, position)
  35. # 更新界面
  36. pygame.display.flip()
  37. # 延迟10毫秒
  38. #pygame.time.delay(10)
  39. #设置帧率
  40. clock.tick(200)
通常我們就是使用這樣的方法來控制遊戲的速度,因為用戶的顯卡不一樣,有的人跑得快,有的人跑得慢,你可以把速度控制在一定的水平下。

Q5:Pygame的效率搞高不高?

有的人很關心這個問題,因為我們知道Python 雖然簡潔好用,非常方便,但是它的效率不高,而遊戲開發對於性能是有著苛刻的追求的,比如說在復雜的繪製環境中,我們要保持一個比較高的幀率,遊戲才能體現出流暢的感覺。Pygame裡面的大部分模塊考慮到效率的原因,都是由C語言來編寫並優化的,因此,效率方面肯定不在話下。因為現在大部分的遊戲引擎都是用C 語言來寫的,考慮的就是效率,官方數據顯示,剛才我們也提到了,它的幀率是保持在40-200幀/秒,對於人眼,每秒30幀被認為是可以接受的流暢度。

Q6:學習Pygame,應該從哪裡獲得幫助呢?

我們不得不說,Pygame的官網是有詳細的文檔的:
但是有很多時候,我們是上不去這個網站的,該怎麼辦呢?
別擔心,我接下來會創建一個新的專欄,提供Pygame 的文檔詳解。(前面的Tkinter 就是這樣學習的:一邊看課程,一邊看文檔)。

0 留言:

發佈留言