xiaokunzhang的博客

学习交流,共同进步

游戏背景的绘制

    创建了一个窗体,接下来就是朝这个窗体里添加东西。只有先绘制了游戏背景,才能进行后续的游戏图像遮挡、图形图像的显示等等操作。

    类似于我们玩过的《超级玛丽》《魂斗罗》《雷电》之类的游戏,这种类型的 2D 游戏,其背景不是左右卷轴,就是上下卷轴。所谓左右卷轴,就是游戏画面是横向的、左右运动的,而上下卷轴就是游戏画面是竖直对的、上下运动的


这里写图片描述

    如《雷电》这样的经典飞机游戏,就是属于上下卷轴的。上下卷轴的飞机游戏有一个特点,就是它是在空中,从凌驾于飞机之上的视角,往地面俯瞰的。因为是俯视角,所以可以很方便地看到游戏的整体地图,包括地面上的敌人、空中的敌人等等,层次感会很强。

    如果要做的打飞机这种,上下卷轴的游戏。将需要的图片添加进去了。

    使用 Pygame,先读取一个图片,让该图片成为游戏背景并载入进去。

    需要先载入 Pygame 模块,并且定义一个变量 background。将一幅名为Xiaokun,jpg 的图片文件赋值给 backgroud 变量。

import pygame
background = 'lake.jpg'

    把 Pygame 的所有组件都初始化。调用 display 类里的 set_mode 函数来对屏幕进行一个初始化。

pygame.init()
screen = pygame.display.set_mode((640, 480), 0, 32)
pygame.display.set_caption("xiaokun game")

    这里一共有三个参数,第一个参数是分辨率,比如这里编写的是 640x480 的分辨率;第二个参数是flag,flag 的参数如下表个表所示;第三个参数是32,32 代表的是颜色深度,这里是 32 位的意思。


这里写图片描述

    在设置完了窗体模式之后,后面的一段代码就是设置窗体的抬头文字,这里显示的是 xioakun game。

    随后,要载入背景图片。

bg = pygame.image.load(background).convert()

    载入 backgroud 图片。由于pygame.image.load 这个函数返回的是一个 surface,而.convert 函数是来自于 surface 对象。

surface_temp = pygame.image.load(background)
bg = surface_temp.convert()

    bg 这个变量也是一个 surface,而 convert 函数的作用是改变一副图片的像素格式。convert 有四个相同名字的重载函数。convert 没有任何参数,则表示直接返回一个 surface 对象。

    设置完了背景 bg 的 surface,开始写一个大循环,并且在循环里面进行检测鼠标事件是不是退出操作,这是最基本的一项检测。

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()

    从 event 里取出事件列表,然后把每一个 event 的类型进行对比,如果发现有 QUIT 事件(鼠标点击 X 关闭按钮后),就直接退出游戏。完成这一步之后,就可以开始使用 blit 函数进行绘制屏幕的操作。

screen.blit(bg, (0,0))

    使用 blit 将 bg 在以游戏屏幕 x,y 轴为(0,0)的坐标位置在 screen 对象上绘制背景图像。需要 update 刷新屏幕,添加下面这行代码。

pygame.display.update()

    upadate 这个函数是 pygame.display.flip 函数的优化版。因为 pygame,display.flip 是更新整块屏幕,所以如果加载的资源多,效率并不是很高,而 update 如果传递一个矩形值得参数的话,它会只更新这块矩形的内容,所以效率会比较高,但是不传递参数的话,默认还是会更新整块屏幕,但是这个函数不能用在 set_mode 的时候设置为 OpenGL 的模式下。

    需要写一个循环,可以将背景移动起来。

y_move = 0
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
    screen.blit(bg, (0,y_move))
    y_move-=1

    在大循环开始之前,定义了一个 y 值移动的变量,每循环一次,blit 就绘制一次屏幕,y 值都会被减去 1,所以每次看到的图片,都会不停往上移动。

    在 update 代码之后填入下面的代码。

screen.fill([0,0,0])

    fill 操作拥有三个参数,其中第一个参数是填充颜色;第二个参数是填充某一块区域(如果不填入第二个参数,就会填充整个屏幕);第三个参数是blit 操作的特殊参数。

    屏幕操作过程如下:

  • 检测退出事件;
  • 在屏幕上绘制 bg 对象,坐标初始为(0, y);
  • 坐标的 y 减 1;
  • 更新屏幕;
  • 填充屏幕区域为黑色。
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭