You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

等距Tilemap对齐异常求助:我的世界克隆版方块重叠问题

解决等距视角方块重叠问题

你的问题出在直接对鼠标X/Y坐标分别取整的方式,没有考虑等距网格中X与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

# 存储网格行列坐标,而非屏幕坐标
grid_positions = []

def screen_to_grid(sx, sy):
    """将屏幕坐标转换为等距网格的行列索引"""
    col = (sx / 16 + sy / 8) / 2
    row = (sy / 8 - sx / 16) / 2
    return round(col), round(row)

def grid_to_screen(col, row):
    """将网格行列索引转换为屏幕坐标,并限制在窗口范围内"""
    sx = (col - row) * 16
    sy = (col + row) * 8
    # 确保方块不会超出窗口(方块尺寸32x32)
    sx = max(0, min(sx, 480 - 32))
    sy = max(0, min(sy, 320 - 32))
    return sx, sy

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  
            # 转换为网格行列
            col, row = screen_to_grid(placeX, placeY)
            # 避免重复添加同一位置的方块
            if (col, row) not in grid_positions:
                grid_positions.append((col, row))

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

    mouseX, mouseY = pygame.mouse.get_pos()
    # 鼠标预览的网格转换
    col, row = screen_to_grid(mouseX, mouseY)
    mouseXRound, mouseYRound = grid_to_screen(col, row)

    win.blit(background, (0,0))
    # 遍历网格坐标,转换为屏幕坐标后绘制
    for grid_pos in grid_positions:
        sx, sy = grid_to_screen(*grid_pos)
        win.blit(block, (sx, sy))
    win.blit(block, (mouseXRound, mouseYRound))
    pygame.display.update()

关键改动说明

  1. 坐标转换逻辑:
    • screen_to_grid:通过等距网格的数学关系,将鼠标屏幕坐标转为网格行列,确保每个鼠标位置对应唯一的网格单元。
    • grid_to_screen:根据网格行列计算正确的屏幕坐标,保证每个网格单元对应唯一的方块位置。
  2. 去重机制:存储网格行列而非屏幕坐标,添加前检查是否已存在,从根源避免同一位置重复放置方块。
  3. 边界限制:在转换屏幕坐标时直接限制范围,替代原来单独的if判断,逻辑更简洁。

内容的提问来源于stack exchange,提问作者user19519697

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 07:20:13