首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用PyTMX实现游戏加载Tilemap

用PyTMX实现游戏加载Tilemap
EN

Stack Overflow用户
提问于 2017-08-31 23:12:47
回答 2查看 2.4K关注 0票数 2

我试图理解游戏中的tilemaps,并学习如何使用贴图编辑器,但我无法成功地将地图加载到游戏中。以下是代码:

代码语言:javascript
复制
import pygame
import pytmx

pygame.init()

display = pygame.display.set_mode((600,400))
clock = pygame.time.Clock()

gameMap = pytmx.TiledMap("map.tmx")

while(True):

    clock.tick(60)
    keys = pygame.key.get_pressed()

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

    if(keys[pygame.K_ESCAPE]):
        quit()

    for layer in gameMap.visible_layers:
            for x, y, gid, in layer:
                tile = gameMap.get_tile_image_by_gid(gid)
                if(tile != None):
                    display.blit(tile, (x * gameMap.tilewidth, y * gameMap.tileheight))

    pygame.display.update()

它不断地给我这个错误:

追溯(最近一次调用):文件"main.py",第27行,在display.blit(平铺,(x * gameMap.tilewidth,y*gameMap.tileheight)TypeError中):参数1必须是pygame.Surface,而不是元组

我知道当我在控制台打印瓷砖时,这就是我得到的

(一个元组):('img/NES - Super Mario Bros - Tileset.png', (0, 144, 16, 16), TileFlags(flipped_horizontally=False, flipped_vertically=False, flipped_diagonally=False))

在游戏中成功加载tilemap最简单的方法是什么,我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-18 19:26:21

用途:

代码语言:javascript
复制
gameMap = pytmx.load_pygame("map.tmx")

而不是:

代码语言:javascript
复制
gameMap = pytmx.TiledMap("map.tmx")
票数 2
EN

Stack Overflow用户

发布于 2017-09-01 01:07:33

我认为下面的内容涵盖了渲染mapSurface并使用updateloadMap在其上绘制一些东西的大部分机制。我没有任何真正的TMX文件可供测试。ymmv祝好运。

代码语言:javascript
复制
import time
import pygame
import pytmx


class TiledMap():
""" This is creating the surface on which you make the draw updates """
    def __init__(self):
        self.gameMap = pytmx.load_pygame("map.tmx", pixelalpha=True)
        self.mapwidth = self.gameMap.tilewidth * self.gameMap.width
        self.mapheight = self.gameMap.tileheight * self.gameMap.height

    def render(self, surface):
        for layer in self.gameMap.visible_layers:
            if isinstance(layer, pytmx.TiledTileLayer):
                for x, y, gid in layer:
                    tile = self.gameMap.get_tile_image_by_gid(gid)
                    if tile:
                        surface.blit(tile, (x * self.gameMap.tilewidth, y * self.gameMap.tileheight))

    def make_map(self):
        mapSurface = pygame.Surface((self.mapwidth, self.mapheight))
        self.render(mapSurface)
        return mapSurface

pygame.init()


class Display():
""" This is the class that makes the changes that you want to display. You would add most of your changes here. """

    def __init__(self):

        self.displayRunning = True
        self.displayWindow = pygame.display.set_mode((600, 400))
        self.clock = pygame.time.Clock()

    def update(self):

        pygame.display.set_caption("{:.2f}".format(self.clock.get_fps()))
        pygame.display.update()

    def loadMap(self):

        self.map = TiledMap()
        self.map_img = self.map.make_map()
        self.map_rect = self.map_img.get_rect()

    def displayLoop(self):

        self.clock.tick()
        self.update()
        self.loadMap()

# Here is the start of the main driver


runDisplay = Display()

runDisplay.update()
runDisplay.loadMap()
time.sleep(60)

如果您希望它在循环中运行,那么您将将底部驱动程序块更改为如下所示:

代码语言:javascript
复制
runDisplay = Display()
while runDisplay.displayRunning is True:
    runDisplay.displayLoop()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45991319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档