使用python绘制交错等轴测贴图

2024-06-03 03:34:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我在尝试用pygame创建交错的isomteric游戏地图时遇到了一些问题

到目前为止,我可以画一个矩形的,但我没有关于如何旋转它的线索

代码如下:

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()

结果如下:

rectangular map

我想要一些像这样的东西:

Expected output

任何帮助都将不胜感激

多谢各位


Tags: inimporteventforcolumngreenpygamerow
1条回答
网友
1楼 · 发布于 2024-06-03 03:34:17

使用^{}^{}为每种瓷砖创建一个等距^{}对象:

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

^{}使用平铺代替绘制矩形:

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()

相关问题 更多 >