Pygame飞机大战(一)——创建游戏窗体并让飞机动起来

pygame是我们用python进行游戏开发常用的一个库,可以很方便对媒体文件(图片、音频等)和事件(鼠标、键盘、关闭等)进行处理,基本可以满足我们对简单游戏开发设计的需求;

首先我们要安装pygame库:

pip install pygame

后面的讲解,只涉及需要用到的方法和属性进行讲解,未尽之处详见官网

接下来我们来分析一下,一个游戏由哪几部分组成:

  1. 游戏的人物图片
  2. 分数、血量等数据显示
  3. 游戏的音频效果
  4. 后台数据的存储

前面两个的话,都是在窗体上面显示的;音频文件的播放,可以不用创建窗体,直接播放;后台数据的读写,这个涉及到数据库或者文件的读写(在数据量小的情况下,用csv进行存储也未尝不可)

好的,接下来,我们就来创建一个窗体,作为人机交互的一个界面:

import pygame                    # 我们要使用pygame模块,肯定需要先导入 
from pygame.locals import *      # 在locals中存放了我们常用的一些常量,比如下面的QUIT,
                                 # 如果不导入的话,就需要这么写了:pygame.locals.QUIT
import sys    # 系统相关库,包含程序运行环境的变量和相关控制方法

pygame.init()    # 这一步非常重要,我们要使用pygame,就需要先把pygame初始化

screen_size = width,height = 480,700    # 窗体的尺寸
bg = (0,255,0)    # 背景颜色,这个用到了(r,g,b)的设置方式

screen = pygame.display.set_mode(screen_size)    # 设置窗体大小
pygame.display.set_caption('我是窗体')            # 设置窗体标题

while True:    # 死循环,让程序一直执行下去
    for event in pygame.event.get():    # 获取事件
        if event.type == QUIT:          # 如果事件的类型是退出
            pygame.quit()               # 我们需要先将pygame退出
            sys.exit()                  # 然后将系统关闭
    screen.fill(bg)            # 填充背景颜色
    pygame.display.flip()      # 刷新屏幕

现在窗体我们已经有了,接下来就应该把游戏的主角加载进来了,并且我们尝试让他动起来:
在开始写代码之前,我们先来思考一下,程序是如何将图片加载进来的,是如何让图片在窗体上移动的?

  1. 显示图像首先要说道一个分辨率的问题,当我们电脑分辨率越高的时候,发现在屏幕上显示的图标就越小,相反就越大;这是因为,我们本身的屏幕就这么大,分辨率越高,相当于分的份数就越多,每一行显示的像素点也就越多,那么显示的内容也就越多了;图片就是由一个一个像素点组成的,当我们把一张照片拉的很大的时候,发现会有锯齿产生,所以一张照片的像素越高,所包含的信息量就会越多,也就越清晰了。说回来,我们显示图片,其实就是将图片对应位置的像素点绘制到屏幕上面,当我们要修改图片的位置,其实就是修改像素点显示的位置。
  2. 那么是怎么实现图片的移动的呢?
    首先肯定需要知道图片下一次出现的位置在哪里
    其次将它绘制到窗体上
    还有最后一步,我们要刷新窗体,这是我们必须完成的一步,不然你发现并没有效果
import pygame
from pygame.locals import *
import sys

pygame.init()
screen_size = width,height = 480,700

bg = (0,255,0)
speed = [1,1]    # 这个列表就是飞机移动的方向和速度,即每次横坐标和纵坐标都+1

screen = pygame.display.set_mode(screen_size)
pygame.display.set_caption('飞机大战')
heroPlane = pygame.image.load('./images/me1.png')    # 将飞机的图片加载进来
position = heroPlane.get_rect()                      # 返回rect对象,这里面包含了图片信息和移动图片等方法

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    position = position.move(speed)    # 用move(x,y)方法移动图片,参数就是x轴和y轴的移动距离
    if position.left < 0 or position.right > width:    # left、right分别是图片最左边和最右边的坐标
        speed[0] = -speed[0]
    if position.top < 0 or position.bottom > height:   # top、bottom分别是顶坐标和底坐标
        speed[1] = -speed[1]
    screen.fill(bg)    # 填充背景颜色
    screen.blit(heroPlane,position)    # 用blit()方法将素材绘制到窗体上
    pygame.display.flip()    #刷新窗体

我们不能让飞机自己在窗体里面乱跑,得让用户去控制它,那么就需要通过检测按键事件,对角色进行控制了,接下来我们来讲一个什么是时间,也我们在游戏设计的时候,最常用到的两种事件:

  1. 简单的来讲,事件就是我们在游戏过程中需要处理的事情,比如按键按下了就要对按键按下这件事进行相应的操作,鼠标按下了又需要做什么,这是我们在游戏交互中必须处理的事情;
  2. 我们在游戏过程中最常使用到的就是鼠标和键盘了,当然有的游戏还支持用手柄操作,当然我们也能够实现,但是我们这里只是用鼠标和键盘,先来看一下鼠标和键盘事件产生分别会产生什么信息:

import pygame
from pygame.locals import *
import sys

pygame.init()
screen_size = width,height = 480,700

bg = (0,255,0)
speed = [0,0]

screen = pygame.display.set_mode(screen_size)
pygame.display.set_caption('飞机大战')
heroPlane = pygame.image.load('./images/me1.png')
position = heroPlane.get_rect()

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:        # 检测是否是按键按下的事件
            if event.key == K_LEFT:      # 判断是哪个按键按下了,这里对应方向键
                speed = [-1,0]           # 修改运动方向
            elif event.key == K_RIGHT:
                speed = [1,0]
            elif event.key == K_UP:
                speed = [0,-1]
            elif event.key == K_DOWN:
                speed = [0,1]
        else:
            speed = [0,0]    # 如果没有按键按下就为0,不动
    if position.left < 0:            # 检测是否超出了边界
        position.left = 0
    elif position.right > width:
        position.right = width
    elif position.top < 0:
        position.top = 0
    elif position.bottom > height:
        position.bottom = height
    position = position.move(speed)    # 移动角色图片
    screen.fill(bg)
    screen.blit(heroPlane,position)
    pygame.display.flip()

  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值