Python游戏系列之三_控制飞机移动

  Python游戏系列之三_控制飞机移动


  之前,我们已经在屏幕上画出飞机来了,接下来的工作,是让飞机动起来。

  通过按下键盘的上下左右箭头,来控制飞机上下左右移动。


  一、技术准备

  1. 事件对象

  pygame中的事件(event)有两个常用属性:

  (1) type属性:表示事件类型,常见的事件类型有:

  pygame.QUIT:退出事件

  pygame.KEYDOWN:键盘按键的按下事件

  pygame.KEYUP:键盘按键的松开事件

  pygame.MOUSEBUTTONDOWN:鼠标按键的按下事件

  pygame.MOUSEBUTTONUP:鼠标按键的松开事件


  (2) key属性:如果是键盘事件,则事件的key属性可以获知按下的是哪个键。

  pygame已经把所有按键都定义成了常量。

  例如,按下的是上箭头,常量是K_UP;下箭头是K_DOWN;左箭头是K_LEFT;右箭头是K_RIGHT。

  参看在线文档的常量说明:http://www.pygame.org/docs/ref/key.html


  另外,键盘事件中,如果长按箭头,只会产生一次键盘事件。

  所以如果想长按箭头,让飞机一直往一个方向移动,应该思考一下怎么写。


  2. 字典

  如果要判断按键事件的键值到底是上、下、左、右中的哪一个,我们可能会想到类似Java语言中的switch...case语法,很遗憾,Python语言不支持这样的语法。

  但是Python语言有字典结构,可以实现我们的想法。

  Python中的字典相当于Java中的哈希表,其中存储的元素为“键-值”对。

  例如:

  创建字典:

dict = {'Alice': '1111', 'Beth': '2222', 'Cecil': '3333'}


  向字典中添加元素:

dict['Lily'] = "4444"


  删除字典元素:

del dict['Lily']


  我们的设计思路是利用字典存储上下左右的移动值,每次循环都根据字典内容修改飞机坐标。

  (1) 创建字典

  创建字典时,以键盘事件的键为key,value暂时设为0。

offset = {pygame.K_LEFT: 0, pygame.K_RIGHT: 0, pygame.K_UP: 0, pygame.K_DOWN: 0}


  (2) 根据按键事件,修改字典数据

  如果键盘按下,且是上下左右箭头,则移动值设为3;如果键盘松开,且是上下左右箭头,则移动值设为0。

  这样每次按箭头键,就可以移动飞机了。

       # 处理键盘按下和松开事件
        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


  (3) 修改飞机坐标

    hero_pos = [hero_pos[0] + offset[pygame.K_RIGHT] - offset[pygame.K_LEFT],
                hero_pos[1] + offset[pygame.K_DOWN] - offset[pygame.K_UP]]


  最后,上全部源代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import pygame
from sys import exit

SCREEN_WIDTH = 480  # 屏幕宽度
SCREEN_HEIGHT = 640  # 屏幕高度

# pygame.init()将会初始化所有导入的pygame模块
pygame.init()
# set_mode()函数将会创建一个显示面板(surface),即游戏窗口
# 参数一为surface的分辨率,即窗口的大小
# 参数二为surface的显示模式
# 参数三为surface的位深
screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
# set_caption()函数设置窗口的标题
pygame.display.set_caption('飞机游戏')
# 载入图片
bg = pygame.image.load('bg1.jpg')

ticks = 0  # 一个计数器
shoot_img = pygame.image.load('shoot.png')  # 载入大图
hero_rect1 = pygame.Rect(0, 99, 102, 126)  # 定义矩形1
hero_rect2 = pygame.Rect(165, 360, 102, 126)  # 定义矩形2
hero_img1 = shoot_img.subsurface(hero_rect1)  # 截取子图形1
hero_img2 = shoot_img.subsurface(hero_rect2)  # 截取子图形2
hero_pos = [200, 500]

# 新增代码
# 定义一个字典
offset = {pygame.K_LEFT: 0, pygame.K_RIGHT: 0, pygame.K_UP: 0, pygame.K_DOWN: 0}

clock = pygame.time.Clock()
while True:
    clock.tick(60)

    # 在surface上绘图,参数一是图像,参数二是左上角的位置
    screen.blit(bg, [0, 0])

    # 绘制飞机
    if ticks % 50 < 25:
        screen.blit(hero_img1, hero_pos)
    else:
        screen.blit(hero_img2, hero_pos)
    ticks += 1

    # 更新屏幕
    pygame.display.update()

    # pygame.event.get()方法可以从事件队列得到所有事件的列表
    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

    # 新增代码
    # 修改飞机坐标
    hero_pos = [hero_pos[0] + offset[pygame.K_RIGHT] - offset[pygame.K_LEFT],
                hero_pos[1] + offset[pygame.K_DOWN] - offset[pygame.K_UP]]

  这里比较巧妙的是,我们将修改飞机坐标的代码放在事件循环之外,这样,长按键盘时,移动值为3;只要不松开键盘,移动值一直都是3,因此每次循环都会让飞机移动;一旦松开键盘,则移动值归零,停止移动。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值