新手自学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上,下一轮刷新将移动到新的地方。
这时,我们会发现飞机上下左右移动会超过屏幕显示,因为我们对移动没有限制。修改最后三行代码如下:
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表示飞机的宽度和高度。