pygame
建立圖形窗口hm_01_pygame入門.py
遊戲的第一印象python
pygame
建立圖形窗口能夠將圖片素材 繪製 到 遊戲的窗口 上,開發遊戲以前須要先知道 如何創建遊戲窗口!程序員
pygame
提供的全部功能以前,須要調用 init
方法quit
方法方法 | 說明 |
---|---|
pygame.init() |
導入並初始化全部 pygame 模塊,使用其餘模塊以前,必須先調用 init 方法 |
pygame.quit() |
卸載全部 pygame 模塊,在遊戲結束以前調用! |
import pygame pygame.init() # 遊戲代碼... pygame.quit()
(0, 0)
(x, y) (width, height)
pygame
專門提供了一個類 pygame.Rect
用於描述 矩形區域Rect(x, y, width, height) -> Rect
提示動畫
pygame.Rect
是一個比較特殊的類,內部只是封裝了一些數字計算pygame.init()
方法一樣可以直接使用需求ui
hero_rect
矩形描述 英雄的位置和大小x
和 y
)hero_rect = pygame.Rect(100, 500, 120, 126) print("座標原點 %d %d" % (hero_rect.x, hero_rect.y)) print("英雄大小 %d %d" % (hero_rect.width, hero_rect.height)) # size 屬性會返回矩形區域的 (寬, 高) 元組 print("英雄大小 %d %d" % hero_rect.size)
pygame
專門提供了一個 模塊 pygame.display
用於建立、管理 遊戲窗口方法 | 說明 |
---|---|
pygame.display.set_mode() |
初始化遊戲顯示窗口 |
pygame.display.update() |
刷新屏幕內容顯示,稍後使用 |
set_mode
方法3d
set_mode(resolution=(0,0), flags=0, depth=0) -> Surface
resolution
指定屏幕的 寬
和 高
,默認建立的窗口大小和屏幕大小一致flags
參數指定屏幕的附加選項,例如是否全屏等等,默認不須要傳遞depth
參數表示顏色的位數,默認自動匹配set_mode
方法的返回結果!由於:後續全部的圖像繪製都基於這個返回結果# 建立遊戲主窗口 screen = pygame.display.set_mode((480, 700))
# 建立遊戲主窗口 screen = pygame.display.set_mode((480, 700)) # 遊戲循環 while True: pass
pygame.image.load()
加載圖像的數據blit
方法 將圖像繪製到指定位置pygame.display.update()
方法更新整個屏幕的顯示提示:要想在屏幕上看到繪製的結果,就必定要調用
pygame.display.update()
方法code
需求對象
background.png
建立背景(0, 0)
位置# 繪製背景圖像 # 1> 加載圖像 bg = pygame.image.load("./images/background.png") # 2> 繪製在屏幕 screen.blit(bg, (0, 0)) # 3> 更新顯示 pygame.display.update()
需求blog
me1.png
建立英雄飛機(200, 500)
位置# 1> 加載圖像 hero = pygame.image.load("./images/me1.png") # 2> 繪製在屏幕 screen.blit(hero, (200, 500)) # 3> 更新顯示 pygame.display.update()
透明圖像繼承
png
格式的圖像是支持 透明 的update()
方法的做用能夠在
screen
對象完成 全部blit
方法以後,統一調用一次display.update
方法,一樣能夠在屏幕上 看到最終的繪製結果遊戲
display.set_mode()
建立的 screen
對象 是一個 內存中的屏幕數據對象
screen.blit
方法能夠在 畫布 上繪製不少 圖像
display.update()
會將 畫布 的 最終結果 繪製在屏幕上,這樣能夠 提升屏幕繪製效率,增長遊戲的流暢度案例調整
# 繪製背景圖像 # 1> 加載圖像 bg = pygame.image.load("./images/background.png") # 2> 繪製在屏幕 screen.blit(bg, (0, 0)) # 繪製英雄圖像 # 1> 加載圖像 hero = pygame.image.load("./images/me1.png") # 2> 繪製在屏幕 screen.blit(hero, (200, 500)) # 3> 更新顯示 - update 方法會把以前全部繪製的結果,一次性更新到屏幕窗口上 pygame.display.update()
如今 英雄飛機 已經被繪製到屏幕上了,怎麼可以讓飛機移動呢 ?
遊戲循環的開始 就意味着 遊戲的正式開始
1 / 60 秒
移動一下全部圖像的位置pygame.display.update()
更新屏幕顯示pygame
專門提供了一個類 pygame.time.Clock
能夠很是方便的設置屏幕繪製速度 —— 刷新幀率tick(幀率)
方法tick
方法會根據 上次被調用的時間,自動設置 遊戲循環 中的延時# 3. 建立遊戲時鐘對象 clock = pygame.time.Clock() i = 0 # 遊戲循環 while True: # 設置屏幕刷新幀率 clock.tick(60) print(i) i += 1
需求
pygame.Rect
的變量記錄英雄的初始位置y - 1
—— 向上移動y <= 0
將英雄移動到屏幕的底部提示:
- 每一次調用
update()
方法以前,須要把 全部的遊戲圖像都從新繪製一遍- 並且應該 最早 從新繪製 背景圖像
# 4. 定義英雄的初始位置 hero_rect = pygame.Rect(150, 500, 102, 126) while True: # 能夠指定循環體內部的代碼執行的頻率 clock.tick(60) # 更新英雄位置 hero_rect.y -= 1 # 若是移出屏幕,則將英雄的頂部移動到屏幕底部 if hero_rect.y <= 0: hero_rect.y = 700 # 繪製背景圖片 screen.blit(bg, (0, 0)) # 繪製英雄圖像 screen.blit(hero, hero_rect) # 更新顯示 pygame.display.update()
if hero_rect.y + hero_rect.height <= 0: hero_rect.y = 700
提示
Rect
的屬性 bottom = y + height
if hero_rect.bottom <= 0: hero_rect.y = 700
event
只有 捕獲 到用戶具體的操做,纔能有針對性的作出響應
pygame
中經過 pygame.event.get()
能夠得到 用戶當前所作動做 的 事件列表
pygame
遊戲都 大同小異!# 遊戲循環 while True: # 設置屏幕刷新幀率 clock.tick(60) # 事件監聽 for event in pygame.event.get(): # 判斷用戶是否點擊了關閉按鈕 if event.type == pygame.QUIT: print("退出遊戲...") pygame.quit() # 直接退出系統 exit()
pygame
提供了兩個類
pygame.sprite.Sprite
—— 存儲 圖像數據 image 和 位置 rect 的 對象pygame.sprite.Group
Sprite
image
要顯示的圖像rect
圖像要顯示在屏幕的位置update()
方法什麼事情也沒作
pygame.sprite.Sprite
並無提供 image
和 rect
兩個屬性
pygame.sprite.Sprite
派生子類image
和 rect
屬性update()
方法
update()
方法draw(屏幕對象)
方法
image
繪製在 rect
位置Group(*sprites) -> Group
注意:仍然須要調用
pygame.display.update()
才能在屏幕看到最終結果
plane_sprites.py
文件GameSprite
繼承自 pygame.sprite.Sprite
注意
object
super()
一下父類的 __init__
方法__init__
代碼可以被正常執行屬性
image
精靈圖像,使用 image_name
加載rect
精靈大小,默認使用圖像大小speed
精靈移動速度,默認爲 1
方法
update
每次更新屏幕時在遊戲循環內調用
self.rect.y += self.speed
提示
image
的 get_rect()
方法,能夠返回 pygame.Rect(0, 0, 圖像寬, 圖像高) 的對象import pygame class GameSprite(pygame.sprite.Sprite): """遊戲精靈基類""" def __init__(self, image_name, speed=1): # 調用父類的初始化方法 super().__init__() # 加載圖像 self.image = pygame.image.load(image_name) # 設置尺寸 self.rect = self.image.get_rect() # 記錄速度 self.speed = speed def update(self, *args): # 默認在垂直方向移動 self.rect.y += self.speed
需求
步驟
from
導入 plane_sprites
模塊
from
導入的模塊能夠 直接使用import
導入的模塊須要經過 模塊名. 來使用update()
和 draw(screen)
方法職責
update()
方法,根據遊戲需求,更新位置 rectupdate
方法,讓精靈組中的全部精靈調用 update
方法更新位置draw(screen)
方法,在 screen
上繪製精靈組中的全部精靈plane_sprites
模塊from plane_sprites import *
# 建立敵機精靈和精靈組 enemy1 = GameSprite("./images/enemy1.png") enemy2 = GameSprite("./images/enemy1.png", 2) enemy2.rect.x = 200 enemy_group = pygame.sprite.Group(enemy1, enemy2)
# 讓敵機組調用 update 和 draw 方法 enemy_group.update() enemy_group.draw(screen) # 更新屏幕顯示 pygame.display.update()