等距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()
关键改动说明
- 坐标转换逻辑:
screen_to_grid:通过等距网格的数学关系,将鼠标屏幕坐标转为网格行列,确保每个鼠标位置对应唯一的网格单元。grid_to_screen:根据网格行列计算正确的屏幕坐标,保证每个网格单元对应唯一的方块位置。
- 去重机制:存储网格行列而非屏幕坐标,添加前检查是否已存在,从根源避免同一位置重复放置方块。
- 边界限制:在转换屏幕坐标时直接限制范围,替代原来单独的if判断,逻辑更简洁。
内容的提问来源于stack exchange,提问作者user19519697
相关产品推荐
相关产品推荐

