目錄
游戲的原理
安裝Pygame
Pygame常用模塊
Pygame的基本使用? ? ?
實例:制作一個跳躍的小球游戲,如果碰到窗口邊緣會改變小球移動方向
實現(xiàn)步驟:
?運行效果:
小球圖片:? ??
?python代碼:
開發(fā)Flappy Bird游戲
游戲簡介:
運行效果:
圖片素材
游戲分析?
以面向對象的思維方式來分析一下這個游戲可以歸納為兩個對象
小鳥:
管道:
碰撞檢測:
實現(xiàn)步驟
python代碼
游戲的原理
? ? ? ? 窗口:游戲中也有窗口的概念,游戲中的角色都需要再窗口中顯示
? ? ? ? 資源:是指游戲中的背景、角色、聲音等?
? ? ? ? 坐標:在Pygame中有橫軸和縱軸。例如在植物大戰(zhàn)僵尸中不斷修改僵尸的坐標可以實現(xiàn)動畫效果
? ? ? ? ? ? ? ? 注意:Pygame中坐標0,0在創(chuàng)建窗口的左上角,向右則X坐標越大;向下則Y坐標越大
? ? ? ? 運行流程:在python中程序是由上至下執(zhí)行的,執(zhí)行完就結束了游戲窗口隨之關閉。為了能夠讓窗口一直顯示需要設置一個死循環(huán),可以用while True 語句實現(xiàn)。當執(zhí)行地一邊的時候在窗口中添加背景圖片、角色,第二遍同樣添加背景圖片但是每次循環(huán)更新角色坐標。當頻率到至少24次每秒我們肉眼就只會感覺到畫面和角色是一直存在的從而實現(xiàn)了動畫效果
安裝Pygame
Pygame:是python中的模塊,專用于二D游戲開發(fā),要使用它需要先安裝它
安裝命令:pip install pygame
? ? ? ? 如果超時:pip ?install ?-i ?https://pypi.doubanio.com/simple/? ?--trusted-host pypi.doubanio.com pygame
Pygame常用模塊
Pygame官網
優(yōu)勢:Pygame做游戲開發(fā)的優(yōu)勢在于不需要過多考慮與底層開發(fā)相關的內容,而可 以把工作重心放在游戲邏輯上。
1. 常用模塊:
模塊名 |
功能 |
pygame.cdrom |
訪問光驅 |
pygame.cursors |
加載光標 |
pygame.display |
訪問顯示設備 |
pygame.draw |
繪制形狀、線和點 |
pygame.event |
管理事件 |
pygame.fbnt |
使用字體 |
pygame.image |
加載和存儲圖片 |
pygame.joystick |
使用游戲手柄或者類似的東西 |
pygame.key |
讀取鍵盤按鍵 |
pygame.mixer |
聲音 |
pygame.mouse |
鼠標 |
pygame.movie |
播放視頻 |
pygame.music |
播放音頻 |
pygame.overlay |
訪問高級視頻疊加 |
pygame.rect |
管理矩形區(qū)域 |
pygame.sndarray |
操作聲音數(shù)據(jù) |
pygame.sprite |
操作移動圖像 |
pygame.surface |
管理圖像和屏幕 |
pygame.surfarray |
管理點陣圖像數(shù)據(jù) |
pygame.time |
管理時間和幀信息 |
pygame.transform |
縮放和移動圖像 |
2. display模塊的常用方法
方法名 |
功能 |
pygame.dispaly.init |
初始化display模塊 |
pygame.dispaly.quit |
結束display模塊 |
pygame.dispaly.get^init |
如果display模塊已經被初始化,則返回True |
pygame.dispaly.setmode |
初始化一個準備顯示的界面 |
pygame.dispaly.get_surface |
獲取當前的Surface對象 |
pygame.dispaly.flip |
更新整個待顯示的Surface對象到屏幕上 |
pygame.dispaly .update |
更新部分內容顯示到屏幕上,如果沒有參數(shù),則與flip功能相同 |
3. Surface對象的常用方法
方法名 |
功能 |
pygame.Surface.blit |
將一個圖像畫到另一個圖像上 |
pygame. Surface.convert |
轉換圖像的像素格式 |
pygame.Surface.convert_alpha |
轉化圖像的像素格式,包含alpha通道的轉換 |
pygame. Surface.f ill |
使用顏色填充Surface |
pygame. Surface.get_rect |
獲取Surface的矩形區(qū)域 |
示例:創(chuàng)建窗口流程,也是大部分創(chuàng)建Pygame的流程
import sys # 導入sys模塊
import pygame # 導入pygame模塊
pygame.init() # 初始化pygame,檢查游戲需要的一些硬件調用接口、系統(tǒng)功能接口是否有問題
size = width, height = 640, 480 # 設置窗口大小
screen = pygame.display.set_mode(size) # 顯示窗口但是執(zhí)行完程序就會關閉窗口
while True:
# 獲取所有的事件,例如點擊窗口的時間、按下鍵盤的事件。由于事件的類型很多,程序不知道發(fā)生了哪一類事件所以需要不斷的循環(huán)判斷
for event in pygame.event.get():
if event.type == pygame.QUIT: # 如果點擊關閉窗口,則退出
pygame.quit() # 退出pygame
sys.exit() #推出系統(tǒng)
Pygame的基本使用? ? ?
實例:制作一個跳躍的小球游戲,如果碰到窗口邊緣會改變小球移動方向
實現(xiàn)步驟:
? ? ? ? 創(chuàng)建窗口→添加小球→移動小球→檢測碰撞? ?
?運行效果:
小球圖片:? ??
?python代碼:
# -*- coding:utf-8 -*-
import sys # 導入sys模塊
import pygame # 導入pygame模塊
pygame.init() # 初始化pygame
size = width, height = 640, 480 # 設置窗口,這是一個數(shù)組
screen = pygame.display.set_mode(size) # 顯示窗口
color = (0, 0, 0) # 設置顏色
ball = pygame.image.load("ball.png") # 加載圖片
ballrect = ball.get_rect() # 根據(jù)圖片大小獲取矩形區(qū)域
speed = [5, 5] # 設置移動的X軸、Y軸距離
clock = pygame.time.Clock() # 創(chuàng)建時鐘對象
# 執(zhí)行死循環(huán),確保窗口一直顯示
while True:
clock.tick(240) # 每秒執(zhí)行60次
# 檢查事件
for event in pygame.event.get():
if event.type == pygame.QUIT: # 如果點擊關閉窗口,則退出
pygame.quit() # 退出pygame
sys.exit()
ballrect = ballrect.move(speed) # 通過再次賦值移動小球
# 碰到左右邊緣
if ballrect.left < 0 or ballrect.right > width:
speed[0] = -speed[0] #如果碰到邊距則反方向移動
# 碰到上下邊緣
if ballrect.top < 0 or ballrect.bottom > height:
speed[1] = -speed[1]
screen.fill(color) # 填充顏色
screen.blit(ball, ballrect) # 此函數(shù)是將圖片推送到窗口上,第一個參數(shù)為圖片第二個參數(shù)為圖片位置
pygame.display.flip() # 更新全部顯示
開發(fā)Flappy Bird游戲
游戲簡介:
當點擊屏幕的時候小鳥就往上飛,再次點擊小鳥再次往上飛,當不點擊時小鳥會以更快速度降落。我們需要控制小鳥
我們需要控制小鳥通過各種各樣的管道,當我們穿過一組管道時就會得一分,如果在飛行過程中碰到了管道那么小鳥狀態(tài)變?yōu)榛疑粼诘厣?,游戲結束并且顯示一個總的分數(shù)
運行效果:
圖片素材
游戲分析?
以面向對象的思維方式來分析一下這個游戲可以歸納為兩個對象
小鳥:
? ? ? ? 屬性:
????????????????小鳥的生命狀態(tài)
? ? ? ? ? ? ? ? ????????活著:顏色為黃色
? ? ? ? ? ? ? ? ????????死亡:顏色為灰色
? ? ? ? ? ? ? ? 坐標位置
? ? ? ? ? ? ? ? ? ? ? ? X軸坐標
? ? ? ? ? ? ? ? ? ? ? ? Y軸坐標(變化)
? ? ? ? ? ? ? ? 是否跳躍
? ? ? ? ? ? ? ? ? ? ? ? 上升高度
? ? ? ? ? ? ? ? ? ? ? ? 墜落高度
? ? ? ? 方法
? ? ? ? ? ? ? ? 跳躍
? ? ? ? ? ? ? ? 墜落
管道:
? ? ? ? 方法:向左移動
碰撞檢測:
? ? ? ? 小鳥碰到上下管道
? ? ? ? 小鳥碰到上下邊界
實現(xiàn)步驟
搭建主框架
創(chuàng)建小鳥類
創(chuàng)建管道類
計算得分文章來源:http://www.zghlxwxcb.cn/news/detail-662106.html
碰撞檢測文章來源地址http://www.zghlxwxcb.cn/news/detail-662106.html
python代碼
import pygame
import sys
import random
class Bird(object):
"""定義一個鳥類"""
def __init__(self):
"""定義初始化方法"""
# 鳥的矩形有四個參數(shù):前兩個是小鳥矩形左上角的坐標點,后兩個是矩形的長寬
self.birdRect = pygame.Rect(65, 50, 50, 50)
# 定義鳥的3種狀態(tài)圖片列表:向上飛、向下墜、死亡
self.birdStatus = [pygame.image.load("assets/1.png"),
pygame.image.load("assets/2.png"),
pygame.image.load("assets/dead.png")]
self.status = 0 # 默認飛行狀態(tài)
self.birdX = 120 # 鳥所在X軸坐標,即是向右飛行的速度
self.birdY = 350 # 鳥所在Y軸坐標,即上下飛行高度
self.jump = False # 默認情況小鳥自動降落
self.jumpSpeed = 10 # 跳躍高度
self.gravity = 5 # 重力
self.dead = False # 默認小鳥生命狀態(tài)為活著
def birdUpdate(self):
if self.jump:
# 小鳥跳躍
self.jumpSpeed -= 1 # 速度遞減,上升越來越慢
self.birdY -= self.jumpSpeed # 鳥Y軸坐標減小,小鳥上升
else:
# 小鳥墜落
self.gravity += 0.2 # 重力遞增,下降越來越快
self.birdY += self.gravity # 鳥Y軸坐標增加,小鳥下降
self.birdRect[1] = self.birdY # 更改Y軸位置
class Pipeline(object):
"""定義一個管道類"""
def __init__(self):
"""定義初始化方法"""
self.wallx = 400; # 管道所在X軸坐標,最右邊位置
self.pineUp = pygame.image.load("assets/top.png") #加載上管道圖片
self.pineDown = pygame.image.load("assets/bottom.png") #加載管道圖片
def updatePipeline(self):
""""管道移動方法"""
self.wallx -= 5 # 管道X軸坐標遞減,即管道向左移動
# 當管道運行到一定位置,即小鳥飛越管道,分數(shù)加1,并且重置管道
if self.wallx < -80: #管道寬度為94,當管道快移除屏幕時重置管道位置
global score #設置得分加1并聲明為全局變量
score += 1
self.wallx = 400
def createMap():
"""定義創(chuàng)建地圖的方法"""
screen.fill((255, 255, 255)) # 填充顏色
screen.blit(background, (0, 0)) # 填入到背景
# 顯示管道
#因為管道長度為495幾乎占滿屏幕了,為了讓管道小一點設置為屏幕外的上下方
screen.blit(Pipeline.pineUp, (Pipeline.wallx, -300)); # 上管道坐標位置
screen.blit(Pipeline.pineDown, (Pipeline.wallx, 500)); # 下管道坐標位置
Pipeline.updatePipeline() # 管道移動
# 顯示小鳥
if Bird.dead: # 撞管道狀態(tài)
Bird.status = 2
elif Bird.jump: # 起飛狀態(tài)
Bird.status = 1
screen.blit(Bird.birdStatus[Bird.status], (Bird.birdX, Bird.birdY)) # 設置小鳥的坐標
Bird.birdUpdate() # 鳥移動
# 顯示分數(shù)
#font.render()用于顯示字體有三個參數(shù):字符串、是否平滑、顏色
screen.blit(font.render(str(score), -1, (255, 255, 255)), (200, 50)) # 設置顏色及坐標位置
pygame.display.update() # 更新顯示
def checkDead():
# 上方管子的矩形位置
upRect = pygame.Rect(Pipeline.wallx, -300,
Pipeline.pineUp.get_width() - 10,
Pipeline.pineUp.get_height())
# 下方管子的矩形位置
downRect = pygame.Rect(Pipeline.wallx, 500,
Pipeline.pineDown.get_width() - 10,
Pipeline.pineDown.get_height())
# 檢測小鳥與上下方管子是否碰撞
if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect):
Bird.dead = True
# 檢測小鳥是否飛出上下邊界
if not 0 < Bird.birdRect[1] < height:
Bird.dead = True
return True
else:
return False
def getResutl():
final_text1 = "Game Over"
final_text2 = "Your final score is: " + str(score)
ft1_font = pygame.font.SysFont("Arial", 70) # 設置第一行文字字體
ft1_surf = font.render(final_text1, 1, (242, 3, 36)) # 設置第一行文字顏色
ft2_font = pygame.font.SysFont("Arial", 50) # 設置第二行文字字體
ft2_surf = font.render(final_text2, 1, (253, 177, 6)) # 設置第二行文字顏色
screen.blit(ft1_surf, [screen.get_width() / 2 - ft1_surf.get_width() / 2, 100]) # 設置第一行文字顯示位置
screen.blit(ft2_surf, [screen.get_width() / 2 - ft2_surf.get_width() / 2, 200]) # 設置第二行文字顯示位置
pygame.display.flip() # 更新整個待顯示的Surface對象到屏幕上
if __name__ == '__main__':
"""主程序"""
pygame.init() # 初始化pygame
pygame.font.init() # 初始化字體
font = pygame.font.SysFont("Arial", 50) # 設置字體和大小
size = width, height = 400, 680 # 設置窗口
screen = pygame.display.set_mode(size) # 顯示窗口
clock = pygame.time.Clock() # 設置時鐘
Pipeline = Pipeline() # 實例化管道類
Bird = Bird() # 實例化鳥類
score = 0
while True:
clock.tick(60) # 每秒執(zhí)行60次
# 輪詢事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 如果觸發(fā)鍵盤和鼠標事件并且小鳥狀態(tài)不是死亡則Bird.jump值為True并且初始化跳躍跟墜落速度
if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead:
Bird.jump = True # 跳躍
Bird.gravity = 5 # 重力
Bird.jumpSpeed = 10 # 跳躍速度
background = pygame.image.load("assets/background.png") # 加載背景圖片
if checkDead(): # 檢測小鳥生命狀態(tài)
getResutl() # 如果小鳥死亡,顯示游戲總分數(shù)
else:
createMap() # 創(chuàng)建地圖
到了這里,關于15. python從入門到精通——Pygame游戲編程的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!