目前,我的下一个项目将是一个平台游戏,当我浏览stackoverflow来研究几种机制时,我看到很多人都在做同样的事情:他们用一些变量保存一个布局,然后在某个地方去卸载它它只是在游戏中呈现。我很感兴趣,所以我看得更远,我没有发现如何加载/卸载这样的状态,或者我可能只是没有正确地搜索我的搜索。
无论哪种方式,我该怎么做?
例如:我将级别布局保存为数组或单个多行字符串,然后以某种方式为每个字母生成一个tile sprite,如T。
import pygame
# Storage method A
level = '''
X X X X X
X X X X X
T T X X X
X X X T T
T T T T T
'''
# Storage Method B
level2 = [
'XXXXX',
'XXXXX',
'TTXXX',
'XXXTT',
'TTTTT'
]
# X is blank space, T is tiles
# Then what? Thats what I need to know.
# If someone already answered this and I'm just not using the right keywords let me know.
答案 0 :(得分:2)
您需要计算每个图块的像素位置。要绘制任何图块,您需要知道
1:找到画布的大小应该是微不足道的。
2:对于第二种存储方法,你可以做到
height = len(level2)
width = len(level2[0]) #Assuming all rows are of equal length and there's at least one row
3:我们将遍历行和字符,这些行和字符将跟踪我们在侧面网格中的位置。
def draw_tiles(canvas_width, canvas_height, width, height, level2):
for row in range(height):
for column in range(width):
if list(level2[row])[column] == 'T':
pixel_x = int(canvas_width/width)*column
pixel_y = int(canvas_height/height)*row
draw_tile(pixel_x, pixel_y)
现在您需要做的就是定义draw_tile(x,y)函数,在画布上绘制一个平铺,其左上角位于像素坐标(x,y)上。我确定pygame有一些东西。
确保设置网格宽度/高度,以便canvas_width / width和canvas_height / height都是整数。否则,由于四舍五入,您的瓷砖会略微偏移。
答案 1 :(得分:1)
您可以迭代布局中的枚举行和字符,创建切片实例并将它们添加到精灵组。
在示例中,我将瓷砖添加到不同的颜色,具体取决于布局中的字符(X =蓝色,T =绿色),然后再添加到组中,但您也可以创建完全不同的Tile
类型或者子类,如果角色是' T'或者是' X'。
import pygame
class Tile(pygame.sprite.Sprite):
def __init__(self, pos, color):
super().__init__()
self.image = pygame.Surface((50, 50))
self.image.fill(color)
self.rect = self.image.get_rect(topleft=pos)
def create_tile_group(layout):
"""Turn the layout into a sprite group with Tile instances."""
group = pygame.sprite.Group()
for y, row in enumerate(layout):
for x, tile in enumerate(row):
if tile == 'T':
color = (50, 150, 50)
else:
color = (0, 0, 200)
group.add(Tile((x*tile_size, y*tile_size), color))
return group
pygame.init()
screen = pygame.display.set_mode((250, 250))
clock = pygame.time.Clock()
layout1 = [
'XXXXX',
'XTXXX',
'XXXXT',
'XXXXX',
'TTTTT',
]
tile_size = 50
tile_group = create_tile_group(layout1)
loop = True
while loop:
for event in pygame.event.get():
if event.type == pygame.QUIT:
loop = False
tile_group.update()
screen.fill((30, 30, 30))
tile_group.draw(screen)
pygame.display.flip()
clock.tick(30)
如果你因为太多的小表面而出现性能问题,你可以在while循环开始之前将它们blit到一个大的背景表面上,然后在每一帧时只对blit进行一次blit。
答案 2 :(得分:0)
这里没有魔法:"它只是在游戏中呈现"不准确。渲染调用背后还有更多软件,一个定义tile精灵的模块,逐个字符地扫描关卡,并相应地放置精灵。开发人员(例如您)决定级别表示,精灵形式,精灵位置等。
您需要编写几个代码。好消息是你决定格式;你只需要在编写这些模块时保持一致。