详解Pygame 使用相机模块

  • Post category:Python

Pygame 相机模块可以帮助我们实现对游戏场景的全局视角控制,可以将场景中的元素绘制到指定的矩形视口中。接下来,我们来详细讲解相机模块的作用和使用方法。

简介

在 Pygame 中,相机是一个矩形对象,它定义了一个视窗,只有在视窗内的对象才会被渲染。通过控制相机,我们可以实现屏幕的滚动、缩放和旋转等效果。相机模块的核心是 pygame.Rect 类,它定义了一个矩形区域。

使用方法

创建相机

使用相机模块前,需要先创建一个相机对象。可以通过 pygame.Rect 类来实现相机的创建,例如:

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
camera = pygame.Rect(0, 0, 320, 240)

以上代码创建了一个相机,它的宽度为 320,高度为 240,位置为 (0, 0)

移动相机

通过修改相机的位置,可以实现对屏幕的滚动效果。例如,我们可以使用 pygame.mouse.get_rel() 函数来获取鼠标相对位移,并将其应用到相机上:

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
camera = pygame.Rect(0, 0, 320, 240)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
    # 获取鼠标位移
    mouse_movement = pygame.mouse.get_rel()
    # 应用鼠标位移到相机上
    camera.move_ip(mouse_movement)
    # 绘制场景
    pygame.draw.rect(screen, (255, 0, 0), (0, 0, 640, 480), 0)
    pygame.draw.rect(screen, (0, 255, 0), camera, 0)
    pygame.display.update()

以上代码会让相机跟随鼠标移动。

缩放相机

修改相机的宽度和高度,可以实现对屏幕的缩放效果。例如,我们可以使用 pygame.key.get_pressed() 函数来检测键盘输入,然后调整相机的宽度和高度:

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
camera = pygame.Rect(0, 0, 320, 240)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
    # 检测键盘输入
    keys = pygame.key.get_pressed()
    if keys[pygame.K_UP]:
        camera.height -= 10
    if keys[pygame.K_DOWN]:
        camera.height += 10
    if keys[pygame.K_LEFT]:
        camera.width -= 10
    if keys[pygame.K_RIGHT]:
        camera.width += 10
    # 绘制场景
    pygame.draw.rect(screen, (255, 0, 0), (0, 0, 640, 480), 0)
    pygame.draw.rect(screen, (0, 255, 0), camera, 0)
    pygame.display.update()

以上代码会让通过按上下左右键来缩放相机。

示例说明

这里提供两个示例,让大家更好地理解相机模块的使用方法。

示例 1:捕鱼游戏

在一个捕鱼游戏中,玩家要控制一个枪口来射击鱼,鱼会随机出现在屏幕中的不同位置。为了让玩家能够看到整个游戏场景,需要使用相机模块。

代码如下:

import pygame
import random

pygame.init()
screen = pygame.display.set_mode((640, 480))
camera = pygame.Rect(0, 0, 640, 480)

fishes = []
for i in range(10):
    x = random.randint(0, 640)
    y = random.randint(0, 480)
    fishes.append(pygame.Rect(x, y, 32, 32))

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

    # 绘制场景
    pygame.draw.rect(screen, (255, 255, 255), (0, 0, 640, 480), 0)
    for fish in fishes:
        pygame.draw.rect(screen, (0, 255, 0), fish, 0)

    # 将场景绘制到相机上
    cameraw = min(camera.width, screen.get_width())
    camerah = min(camera.height, screen.get_height())
    sub_screen = screen.subsurface(camera)
    pygame.transform.scale(sub_screen, (cameraw, camerah), screen)
    pygame.display.update()

    # 控制相机
    keys = pygame.key.get_pressed()
    if keys[pygame.K_UP]:
        camera.move_ip(0, -10)
    if keys[pygame.K_DOWN]:
        camera.move_ip(0, 10)
    if keys[pygame.K_LEFT]:
        camera.move_ip(-10, 0)
    if keys[pygame.K_RIGHT]:
        camera.move_ip(10, 0)

以上代码会让屏幕滚动,以便玩家可以看到整个游戏场景。

示例 2:星球大战

在一个星球大战游戏中,玩家需要控制飞船,击落飞来的敌机并躲避敌机的攻击。为了让玩家能够看到整个游戏场景,需要使用相机模块。

代码如下:

import pygame
import random

pygame.init()
screen = pygame.display.set_mode((640, 480))
camera = pygame.Rect(0, 0, 640, 480)

# 创建背景星星
stars = []
for i in range(100):
    x = random.randint(0, 640)
    y = random.randint(0, 480)
    stars.append(pygame.Rect(x, y, 2, 2))

# 创建玩家飞船
player = pygame.Rect(320, 240, 32, 32)

# 创建敌机
enemies = []
for i in range(10):
    x = random.randint(0, 640)
    y = random.randint(0, 480)
    enemies.append(pygame.Rect(x, y, 32, 32))

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

    # 更新玩家飞船的位置
    mouse_x, mouse_y = pygame.mouse.get_pos()
    player.move_ip(mouse_x - player.centerx, mouse_y - player.centery)

    # 绘制场景
    pygame.draw.rect(screen, (0, 0, 0), camera, 0)
    for star in stars:
        pygame.draw.rect(screen, (255, 255, 255), star, 0)
    for enemy in enemies:
        pygame.draw.rect(screen, (255, 0, 0), enemy, 0)
    pygame.draw.rect(screen, (0, 0, 255), player, 0)

    # 将场景绘制到相机上
    cameraw = min(camera.width, screen.get_width())
    camerah = min(camera.height, screen.get_height())
    sub_screen = screen.subsurface(camera)
    pygame.transform.scale(sub_screen, (cameraw, camerah), screen)
    pygame.display.update()

    # 控制相机
    camera.center = player.center

以上代码会让屏幕跟随飞船移动,并保持飞船在屏幕中央。