有没有办法在 pygame 中沿宽度或高度具有无限的表面尺寸?

Is there a way to have an infinite surface size along the width or the height in pygame?

这是一个简短的问题,我只是想知道我可以有一个无限宽度的 pygame.surface()

简单回答

pygame不可能有无限大的曲面。

复杂答案

这是不可能的,因为 pygame 中的表面正在存储其中每个像素的数据。 实际上,你不可能拥有无限大的物体,它们只是理论上是无限的,但有一个可行的替代方案。 不要做无限大的surface,让它可以扩展。

示例实现

这是我想到的最简单的一个。

def resize_surface(surf, size):
    ret = pygame.Surface(size)
    ret.blit(surf)
    return ret

但这是一个糟糕的解决方案 - 它会产生额外的不必要的像素,并且您不能有负数位置。

你可以做的是将整个 space 分成块,其中每个块都是包含表面和坐标的东西。曲面必须大小相同。

示例代码:

import pygame


class Space:
    chunck_size = (30, 30)
    
    def __init__(self):
        self.map = {}
    
    def set_at(self, x, y, color):
        cx, cy, rx, ry = self.get_real_pos(x, y)
        
        if (cx, cy) not in self.map:
            self.map[cx, cy] = self._generate_surface()
        
        self.map[cx, cy].set_at((rx, ry), color)
    
    def get_at(self, x, y):
        cx, cy, rx, ry = self.get_real_pos(x, y)
        
        if (cx, cy) not in self.map:
            self.map[cx, cy] = self._generate_surface()
        
        return self.map[cx, cy].get_at((rx, ry))
        
    def get_real_pos(self, x, y):
        chunck_x = (x - x % self.chunck_size[0]) // self.chunck_size[0]
        relative_x = x - chunck_x * self.chunck_size[0]
        
        chunck_y = (y - y % self.chunck_size[1]) // self.chunck_size[1]
        relative_y = y - chunck_y * self.chunck_size[1]
        
        return chunck_x, chunck_y, relative_x, relative_y
    
    def _generate_surface(self):
        return pygame.Surface(self.chunck_size)

结果:

>>> s = Space()
>>> s.set_at(100, 100, (255, 100, 0))
>>> s.get_at(100, 100)
(255, 100, 0, 255)
>>> s.set_at(-100, 0, (100, 0, 0))
>>> s.get_at(-100, 0)
(100, 0, 0, 255)
>>> s.get_at(-1000, -1000)
(0, 0, 0, 255)