缩放 Pygame 显示表面上的所有内容

yon*_*ead 1 python rendering pygame python-3.x

所以我正在 pygame 中制作一个 2D 像素艺术游戏,正如您所假设的,我所有的精灵纹理看起来都非常小。我想知道是否有一种方法可以在我的游戏中全局缩放所有内容,而不必单独缩放每个精灵或弄乱坐标。每个精灵都会在一个网格上移动:一个单位是 16x16 像素,例如,当我的玩家精灵移动时,它只会向 16 像素的方向移动。

这是我的主要脚本:

import sys
from pygame.locals import *
import pygame

from game.sprites import Ghost

pygame.init()

WINDOW_WIDTH = 640
WINDOW_HEIGHT = 640
DES_WIDTH = 64
DES_HEIGHT = 64

COL_BG = (46, 48, 55)
COL_FG = (235, 229, 206)

X = 1000
Y = 1000

win = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption("Through The Doors")

running = True
paused = False

# INITIALIZE SPRITES
player = Ghost()

all_sprites = pygame.sprite.Group()
all_sprites.add(player)

clock = pygame.time.Clock()

while running:
    clock.tick(30)

    if not paused:
        win.fill(COL_BG)
        all_sprites.update()
        all_sprites.draw(win)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    keys = pygame.key.get_pressed()

    if keys[pygame.K_RIGHT]:
        player.go_right()
    elif keys[pygame.K_LEFT]:
        player.go_left()
    elif keys[pygame.K_UP]:
        player.go_up()
    elif keys[pygame.K_DOWN]:
        player.go_down()

    pygame.display.flip()

pygame.quit()

Run Code Online (Sandbox Code Playgroud)

我确实有更多的精灵要加载,但我想先解决缩放问题。

Rab*_*d76 5

我想知道是否有一种方法可以在我的游戏中全局扩展所有内容,而不必单独扩展每个精灵 [...]”

不,没有办法。您必须单独缩放每个坐标、每个尺寸和每个表面。PyGame 用于以像素为单位的图像(表面)和形状。无论如何,放大图像将导致模糊、模糊或锯齿状(Minecraft)外观。

有没有办法我可以制作一个单独的表面,然后将它放在基础窗口表面的顶部,然后缩放它?

是的当然。

创建要在 ( )上绘制的Surfacewin。使用pygame.transform.scale()pygame.transform.smoothscale()将其缩放到窗口大小和blit实际显示Surface ( display_win):

display_win = pygame.display.set_mode((WINDOW_WIDTH*2, WINDOW_HEIGHT*2))
win = pygame.Surface((WINDOW_WIDTH, WINDOW_HEIGHT))

while running:
    # [...]

    if not paused:
        win.fill(COL_BG)
        all_sprites.update()
        all_sprites.draw(win)

    # [...]

    scaled_win = pygame.transform.smoothscale(win, display_win.get_size())
    # or scaled_win = pygame.transform.scale(win, display_win.get_size())
    display_win.blit(scaled_win, (0, 0))
    pygame.display.flip()
Run Code Online (Sandbox Code Playgroud)

最小的例子: repl.it/@Rabbid76/PyGame-UpScaleDisplay