【问题标题】:Draw a staggered isometric map with python用python绘制交错等距图
【发布时间】:2021-03-10 15:51:35
【问题描述】:

我在尝试使用 pygame 创建交错等距游戏地图时遇到了一些问题。

到目前为止,我可以画一个矩形,但我不知道如何旋转它。

代码如下:

from pygame.locals import *
import pygame

green = (40,255,30)
brown = (40,60,90)

grass = 0
dirt = 1

colours = {
    grass: green,
    dirt: brown,
    }

tilemap = [
        [grass,dirt,dirt,dirt, grass],
        [dirt,grass,dirt,dirt, dirt],
        [grass, grass,dirt,dirt, grass],
        [grass, grass,dirt,dirt, grass],
        [dirt,dirt,dirt,dirt,grass]

        ]

TILESIZE = 50
MAPWIDTH =  5
MAPHEIGHT = 5

pygame.init()
DISPLAYMAP = pygame.display.set_mode((MAPWIDTH*TILESIZE,MAPHEIGHT*TILESIZE))

while True:

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()

        DISPLAYMAP.fill((0, 0, 0))
        for row in range(MAPWIDTH):
            print
            for column in range(MAPHEIGHT):
                color = colours[tilemap[row][column]]
                pygame.draw.rect(DISPLAYMAP, color, (column * TILESIZE, row * TILESIZE, TILESIZE, TILESIZE))

    pygame.display.update()

结果如下:

我想要这样的东西:

任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: python pygame staggered-gridview


    【解决方案1】:

    使用pygame.transform.rotate()pygame.transform.scale() 为每种瓷砖创建一个等距的pygame.Surface 对象:

    isometric_tiles = {}
    for key, color in colours.items():
        tile_surf = pygame.Surface((TILESIZE, TILESIZE), pygame.SRCALPHA)
        tile_surf.fill(color)
        tile_surf = pygame.transform.rotate(tile_surf, 45)
        isometric_size = tile_surf.get_width()
        tile_surf = pygame.transform.scale(tile_surf, (isometric_size, isometric_size//2))
        isometric_tiles[key] = tile_surf
    

    blit 瓷砖而不是绘制矩形:

    for column in range(MAPWIDTH):
        for row in range(MAPHEIGHT):
            tile_surf = isometric_tiles[tilemap[row][column]]
            x = (column + (MAPHEIGHT - row)) * isometric_size // 2
            y = 20 + (column + row) * isometric_size // 4 
            DISPLAYMAP.blit(tile_surf, (x, y))
    

    完整示例:

    from pygame.locals import *
    import pygame
    
    green = (40,255,30)
    brown = (40,60,90)
    
    grass = 0
    dirt = 1
    
    colours = {
        grass: green,
        dirt: brown,
        }
    
    tilemap = [
            [grass,dirt,dirt,dirt, grass],
            [dirt,grass,dirt,dirt, dirt],
            [grass, grass,dirt,dirt, grass],
            [grass, grass,dirt,dirt, grass],
            [dirt,dirt,dirt,dirt,grass]
    ]
    
    TILESIZE = 50
    MAPWIDTH =  5
    MAPHEIGHT = 5
    
    isometric_tiles = {}
    
    for key, color in colours.items():
        tile_surf = pygame.Surface((TILESIZE, TILESIZE), pygame.SRCALPHA)
        tile_surf.fill(color)
        tile_surf = pygame.transform.rotate(tile_surf, 45)
        isometric_size = tile_surf.get_width()
        tile_surf = pygame.transform.scale(tile_surf, (isometric_size, isometric_size//2))
        isometric_tiles[key] = tile_surf
    
    pygame.init()
    DISPLAYMAP = pygame.display.set_mode((MAPWIDTH*TILESIZE*2,MAPHEIGHT*TILESIZE))
    
    while True:
    
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
    
            DISPLAYMAP.fill((0, 0, 0))
    
            for column in range(MAPWIDTH):
                for row in range(MAPHEIGHT):
                    tile_surf = isometric_tiles[tilemap[row][column]]
                    x = (column + (MAPHEIGHT - row)) * isometric_size // 2
                    y = 20 + (column + row) * isometric_size // 4 
                    DISPLAYMAP.blit(tile_surf, (x, y))
            
        pygame.display.update()
    

    对于交错表示,您必须更改图块的排列:

    while True:
    
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
    
            DISPLAYMAP.fill((0, 0, 0))
    
            for column in range(MAPWIDTH):
                for row in range(MAPHEIGHT):
                    tile_surf = isometric_tiles[tilemap[row][column]]
                    x = 20 + column * isometric_size + (row % 2) * isometric_size // 2
                    y = 20 + row * isometric_size // 4 
                    DISPLAYMAP.blit(tile_surf, (x, y))
            
        pygame.display.update()
    

    【讨论】:

    • 感谢您的帮助。你现在知道了吗,我怎样才能从你的钻石形状变成交错形状?所以我可以有一个矩形地图但旋转瓷砖?再次感谢您
    • @NicolasPeille 交错形状只是更大地图的 sn-p。我认为您完全误解了等轴测视图的概念。瓷砖的排列没有改变,只是它们的视图发生了变化。
    • @NicolasPeille 我已经扩展了答案。
    • 谢谢你!是的,你是对的,我想我需要阅读更多关于等距视图概念的内容。根本不清楚。还是谢谢你!
    • @NicolasPeille 请阅读What should I do when someone answers my question? 并考虑accept the answer,您认为对您最有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    相关资源
    最近更新 更多