初始准备工作
本项目使用的python3版本(如果你用python2,我不知会怎么样)
Ide推荐大家选择pycharm(不同ide应该没影响)
需要安装第三方库pygame,
pygame安装方法(windows电脑,mac系统本人实测与pygame不兼容,强行运行本项目卡成ppt)
电脑打开cmd命令窗口,输入
pip3 install pygame
补充说明:
由于众所周知的原因,安装过程中下载可能十分缓慢,甚至由此导致安装失败
此时建议大家尝试使用镜像下载
使用办法 pip install xxxx -i jinxiangurl
具体到pygame,则是:pip install pygame -i https://pypi.tuna.tsinghua.edu.cn/simple
一、实现基础窗口
0 - 新建app.py文件,内容如下
import pygame
WINWIDTH = 600 # 窗口宽度
WINHEIGHT = 900 # 窗口高度
pygame.init() # pygame初始化,必须有,且必须在开头
# 创建主窗体
win=pygame.display.set_mode((WINWIDTH,WINHEIGHT))
此时运行app.py,会发现一个一闪而逝的窗口
1 - 进一步,我们自然而然的就要思考这些问题
怎么维持住这个窗口?
通过while循环去实现
但是简单的循环只是单纯的将界面卡住,怎么实现刷新?
在循环体内使用pygame.display.update()语句进行界面的更新
循环的刷新频率不做节制的话,界面会飞速刷新导致卡死,怎么办?
pygame有专门的对象pygame.time.Clock用于去控制循环刷新的频率,创建pygame.time.Clock对象后,调用该对象的tick()方法,函数参数为每秒刷新次数,就可以设置循环每秒刷新频率,术语叫做帧率
根据上面的思路,修改app.py后如下
import pygame
FPS=60 # 游戏帧率
WINWIDTH = 600 # 窗口宽度
WINHEIGHT = 900 # 窗口高度
pygame.init() # pygame初始化,必须有,且必须在开头
# 创建主窗体
clock=pygame.time.Clock() # 用于控制循环刷新频率的对象
win=pygame.display.set_mode((WINWIDTH,WINHEIGHT))
while True:
clock.tick(FPS) # 控制循环刷新频率,每秒刷新FPS对应的值的次数
pygame.display.update()
此时运行app.py,就可以得到一个最最最基础的窗口了,
2- 优化
最后,还有一个比较重要的问题,此时窗口的关闭按钮很容易出bug(卡死)
一般需要程序去重新实现这个窗口关闭功能,需要在循环体内添加如下代码
# 获取所有事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 判断当前事件是否为点击右上角退出键
pygame.quit()
sys.exit() # 需要提前 import sys
本阶段最后app.py如下
import pygame
import sys
FPS=60 # 游戏帧率
WINWIDTH = 600 # 窗口宽度
WINHEIGHT = 900 # 窗口高度
pygame.init() # pygame初始化,必须有,且必须在开头
# 创建主窗体
clock=pygame.time.Clock() # 用于控制循环刷新频率的对象
win=pygame.display.set_mode((WINWIDTH,WINHEIGHT))
while True:
# 获取所有事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 判断当前事件是否为点击右上角退出键
pygame.quit()
sys.exit()
clock.tick(FPS) # 控制循环刷新频率,每秒刷新FPS对应的值的次数
pygame.display.update()
到这里,基础窗口就完成了~
二、玩家飞机实现
本节主要实现一个基本的,可以键盘控制方向移动的玩家飞机
0 - 分析与初步实现
创建玩家飞机需要知道哪些?
1、父控件(在该控件上绘制飞机)
2、飞机坐标(x,y)
3、飞机的图像(图像文件地址)
玩家飞机需要实现哪些方法?
1、移动到指定坐标
2、绘制玩家飞机
基于上述分析,新建plane.py文件,内容如下
import pygame
PLANEIMG="img/huaplane.png"
class Plane():
def __init__(self,master,x,y,img_path):
self._master=master # 父控件
self.image=pygame.image.load(img_path) # 飞机图像
# 飞机位置-坐标
self.x=x
self.y=y
# 移动飞机到指定位置
def move(self,x,y):
self.x+=x
self.y+=y
# 绘制飞机
def draw(self):
self._master.blit(self.image,(self.x,self.y))
在surface对象上绘制图像方法:
在surface对象(a)上位置为(x,y)的地方绘制另一个surfae对象(img)
a.blit(img,(x,y))
1 - 界面绘制飞机
要在界面上展示飞机,十分简单,只需在app.py中添加三行代码
# 在开头添加
from plane import Plane
# 在创建完窗体win实例之后添加(开始循环之前)
plane=Plane(win,200,600)
# 在循环体中添加(在clock.tick(FPS)语句之前)
plane.draw()
但是此时界面上展示的只是一个静态的飞机图像,无法键盘运动,需要添加通过键盘控制飞机移动功能
修改app.py循环体部分代码如下
while True:
# 获取所有事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 判断当前事件是否为点击右上角退出键