《Python 飞机大战》(四)地图滚动

飞机大战中,通过巧妙的地图滚动机制,玩家能够更加深刻地感受到飞机飞行的真实效果。这种不断变化的地图背景在游戏中犹如一幅壮丽的风景画,为飞机飞行提供了生动而多样化的舞台。

1. 地图滚动思路

首先: 准备一张图片,确保该图片的上下部分能够无缝衔接,并创建两个相同的图片对象;
接着:将下方的图片放置在窗口的起始位置(0位置),使其充满整个屏幕,将上方的图片放置在负窗口高度位置,即屏幕上方不可见的位置;
然后:以相同的速度,两张图片沿着Y轴向下移动;
最后:当下方图片的Y轴位置达到窗口的最大高度时,将其重新定位到0位置;当上方图片的Y轴位置达到0位置时,将其重新定位到负窗口高度位置;

循环执行这个过程,即可实现地图的滚动效果。

2. 地图滚动实现

理解基本实现思路,我们来实现相应的代码。创建 GameMap.py 文件,并在该文件中编写如下代码:

import random

import pygame
from Config import *


class GameMap:

    # 初始化地图
    def __init__(self, scene):

        # 地图编号
        map_index = MAP_INDEX if MAP_INDEX >= 1 and MAP_INDEX <= 5 else random.randint(1, 5)
        map_filename = f'source/map/map-{map_index}.jpg'

        # 加载相同图片资源,做交替实现地图滚动
        self.image1 = pygame.image.load(map_filename)
        self.image2 = self.image1.copy()

        # 地图滚动速度
        self.scroll_speed = 3

        # 保存场景对象
        self.main_scene = scene

        # 初始化两张图片初始化位置
        self.y1 = 0
        self.y2 = -SCENE_H

    # 计算地图图片绘制坐标
    def calc_position(self):
        self.y1 = 0 if self.y1 >= SCENE_H else self.y1 + self.scroll_speed
        self.y2 = -SCENE_H if self.y2 >=0 else self.y2 + self.scroll_speed


    # 绘制地图的两张图片
    def draw_element(self):
        self.main_scene.blit(self.image1, (0, self.y1))
        self.main_scene.blit(self.image2, (0, self.y2))

Config.py 配置文件内容如下:

# 游戏窗口宽高
SCENE_W, SCENE_H = 512, 768
# 游戏地图
MAP_INDEX = 5

3. 加入到游戏场景中

打开 MainScene.py 文件,修改 MainScene.py 类如下:

import pygame
from Config import *
from GameMap import GameMap


# 主场景
class MainScene(object):

    # 初始化主场景
    def __init__(self):
        # 初始化模块
        pygame.init()
        # 初始化时钟
        self.clock = pygame.time.Clock()
        # 初始化游戏窗口
        self.scene = pygame.display.set_mode((SCENE_W, SCENE_H))
        # 设置窗口标题
        pygame.display.set_caption("飞机大战-v1.0 作者: 孟宝亮")
        # 初始化游戏元素
        self.init_elements()


    # 初始化游戏元素
    def init_elements(self):
        # 初始化游戏地图
        self.map = GameMap(self.scene)

    # 计算坐标
    def calc_position(self):
        self.map.calc_position()

    # 绘制元素
    def draw_elements(self):
        self.map.draw_element()

    # 处理事件
    def handle_events(self):
        pygame.event.get()

    # 碰撞检测
    def detect_conlision(self):
        pass

    # 主循环
    def run(self):
        while True:
            # 碰撞检测
            self.detect_conlision()
            # 计算元素坐标
            self.calc_position()
            # 绘制元素图片
            self.draw_elements()
            # 处理事件
            self.handle_events()
            # 刷新显示
            pygame.display.update()
            # 控制帧率
            self.clock.tick(60)

未经允许不得转载:一亩三分地 » 《Python 飞机大战》(四)地图滚动
评论 (0)

7 + 6 =