安装安 Pygame
如果该文件的扩展名为.whl,就将它复制到你的项目文件夹中。再打开一个命令窗口,切换到该文件所在的文件夹,并使用pip来运行它
python -m pip install --user pygame-1.9.2a0-cp35-none-win32.whl
编译错误原因如下:
由于我python 3.8 所以下载要
开始游戏项目
import sys
import pygame
def run_game():
pygame.init()
screen = pygame.display.set_mode((1200,800))
pygame.display.set_caption("Alien Invasion")
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pygame.display.flip()
run_game()
- 导入了模块sys 和pygame
- pygame.init() 初始化背景设置,让Pygame能够正确地工作
- 用pygame.display.set_mode() 来创建一个名为screen 的显示窗口
- 创建了一个宽1200像素、高800像素的游戏
- screen 是一个surface,surface是屏幕的一部分,用于显示游戏元素
- 为访问Pygame检测到的事件,我们使用方法pygame.event.get()
- 在这个循环中,我们将编写一系列的if 语句来检测并响应 特定的事件。例如,玩家单击游戏窗口的关闭按钮时,将检测到pygame.QUIT 事件,而我们调用sys.exit() 来退出游戏
- pygame.display.flip() ,命令Pygame让最近绘制的屏幕可见。在这里,它在每次执行while 循环时都绘制一个空屏幕,并擦去旧屏幕,使得只有新屏幕可 见。
- 最后一行调用run_game() ,这将初始化游戏并开始主循环。
创建设置类&&设置背景色screen.fill()
settings.py
class Settings():
"""存储《外星人入侵》的所有设置的类"""
def __init__(self):
"""初始化游戏的设置"""
# 屏幕设置
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230,230,230)
alien.py
import sys
import pygame
from settings import Settings
def run_game():
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
# 让最近绘制的屏幕可见
pygame.display.flip()
run_game()
添加飞船图像
最安全、最不费钱的方式是使用http://pixabay.com/ 等网站提供的图形,但使用**位图(.bmp)**文件最为简单。
- 加载图像,我们调用 了pygame.image.load()
- 加载图像后,我们使用get_rect() 获取相应surface的属性rect,矩形(rect 对象)
- 要将游戏元素居中,可设置相应rect 对象的属性center 、centerx 或centery
- 在Pygame中,原点(0, 0)位于屏幕左上角
- 右下角的坐标为(1200, 800)。
为此,首先将表示屏幕的矩形存储在self.screen_rect 中(见❸),再将self.rect.centerx (飞船中心的x 坐标)设置为表示屏幕 的矩形的属性centerx (见❹),并将self.rect.bottom (飞船下边缘的y 坐标)设置为表示屏幕的矩形的属性bottom 。Pygame将使用这些rect 属性来放置飞船图像, 使其与屏幕下边缘对齐并水平居中。 在❺处,我们定义了方法blitme() ,它根据self.rect 指定的位置将图像绘制到屏幕上。
ship.py
import pygame
class Ship():
def __init__(self, screen): #screen 屏
"""初始化飞船并设置其初始位置"""
self.screen = screen
# 加载飞船图像并获取其外接矩形
self.image = pygame.image.load('images/ship/ship.png')
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)
settings.py
class Settings():
"""存储《外星人入侵》的所有设置的类"""
def __init__(self):
"""初始化游戏的设置"""
# 屏幕设置
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230,230,230)
main.py
import sys
import pygame
from settings import Settings
from ship import Ship
def run_game():
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
ship = Ship(screen)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
ship.blitme()
# 让最近绘制的屏幕可见
pygame.display.flip()
run_game()
运行的函数game_functions()
import sys
import pygame
def check_events():
"""响应按键和鼠标事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
def update_screen(ai_settings, screen, ship):
"""更新屏幕上的图像,并切换到新屏幕"""
# 每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
ship.blitme()
# 让最近绘制的屏幕可见
pygame.display.flip()
驾驶飞船不断向右移动
本质的核心的是数据结构进行修改、然后不断加载变化。
game_func.py
import sys
import pygame
def check_events(ship):
"""响应按键和鼠标事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT:
ship.moving_right = False
def update_screen(ai_settings, screen, ship):
"""更新屏幕上的图像,并切换到新屏幕"""
# 每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
ship.blitme()
# 让最近绘制的屏幕可见
pygame.display.flip()
settings.py
class Settings():
"""存储《外星人入侵》的所有设置的类"""
def __init__(self):
"""初始化游戏的设置"""
# 屏幕设置
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230,230,230)
ship.py
import pygame
class Ship():
def __init__(self, screen): #screen 屏
"""初始化飞船并设置其初始位置"""
self.screen = screen
# 加载飞船图像并获取其外接矩形
self.image = pygame.image.load('images/ship/ship.png')
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
self.moving_right = False
def update(self):
if self.moving_right:
self.rect.centerx += 1
def blitme(self):
"""在指定位置绘制飞船"""
self.screen.blit(self.image, self.rect)
在键盘上按 →键如图所示
左右移动
修改部分如下
game_func.py
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
修改部分如下
ship.py
def update(self):
if self.moving_right:
self.rect.centerx += 1
elif self.moving_left:
self.rect.centerx -= 1
玩家可能同时按住左右箭头键
我们就将moving_left 设置为True ;如果因玩家松开K_LEFT 而触发了KEYUP 事件,我们就将moving_left 设置 为False 。这里之所以可以使用elif 代码块,
ship.py
def update(self):
if self.moving_right:
self.rect.centerx += 1
elif self.moving_left:
self.rect.centerx -= 1
限制飞船的活动范围
当前,如果玩家按住箭头键的时间足够长,飞船将移到屏幕外面,消失得无影无踪
按住crtl 点击center ,我们找到相关定义 ,将最右边参数找到。right
修改部分如下
ship.py
def update(self):
if self.moving_right and self.rect.centerx < self.screen_rect.right:
self.rect.centerx += 1
elif self.moving_left and self.rect.centerx > 0:
self.rect.centerx -= 1
我们这边左边的值设最小是0,右边的设置为小于right值
重构重 check_events()
"""响应按键和鼠标事件"""
def check_keydown_events(event, ship):
"""响应按键"""
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
def check_keyup_events(event, ship):
"""响应松开"""
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
def check_events(ship):
"""响应按键和鼠标事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event, ship)
elif event.type == pygame.KEYUP:
check_keyup_events(event, ship)
射击
在这里插入代码片
设置背景色
在这里插入代码片
设置背景色
在这里插入代码片
设置背景色
在这里插入代码片
设置背景色
在这里插入代码片
设置背景色
在这里插入代码片