微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用python绘制交错等距图

如何解决用python绘制交错等距图

我在尝试使用 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,grass],[dirt,grass,dirt],[grass,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))
        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()

结果如下:

rectangular map

我想要看起来像这样的东西:

Expected output

任何帮助将不胜感激。

谢谢

解决方法

使用 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,grass],[dirt,grass,dirt],[grass,grass]
]

TILESIZE = 50
MAPWIDTH =  5
MAPHEIGHT = 5

isometric_tiles = {}

for key,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))

        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,y))
        
    pygame.display.update()

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

while True:

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

        DISPLAYMAP.fill((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,y))
        
    pygame.display.update()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。