Python第三方库pygame的使用详解
什么是pygame
pygame是一款Python第三方库,它是专为Python语言编写的多媒体库,用于开发2D游戏和多媒体应用程序,它提供了丰富的API,让开发者可以很轻松地创建各种复杂的游戏和多媒体应用。
安装pygame
在Windows系统下,可以使用以下命令安装pygame:
pip install pygame
在Mac OS X下,可以使用以下命令安装pygame:
brew install sdl sdl_image sdl_mixer sdl_ttf portmidi
pip install pygame
常用API介绍
pygame.display
pygame.display
模块用于创建游戏窗口,并对窗口进行各种操作,例如设置窗口标题、设置窗口大小、切换全屏等。
创建游戏窗口
通过 pygame.display.set_mode()
函数创建游戏窗口,参数是一个元组,表示游戏窗口的大小,例如 (800, 600)
代表宽度为800,高度为600的游戏窗口。
import pygame
pygame.init()
# 创建游戏窗口
screen = pygame.display.set_mode((800, 600))
# 游戏主循环
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
设置窗口标题
通过 pygame.display.set_caption()
函数设置游戏窗口标题。
import pygame
pygame.init()
# 创建游戏窗口
screen = pygame.display.set_mode((800, 600))
# 设置游戏窗口标题
pygame.display.set_caption("My Game")
# 游戏主循环
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
切换全屏
通过 pygame.display.toggle_fullscreen()
函数切换全屏,参数是一个元组,表示游戏窗口的大小,例如 (800, 600)
代表宽度为800,高度为600的游戏窗口。
import pygame
pygame.init()
# 创建游戏窗口
screen = pygame.display.set_mode((800, 600))
# 游戏主循环
while True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN and event.key == pygame.K_F11:
# 切换全屏
pygame.display.toggle_fullscreen((800, 600))
pygame.Surface
pygame.Surface
类代表了游戏窗口中的一个矩形区域,可以对其中的像素点进行操作。
创建Surface对象
通过 pygame.Surface()
函数创建一个空的Surface对象,参数是一个元组,表示Surface对象的大小,例如 (800, 600)
表示Surface对象的宽度为800,高度为600。
import pygame
pygame.init()
# 创建游戏窗口
screen = pygame.display.set_mode((800, 600))
# 创建Surface对象
surface = pygame.Surface((800, 600))
# 游戏主循环
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
绘制矩形
通过 pygame.draw.rect()
函数在Surface对象上绘制矩形,参数是一个元组,表示矩形的左上角坐标和矩形的宽度和高度,例如 (100, 100, 50, 50)
表示矩形的左上角坐标是 (100, 100),宽度是50,高度是50。
import pygame
pygame.init()
# 创建游戏窗口
screen = pygame.display.set_mode((800, 600))
# 创建Surface对象
surface = pygame.Surface((800, 600))
# 绘制矩形
pygame.draw.rect(surface, (255, 0, 0), (100, 100, 50, 50))
# 游戏主循环
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
# 在游戏窗口中绘制Surface对象
screen.blit(surface, (0, 0))
# 更新游戏窗口
pygame.display.update()
pygame.event
pygame.event
模块用于处理事件,例如键盘输入、鼠标操作等。
获取事件
通过 pygame.event.get()
函数获取当前游戏窗口中的所有事件,返回一个列表,列表中的每一个元素代表一个事件,可以通过事件的 type
属性获取事件类型,例如 pygame.QUIT
表示关闭窗口事件。
import pygame
pygame.init()
# 创建游戏窗口
screen = pygame.display.set_mode((800, 600))
# 游戏主循环
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
键盘输入事件
通过 pygame.KEYDOWN
事件获取键盘按键事件,可以通过 event.key
属性获取按键对应的常量,例如 pygame.K_LEFT
表示左箭头键。
import pygame
pygame.init()
# 创建游戏窗口
screen = pygame.display.set_mode((800, 600))
# 游戏主循环
while True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
print("按下了上箭头键")
elif event.key == pygame.K_DOWN:
print("按下了下箭头键")
elif event.key == pygame.K_LEFT:
print("按下了左箭头键")
elif event.key == pygame.K_RIGHT:
print("按下了右箭头键")
elif event.key == pygame.K_SPACE:
print("按下了空格键")
elif event.type == pygame.QUIT:
pygame.quit()
exit()
示例
示例1:Pong游戏
import pygame
# 初始化pygame
pygame.init()
# 创建游戏窗口
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Pong游戏")
# 创建Surface对象
surface = pygame.Surface((800, 600))
# 创建球的初始位置
ball_x = 400
ball_y = 300
ball_speed_x = 5
ball_speed_y = 5
# 创建球拍的初始位置
left_paddle_y = 250
right_paddle_y = 250
# 游戏主循环
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_w:
left_paddle_y -= 10
elif event.key == pygame.K_s:
left_paddle_y += 10
elif event.key == pygame.K_UP:
right_paddle_y -= 10
elif event.key == pygame.K_DOWN:
right_paddle_y += 10
# 绘制球
pygame.draw.circle(surface, (255, 255, 255), (ball_x, ball_y), 10)
# 碰壁检测和反弹
if ball_y <= 0 or ball_y >= 600:
ball_speed_y = -ball_speed_y
pygame.mixer.Sound("bounce.wav").play()
# 球拍碰撞检测
if ball_x <= 30 and abs(ball_y - left_paddle_y) <= 50:
ball_speed_x = -ball_speed_x
pygame.mixer.Sound("bounce.wav").play()
elif ball_x >= 770 and abs(ball_y - right_paddle_y) <= 50:
ball_speed_x = -ball_speed_x
pygame.mixer.Sound("bounce.wav").play()
# 移动球
ball_x += ball_speed_x
ball_y += ball_speed_y
# 绘制球拍
left_paddle_rect = pygame.Rect(10, left_paddle_y - 50, 10, 100)
pygame.draw.rect(surface, (255, 255, 255), left_paddle_rect)
right_paddle_rect = pygame.Rect(780, right_paddle_y - 50, 10, 100)
pygame.draw.rect(surface, (255, 255, 255), right_paddle_rect)
# 在游戏窗口中绘制Surface对象
screen.blit(surface, (0, 0))
# 更新游戏窗口
pygame.display.update()
示例2:飞机大战
import pygame
import random
# 初始化pygame
pygame.init()
# 创建游戏窗口
screen = pygame.display.set_mode((480, 800))
pygame.display.set_caption("飞机大战")
# 创建Surface对象
surface = pygame.Surface((480, 800))
# 创建背景图
background = pygame.image.load("background.png")
# 创建玩家飞机
player_plane = pygame.image.load("player.png")
player_x = 240
player_y = 640
# 创建敌机
enemy_plane = pygame.image.load("enemy.png")
enemies = []
for i in range(5):
enemy = {"x": random.randint(0, 430), "y": random.randint(-200, -100)}
enemies.append(enemy)
# 创建子弹
bullet = pygame.image.load("bullet.png")
bullets = []
# 创建分数
score = 0
# 加载音效
pygame.mixer.music.load("music.mp3")
pygame.mixer.music.set_volume(0.3)
pygame.mixer.music.play(-1)
shoot_sound = pygame.mixer.Sound("shoot.wav")
shoot_sound.set_volume(0.1)
hit_sound = pygame.mixer.Sound("hit.wav")
hit_sound.set_volume(0.1)
# 游戏主循环
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
player_x -= 10
elif event.key == pygame.K_RIGHT:
player_x += 10
elif event.key == pygame.K_SPACE:
bullet_x = player_x + 49
bullet_y = player_y - 20
bullet_rect = pygame.Rect(bullet_x, bullet_y, 10, 20)
bullets.append(bullet_rect)
shoot_sound.play()
# 绘制背景
surface.blit(background, (0, 0))
# 绘制玩家飞机
surface.blit(player_plane, (player_x, player_y))
# 移动敌机和检测是否撞到玩家飞机
for enemy in enemies:
enemy["y"] += 5
enemy_rect = pygame.Rect(enemy["x"], enemy["y"], 55, 45)
surface.blit(enemy_plane, (enemy["x"], enemy["y"]))
if enemy_rect.colliderect(pygame.Rect(player_x, player_y, 100, 124)):
hit_sound.play()
pygame.time.delay(1000)
pygame.quit()
exit()
# 移动子弹和检测是否撞到敌机
for bullet_rect in bullets:
bullet_rect.y -= 10
surface.blit(bullet, bullet_rect)
for enemy in enemies:
enemy_rect = pygame.Rect(enemy["x"], enemy["y"], 55, 45)
if bullet_rect.colliderect(enemy_rect):
hit_sound.play()
bullets.remove(bullet_rect)
enemies.remove(enemy)
score += 1
# 绘制分数
font = pygame.font.Font(None, 36)
text = font.render("Score: {}".format(score), True, (255, 255, 255))
surface.blit(text, (10, 10))
# 添加敌机
if len(enemies) < 5:
enemy = {"x": random.randint(0, 430), "y": -50}
enemies.append(enemy)
# 在游戏窗口中绘制Surface对象
screen.blit(surface, (0, 0))
# 更新游戏窗口
pygame.display.update()
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python第三方库pygame的使用详解 - Python技术站