作为新手自学Python的第十九天,技术低微,希望可以通过这种方式督促自己学习。
个人学习环境:python3.9,PyCharm 2021.3.2 (Community Edition)
利用python完成飞机大战是一个非常经典的练手项目,本次完成我方飞机的实现。
在昨天的基础上,我们今天完成生成我方飞机并实现控制移动。
# 导入pygame库
import pygame
# 导入pygame库中的一些常量
from pygame.locals import *
# 导入sys库中的exit函数
from sys import exit
def run_game():
# 定义窗口的分辨率
SCREEN_WIDTH = 480
SCREEN_HEIGHT = 640
ticks = 0
# dict 字典
offset = {pygame.K_LEFT: 0, pygame.K_RIGHT: 0, pygame.K_UP: 0, pygame.K_DOWN: 0}
# 初始化游戏
pygame.init() # 初始化 pygame
screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT]) # 初始化窗口
pygame.display.set_caption('飞机大战') # 设置窗口标题
# 载入背景图
background = pygame.image.load('./image/background.png')
# 载入飞机图片
hero1 = pygame.image.load('./image/me1.png')
hero2 = pygame.image.load('./image/me2.png')
# 展示飞机的位置
hero_pos = [200, 500]
# 事件循环(main loop)
while True:
# 绘制背景
screen.blit(background,(0, 0))
# 绘制飞机
if ticks % 50 < 25:
screen.blit(hero1, hero_pos)
else:
screen.blit(hero2, hero_pos)
ticks += 1
# 更新屏幕
pygame.display.update()
# 处理游戏退出
# 从消息队列中循环取
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
# 控制方向
if event.type == pygame.KEYDOWN:
if event.key in offset:
offset[event.key] = 3
elif event.type == pygame.KEYUP:
if event.key in offset:
offset[event.key] = 0
offset_x = offset[pygame.K_RIGHT] - offset[pygame.K_LEFT]
offset_y = offset[pygame.K_DOWN] - offset[pygame.K_UP]
hero_pos = [hero_pos[0] + offset_x, hero_pos[1] + offset_y]
run_game()
注意:
ticks变量是用来计算次数的,在消息循环中,循环一次就自动累加一次,可以理解为每一个周期就是1 tick,我们可以利用周期数分隔开,达到不同的显示效果。我们读入了两张不同的玩家飞机图片,利用周期数实现每50个周期中,前25个周期显示hero1,后25个周期显示hero2,达到飞机动态显示的效果。
利用hero_pos达到键盘控制飞机的效果。当event.type为按键事件时,再判断event.key是否属于上、下、左、右四个键位中的一个,在其相对应的方向上有一个偏移量,即完成判断的过程;方向键松开的时候该方向上的偏移量为0;最后将偏移量加到飞机的pos上,下一轮刷新时就会移动到新地方。
此时我们会发现,飞机上下左右的移动会超出屏幕显示,这是因为我们没有给移动加上限制。修改最后3行代码如下:
hero_x = hero_pos[0] + offset[pygame.K_RIGHT] - offset[pygame.K_LEFT]
hero_y = hero_pos[1] + offset[pygame.K_DOWN] - offset[pygame.K_UP]
if hero_x < 0:
hero_pos[0] = 0
elif hero_x > SCREEN_WIDTH - 102:
hero_pos[0] = SCREEN_WIDTH - 102
else:
hero_pos[0] = hero_x
if y < 0:
hero_pos[1] = 0
elif hero_y > SCREEN_HEIGHT - 126:
hero_pos[1] = SCREEN_HEIGHT - 126
else:
hero_pos[1] = hero_y
这段代码的主要作用就是判断边界,避免飞机飞出窗体。
当x小于0时,程序使hero_pos[0]只能等于0,这样飞机就不能从左边“飞出去”;当x太大时,程序也只能使hero_pos[0]刚刚到达屏幕边缘,不能从右边“飞出去”。飞机的上下控制类似。
程序中的102、126表示飞机的宽度和高度。