等距瓦片图不对齐

1 投票
1 回答
37 浏览
提问于 2025-04-12 20:50

我正在制作一个等距的Minecraft克隆游戏,代码运行得很好。我使用了一个四舍五入的函数来调整玩家的位置,这样方块就能对齐到一个网格上。每个方块的图片大小正好是32x32像素,而且图片里的内容都是对称的。

目前,我把四舍五入的函数设置为在X轴上为16像素,在Y轴上为8像素。问题出在Y轴上,因为这样会导致一些方块重叠,如果你不按照正确的顺序放置它们的话。我不知道该怎么解决这个问题,因为我已经尝试过调整四舍五入的函数。希望能得到一些帮助。以下是代码:

import pygame

pygame.init()
win = pygame.display.set_mode((480,320))
pygame.display.set_caption(("Mini Minecraft"))
block = pygame.image.load("Stone.png")
pygame.display.set_icon(block)
background = pygame.image.load("Background.png")
running = True

positions = []

def roundToMultiple(n, m):
    return round(n / m) * m

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            pygame.quit()
            
        if event.type == pygame.MOUSEBUTTONDOWN:
            placeX, placeY = event.pos  
            placeXRound = roundToMultiple(placeX, 16)
            placeYRound = roundToMultiple(placeY, 8)
            positions.append((placeXRound, placeYRound))

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                positions = []

    mouseX, mouseY = pygame.mouse.get_pos()
    
    mouseXRound = roundToMultiple(mouseX, 16)
    mouseYRound = roundToMultiple(mouseY, 8)

    if mouseXRound > 448:
        mouseXRound = 448
    if mouseYRound > 288:
        mouseYRound = 288

    win.blit(background, (0,0))
    for pos in positions:
        win.blit(block, pos)
    win.blit(block, (mouseXRound, mouseYRound))
    pygame.display.update()

1 个回答

1

你只需要把点的列表排序。根据x坐标进行排序,同时把y坐标反向排序(也就是说,y坐标越大的排在前面,越小的排在后面)。可以用这段代码来实现:positions.sort(key=lambda p: (p[0], -p[1]))

if event.type == pygame.MOUSEBUTTONDOWN:
    placeX, placeY = event.pos  
    placeXRound = roundToMultiple(placeX, 16)
    placeYRound = roundToMultiple(placeY, 8)
    positions.append((placeXRound, placeYRound))
    positions.sort(key=lambda p: (p[0], -p[1]))

撰写回答