2020年9月12日星期六

85 《零基礎入門學習Python》筆記 第085講:Pygame:動畫精靈

《零基礎入門學習Python》第085講:Pygame:動畫精靈


截至目前為止,我們已經學會了Pygame 的事件、Pygame 圖片的轉換以及移動、基本的圖形繪製、透明度調整這些內容。但距離我們真正的實現一個小遊戲還差一個重要的環節,那就是碰撞檢測,在講碰撞檢測之前,我們需要補充一個新的知識點,叫做動畫精靈。
動畫精靈是指在遊戲開發中,那些被賦予靈魂的事物,像前面例子中的小蛇。
在真正的遊戲開發中,遠遠不止只有一個精靈,數量隨時都會發生變化,比如說:敵人不斷地出現以及被消滅,它們的移動軌跡也並不都是一樣的,既然移動軌跡不同,就一定會發生碰撞,這就說明我們的精靈還要支持碰撞檢測,碰撞檢測是遊戲開發中一個重要的環節。
我記得在若干年前,網上還一直很流行面向對象和麵向過程兩大陣營的PK,不過現在這一類的討論越來越少了。在此之前,我們一直使用面向過程的思維方式在寫代碼,先載入一張圖片,構造一條小蛇,然後對各種事件進行按順序的處理,讓小蛇可以依照我們的想法去移動、去撞牆,我們的代碼也越來越完善了。但是,這種思維方式有一定的局限性,比方說,你的精靈多起來了,你的小蛇一多,那你就需要花很多時間去考量大量重複的代碼應該如何去部署才能使得你的代碼更優美,語句之間不會產生衝突,然後你就焦頭亂額了。
所以這一節課我們會教大家面向對象的遊戲開發思維是怎樣的。
從今天開始,這幾節課,我來帶大家完成一個小遊戲來學習新的知識,同時,體驗一個遊戲開發的過程,這個小遊戲的名字叫做Play TheBall。

    至此,遊戲結束!

我們現在就來一步一步寫這個小遊戲:
我們剛才一直在說動畫精靈,其實Pygame 已經給我們準備了一個動畫精靈的基類,我們繼承它就可以了。
  1. import pygame
  2. import sys
  3. from pygame.locals import * #把Pygame 的常量名导进去
  4. from random import *
  5. class Ball(pygame.sprite.Sprite): #继承动画精灵基类
  6. def __init__(self, image, position, speed, bg_size):
  7. pygame.sprite.Sprite.__init__(self)
  8. self.image = pygame.image.load(image).convert_alpha()
  9. self.rect = self.image.get_rect()
  10. self.rect.left, self.rect.top = position
  11. self.speed = speed
  12. self.width, self.height = bg_size[0], bg_size[1]
  13. def move(self):
  14. self.rect = self.rect.move(self.speed)
  15. #实现小球从某侧出界,从对侧进来
  16. if self.rect.right < 0:
  17. self.rect.left = self.width
  18. elif self.rect.left > self.width:
  19. self.rect.right = 0
  20. elif self.rect.bottom < 0:
  21. self.rect.top = self.height
  22. elif self.rect.top > self.height:
  23. self.rect.bottom = 0
  24. def main():
  25. pygame.init()
  26. ball_image = "gray_ball.png"
  27. bg_image = "background.png"
  28. running = True
  29. bg_size = width, height = 1024, 681
  30. screen = pygame.display.set_mode(bg_size)
  31. pygame.display.set_caption("Play the ball - Python Demo")
  32. background = pygame.image.load(bg_image).convert_alpha()
  33. balls = []
  34. for i in range(5): #创建5个球
  35. position = randint(0, width-100), randint(0, height-100)
  36. speed = [randint(-10, 10), randint(-10, 10)]
  37. ball = Ball(ball_image, position, speed, bg_size)
  38. balls.append(ball)
  39. clock = pygame.time.Clock()
  40. while running: #后面会在游戏结束时,给running 赋值 False。
  41. for event in pygame.event.get():
  42. if event.type == QUIT: #当按关闭时停止游戏
  43. sys.exit()
  44. screen.blit(background, (0, 0))
  45. for each in balls:
  46. each.move()
  47. screen.blit(each.image, each.rect)
  48. pygame.display.flip()
  49. clock.tick(30)
  50. if __name__ == "__main__":
  51. main()

目前已經實現了生成5個小球以及小球的自由移動。

<未完待續>

0 留言:

發佈留言