第2章     水管碰撞

2.1    增加水管

现在马里奥走路如入无人之境,我们为了增加游戏的难度,给他设置一个水管障碍物,代码如下所示:

02\01.py

import pygame

 

# 初始化pygame

pygame.init()

 

# 设置窗口大小

WIDTH = 600

HEIGHT = 400

screen = pygame.display.set_mode((WIDTH, HEIGHT))

 

# 设置窗口标题

pygame.display.set_caption('super mario bros')

 

# 避免输入法影响按键

pygame.key.stop_text_input()

 

# 时钟

clock = pygame.time.Clock()

 

# 马里奥位置和大小

x = 10

y = 20

blockWidth = 30

blockHeight = 30

 

# 障碍物大小

blockSize = 30

 

# 主循环

isRunning = True

while isRunning:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            isRunning = False

 

    # 获取按键状态

    keys = pygame.key.get_pressed()

    if keys[pygame.K_LEFT]:

        print("按了左方向键")

        if x > 0:

            x = x - 2

    if keys[pygame.K_RIGHT]:

        print("按了右方向键")

        if x + blockWidth < WIDTH:

            x = x + 2

    if keys[pygame.K_g]:

        print("按了跳跃键")

        if y > 0:

            y = y - 10

 

    # 全屏擦除

    screen.fill((0, 0, 0))

 

    # 地平线

    pygame.draw.line(screen, (255, 255, 255), (0, 300), (WIDTH, 300), 1)  # 画直线

 

    # 障碍物

    pygame.draw.rect(screen, (255, 255, 255), ((400, 300 - blockSize * 2), (blockSize, blockSize * 2)), 0)

 

    # 计算马里奥位置

    y = y + 4

    if y >= 300 - blockHeight:

        y = 300 - blockHeight

 

    # 显示马里奥

    pygame.draw.rect(screen, (255, 255, 255), ((x, y), (blockWidth, blockHeight)), 0)

    pygame.draw.rect(screen, (0, 0, 0), ((x + 5, y + 5), (blockWidth - 10, blockHeight - 10)), 0)

 

    # 刷新显示

    pygame.display.flip()

 

    # 每秒60

    clock.tick(60)

# 退出 Pygame

pygame.quit()

代码只需作出轻微调整,首先,通过变量blockSize定义了一格方块的大小,然后将水管定义为一格宽、两格高,并绘制在地平线上。由于马里奥也是小方块,为了更加清晰地区分,我们将马里奥绘制成空心方块。

运行程序,会发现马里奥可以轻松穿过水管,仿佛水管不存在一般,如2‑1所示。

21 马里奥穿越水管