Pygame外星人入侵小游戏超详细开发流程
介绍
本文将提供超详细的 Pygame 外星人入侵小游戏开发流程,为想要学习 Pygame 或者开发小游戏的开发者提供帮助。
准备
在开始之前,您需要安装 Pygame,可以通过 pip 进行安装:
pip install pygame
创建窗口
首先,我们需要创建游戏窗口。需要导入 Pygame 和 sys 模块,并设置窗口大小、标题、背景颜色等。
import pygame
import sys
# 初始化 Pygame
pygame.init()
# 设置窗口大小
size = (800, 600)
screen = pygame.display.set_mode(size)
# 设置标题
pygame.display.set_caption('Alien Invasion')
# 设置背景颜色
bg_color = (230, 230, 230)
游戏循环
接下来,我们需要编写游戏循环。在游戏循环中,我们需要监听玩家的输入、更新游戏状态、绘制游戏界面等。
while True:
# 监听事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 退出游戏
sys.exit()
# 设置背景颜色
screen.fill(bg_color)
# 绘制界面
pygame.display.flip()
创建玩家飞船
接下来,我们需要创建玩家飞船。飞船应该位于窗口底部中央,并能左右移动。
class Ship:
def __init__(self, screen):
"""初始化飞船并设置其初始位置"""
self.screen = screen
# 加载飞船图像并获取其外接矩形
self.image = pygame.image.load('images/ship.bmp')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
# 将每艘新飞船放在屏幕底部中央
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
def blitme(self):
"""在指定位置绘制飞船"""
self.screen.blit(self.image, self.rect)
ship = Ship(screen)
移动玩家飞船
接下来,我们需要让玩家飞船能够左右移动。我们需要监听玩家按下左/右箭头键的事件,并移动飞船。
while True:
# 监听事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 退出游戏
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
# 向左移动飞船
ship.rect.centerx -= 10
elif event.key == pygame.K_RIGHT:
# 向右移动飞船
ship.rect.centerx += 10
# 设置背景颜色
screen.fill(bg_color)
# 绘制玩家飞船
ship.blitme()
# 绘制界面
pygame.display.flip()
创建外星人
接下来,我们需要创建外星人。外星人应该位于窗口顶部,并能从左到右移动。
class Alien:
def __init__(self, screen):
"""初始化外星人并设置其初始位置"""
self.screen = screen
# 加载外星人图像并获取其外接矩形
self.image = pygame.image.load('images/alien.bmp')
self.rect = self.image.get_rect()
# 将每个新外星人放在屏幕顶部中央
self.rect.centerx = screen.get_rect().centerx
self.rect.top = 0
def blitme(self):
"""在指定位置绘制外星人"""
self.screen.blit(self.image, self.rect)
alien = Alien(screen)
移动外星人
接下来,我们需要让外星人能够从左到右移动,并在碰到屏幕边缘后下移一行。
class Alien:
def __init__(self, screen):
"""初始化外星人并设置其初始位置"""
self.screen = screen
# 加载外星人图像并获取其外接矩形
self.image = pygame.image.load('images/alien.bmp')
self.rect = self.image.get_rect()
# 将每个新外星人放在屏幕顶部中央
self.rect.centerx = screen.get_rect().centerx
self.rect.top = 0
# 外星人的移动速度
self.speed_factor = 1
def update(self):
"""向右移动外星人"""
self.rect.centerx += self.speed_factor
def check_edges(self):
"""如果外星人位于屏幕边缘,就返回 True"""
if self.rect.right >= self.screen.get_rect().right:
return True
elif self.rect.left <= 0:
return True
while True:
# 监听事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 退出游戏
sys.exit()
# 移动外星人
alien.update()
# 如果外星人位于屏幕边缘,就下移一行
if alien.check_edges():
alien.rect.top += alien.rect.height
# 设置背景颜色
screen.fill(bg_color)
# 绘制玩家飞船
ship.blitme()
# 绘制外星人
alien.blitme()
# 绘制界面
pygame.display.flip()
发射子弹
接下来,我们需要添加子弹功能,让玩家能够发射子弹。
class Bullet:
def __init__(self, screen, ship):
"""在飞船所处的位置创建一个子弹对象"""
self.screen = screen
# 在 (0, 0) 处创建一个表示子弹的矩形,再设置正确的位置
self.rect = pygame.Rect(0, 0, 3, 15)
self.rect.centerx = ship.rect.centerx
self.rect.top = ship.rect.top
# 存储用小数表示的子弹位置
self.y = float(self.rect.y)
# 子弹的颜色和速度
self.color = (60, 60, 60)
self.speed_factor = 10
def update(self):
"""向上移动子弹"""
self.y -= self.speed_factor
self.rect.y = self.y
def draw_bullet(self):
"""在屏幕上绘制子弹"""
pygame.draw.rect(self.screen, self.color, self.rect)
bullets = []
while True:
# 监听事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 退出游戏
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
# 创建一个新子弹并将其加入到 bullets 中
new_bullet = Bullet(screen, ship)
bullets.append(new_bullet)
# 移动所有子弹
for bullet in bullets:
bullet.update()
# 设置背景颜色
screen.fill(bg_color)
# 绘制玩家飞船
ship.blitme()
# 绘制所有子弹
for bullet in bullets:
bullet.draw_bullet()
# 绘制外星人
alien.blitme()
# 绘制界面
pygame.display.flip()
碰撞检测
接下来,我们需要添加碰撞检测功能,让子弹和外星人碰撞后消失。
while True:
# 监听事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 退出游戏
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
# 创建一个新子弹并将其加入到 bullets 中
new_bullet = Bullet(screen, ship)
bullets.append(new_bullet)
# 移动所有子弹
for bullet in bullets:
bullet.update()
# 检测子弹和外星人的碰撞
collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
# 设置背景颜色
screen.fill(bg_color)
# 绘制玩家飞船
ship.blitme()
# 绘制所有子弹
for bullet in bullets:
bullet.draw_bullet()
# 绘制所有外星人
aliens.draw(screen)
# 绘制界面
pygame.display.flip()
示例说明一
在本示例中,我们添加了多个外星人,可以通过修改 ALIEN_COUNT 的值来控制外星人数量。在游戏循环中,我们遍历所有外星人,并向右移动它们。
ALIEN_COUNT = 10
aliens = pygame.sprite.Group()
for i in range(ALIEN_COUNT):
alien = Alien(screen)
alien.rect.x = alien.rect.width + 2 * alien.rect.width * i
aliens.add(alien)
while True:
# 监听事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 退出游戏
sys.exit()
# 移动所有外星人
aliens.update()
# 如果有外星人位于屏幕边缘,就下移一行
for alien in aliens:
if alien.check_edges():
alien.rect.top += alien.rect.height
# 设置背景颜色
screen.fill(bg_color)
# 绘制玩家飞船
ship.blitme()
# 绘制所有子弹
for bullet in bullets:
bullet.draw_bullet()
# 绘制所有外星人
aliens.draw(screen)
# 绘制界面
pygame.display.flip()
示例说明二
在本示例中,我们添加了玩家生命值功能,让玩家能够承受一定数量的碰撞。在游戏循环中,我们监听子弹和玩家飞船之间的碰撞,以及外星人和玩家飞船之间的碰撞。
class GameStats:
def __init__(self, settings):
"""初始化游戏统计信息"""
self.settings = settings
self.reset_stats()
def reset_stats(self):
"""初始化可在游戏运行期间更改的统计信息"""
self.ships_left = self.settings.ship_limit
class Settings:
def __init__(self):
"""初始化游戏的静态设置"""
self.ship_limit = 3
game_stats = GameStats(Settings())
while True:
# 监听事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 退出游戏
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
# 创建一个新子弹并将其加入到 bullets 中
if len(bullets) < game_stats.ships_left:
new_bullet = Bullet(screen, ship)
bullets.add(new_bullet)
# 移动所有子弹
bullets.update()
# 检测子弹和外星人的碰撞
collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
# 检测外星人和玩家飞船的碰撞
if pygame.sprite.spritecollideany(ship, aliens):
# 玩家飞船被撞
game_stats.ships_left -= 1
if game_stats.ships_left == 0:
# 游戏结束
sys.exit()
# 设置背景颜色
screen.fill(bg_color)
# 绘制玩家飞船
ship.blitme()
# 绘制所有子弹
for bullet in bullets.sprites():
bullet.draw_bullet()
# 绘制所有外星人
aliens.draw(screen)
# 绘制生命值
for i in range(game_stats.ships_left):
ship_rect = ship.image.get_rect()
ship_rect.x = 10 + i * ship_rect.width
ship_rect.y = 10
screen.blit(ship.image, ship_rect)
# 绘制界面
pygame.display.flip()
总结
本文提供了超详细的 Pygame 外星人入侵小游戏开发流程,并提供了两个示例,希望能够帮助想要学习 Pygame 或者开发小游戏的开发者。如果您有任何疑问或意见,请随时在下面评论区留言。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pygame外星人入侵小游戏超详细开发流程 - Python技术站