緊接着上回對於pygame的安裝與實踐,我們再根據我們瞭解的python基礎語法進行實施開發。這一次我們來做一個跳躍的跳跳龍的遊戲。
一、創建遊戲窗口
創建遊戲窗口的同時,我們在窗口內部創建一個跳跳龍。要求要以一定速度移動跳跳龍,當跳跳龍碰到了遊戲窗口的邊緣的時候就會彈回。然後繼續移動。接下來讓我們按照以下的步驟進行實現這個功能。
import sys # 導入sys模塊
import pygame # 導入pygame模塊
pygame.init() # 初始化pygame
size=width,height=640,480 # 設置窗口
FRAME_PER_SECONDS = 27 # 每秒最大幀數
screen=pygame.display.set_mode(size) # 顯示窗口
在我們上面創建遊戲窗口的代碼中,要首先進行導入相應的pygame模塊,然後可以使用init()方法來初始化pygame模塊。接下來就可以設置窗口的高和寬了,最後使用display模塊顯示窗體就可以了,針對display模塊的常用的方法如下表所示。
方法名 | 功能 |
---|---|
pygame.display.init | 初始化display功能 |
pygame.display.quit | 結束display模塊 |
pygame.display.get_init |
如果display模塊已經被初始化,則返回True |
pygame.display.set_mode | 初始化一個準備顯示的對象 |
pygame.display.get_surface | 獲取當前的surface對象 |
pygame.display.flip | 更新整個待顯示的surface對象到屏幕上 |
pygame.display.update |
更新部分的內容顯示到屏幕上,如果沒有參數則與flip功能相同 |
二、關閉當前遊戲窗口
運行上面的代碼之後,窗口出現之後,我們看到了一個一閃而過的黑色窗口,這是因爲程序在運行的時候,因爲程序已經執行完畢,就會自動關閉。如果我們想讓窗口一直執行下去就要使用while True語句讓程序一直執行。此外還要有一個關閉按鈕讓當前的遊戲窗口在關閉的時候同樣退出sys模塊以及退出pygame模塊。
import sys # 導入sys模塊
import pygame # 導入pygame模塊
pygame.init() # 初始化pygame
size = width,height=640,480 # 設置窗口
FRAME_PER_SECONDS = 27 # 每秒最大幀數
screen = pygame.display.set_mode(size) # 顯示窗口
# 執行死循環,確保窗口一直顯示
while True:
# 檢查事件
for event in pygame.event.get():
if event.type == pygame.get():
if event.type == pygame.QUIT: # 如果單擊關閉窗口,則進行退出
sys.exit()
pygame.quit() # 退出pygame
在上面的代碼中我們加入了輪詢事件檢測。pygame.event.get()方法可以獲取到當前事件的隊列,使用for……in語句可以進行遍歷事件,然後我們根據type屬性來判斷當前的事件屬性。這裏的事件處理的方式和GUI相似,QUIT:關閉pygame窗口事件,KEYDOWN:鍵盤按下事件,MOUSEBUTTONDOWN:鼠標按下事件。
三、加入跳跳龍
import sys # 導入sys模塊
import pygame # 導入pygame模塊
pygame.init() # 初始化pygame
size = width,height = 640,480 # 設置窗口
FRAME_PER_SECONDS = 27 # 每秒最大幀數
screen =pygame.display.set_mode(size) # 顯示窗口
color = (0,0,0) # 設置顏色
dragon= pygame.image.load("dragon.png") # 加載圖片
dragonrect = dragon.get_rect() # 獲取矩形區域
# 執行死循環,確保窗口一直顯示
while True:
# 檢查事件
for event in pygame.event.get():
if event.type == pygame.QUIT: # 如果單擊關閉窗口,則退出
sys.exit()
screen.fill(color) # 填充顏色
screen.blit(dragon,dragonrect) # 將圖片畫到窗口上
pygame.display.flip() # 更新全部顯示
pygame.quit()
這裏使用的image模塊的load()方法進行加載圖片,返回值dragon是Surface對象。Surface代表了圖片的pygame對象。同樣的遊戲屏幕也是一個Surface對象,我們使用pygame.Surface.blit方法可以將一個圖像畫到另一個圖像上。
方法名 | 功能 |
---|---|
pygame.Surface.blit |
將一個圖像畫到另一個圖像上 |
pygame.Surface.convert | 轉換圖像的像素格式 |
pygame.Surface.convert_alpha | 轉化圖像的像素格式,包含alpha通道的轉換 |
pygame.Surface.fill | 使用顏色填充Surface |
pygame.Surface.get.rect | 獲取Surface的矩形區域 |
運行上面的代碼。
四、讓跳跳龍跳起來
使用dragon.get_rect()方法返回值dragonrect事伊哥Rect對象,該對象有move()方法可以用於移動矩形。
import sys # 導入sys模塊
import pygame # 導入pygame模塊
pygame.init() # 初始化pygame
size = width,height = 640,480 # 設置窗口
FRAME_PER_SECONDS = 27 # 每秒最大幀數
screen =pygame.display.set_mode(size) # 顯示窗口
color = (0,0,0) # 設置顏色
dragon= pygame.image.load("dragon.png") # 加載圖片
dragonrect = dragon.get_rect() # 獲取矩形區域
speed = [5,5]
# 執行死循環,確保窗口一直顯示
while True:
# 檢查事件
for event in pygame.event.get():
if event.type == pygame.QUIT: # 如果單擊關閉窗口,則退出
sys.exit()
dragonrect = dragonrect.move(speed) # 移動跳跳龍
screen.fill(color) # 填充顏色
screen.blit(dragon,dragonrect) # 將圖片畫到窗口上
pygame.display.flip() # 更新全部顯示
pygame.quit()
可以看到一閃而過的跳跳龍……因爲我們沒有加入碰撞檢測的功能。如果你發現跳跳龍出現飛速移動的情況,這是根據程序中默認的運行代碼的時間算的,這裏我們設置每秒執行100次的運行速率。讓程序運行while循環的速率得到控制。
import sys # 導入sys模塊
import pygame # 導入pygame模塊
pygame.init() # 初始化pygame
size = width,height = 640,480 # 設置窗口
FRAME_PER_SECONDS = 27 # 每秒最大幀數
screen =pygame.display.set_mode(size) # 顯示窗口
color = (0,0,0) # 設置顏色
dragon= pygame.image.load("dragon.jpg") # 加載圖片
dragonrect = dragon.get_rect() # 獲取矩形區域
speed = [5,5]
clock = pygame.time.Clock() # 設置時鐘
# 執行死循環,確保窗口一直顯示
while True:
clock.tick(100) # 每秒執行100次
# 檢查事件
for event in pygame.event.get():
if event.type == pygame.QUIT: # 如果單擊關閉窗口,則退出
sys.exit()
dragonrect = dragonrect.move(speed) # 移動跳跳龍
if dragonrect.left < 0 or dragonrect.right > width:
speed[0] = -speed[0]
if dragonrect.top < 0 or dragonrect.bottom > height:
speed[1] = -speed[1]
screen.fill(color) # 填充顏色
screen.blit(dragon,dragonrect) # 將圖片畫到窗口上
pygame.display.flip() # 更新全部顯示
pygame.quit()
最後:
五、加入活動背景
最後的最後:可以加入跳跳龍的活動背景。
bg = pygame.image.load('bg.jpg')
這樣跳跳龍就有了活動背景。快去試一試吧!
import sys # 導入sys模塊
import pygame # 導入pygame模塊
pygame.init() # 初始化pygame
size = width,height = 640,480 # 設置窗口
screen =pygame.display.set_mode(size) # 顯示窗口
color = (0,0,0) # 設置顏色
def redrawGamescreen():
screen.blit(bg, (0, 0))
dragon= pygame.image.load("dragon.jpg") # 加載圖片
dragonrect = dragon.get_rect() # 獲取矩形區域
bg = pygame.image.load('bg.jpg')
speed = [5,5]
clock = pygame.time.Clock() # 設置時鐘
# 執行死循環,確保窗口一直顯示
while True:
clock.tick(100) # 每秒執行100次
# 檢查事件
for event in pygame.event.get():
if event.type == pygame.QUIT: # 如果單擊關閉窗口,則退出
sys.exit()
dragonrect = dragonrect.move(speed) # 移動跳跳龍
if dragonrect.left < 0 or dragonrect.right > width:
speed[0] = -speed[0]
if dragonrect.top < 0 or dragonrect.bottom > height:
speed[1] = -speed[1]
pygame.display.update()
screen.fill(color) # 填充顏色
screen.blit(dragon,dragonrect) # 將圖片畫到窗口上
pygame.display.flip() # 更新全部顯示
redrawGamescreen()
pygame.quit()