【问题标题】:Scale Everything On Pygame Display Surface缩放 Pygame 显示表面上的所有内容
【发布时间】:2021-04-19 05:35:30
【问题描述】:

所以我在 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()

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

【问题讨论】:

  • " 我想知道是否有一种方法可以全局扩展我的游戏中的所有内容,而不必单独扩展每个精灵 [...]" - 没有没有办法。您必须单独缩放每个坐标、每个尺寸和每个表面。 PyGame 是为以像素为单位的图像(Surfaces)和形状而设计的。无论如何,放大图像会导致模糊或锯齿状(我的世界)外观。
  • 请从intro tour 重复on topichow to ask。 “告诉我如何解决这个编码问题”不是堆栈溢出问题。我们希望您做出诚实的尝试,然后然后就您的算法或技术提出一个具体的问题。将你的整个程序发布为可能有 20 行的问题......格式不正确。
  • 有没有办法可以制作一个单独的表面并将其放在基础窗口表面的顶部,然后缩放它?如果是,你能告诉我怎么做吗?

标签: python python-3.x pygame rendering


【解决方案1】:

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

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

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

当然可以。

创建一个 Surface 以供绘制 (win)。使用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()

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

【讨论】:

  • 完美运行。它在大约 5 分钟内解决了我的问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 2017-05-24
  • 2022-11-09
  • 2015-11-02
  • 1970-01-01
相关资源
最近更新 更多