有没有办法在 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)
这是一个简短的问题,我只是想知道我可以有一个无限宽度的 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)