当前位置: 首页 > 知识库问答 >
问题:

如何使用平铺和pytmx在Pygame中显示平铺地图?

邓季
2023-03-14

我知道有一个类似的问题,但答案不够具体,无法在我的案例中发挥作用。

我试图创建一个程序,可以显示在平铺中创建的平铺地图,并使用pytmx上传到Pygame中。我唯一的问题是在Pygame中将图像快速显示在屏幕上。

这就是我一直收到的错误:回溯(最近一次调用):文件“C:\Users\b\Desktop\Frozed Map Textures\test.py”,第32行,在screen.blit(images[I],(x*32,y*32))类型错误:参数1必须是pygame.Surface,而不是None

如果有人知道如何解决这个问题,我将非常感激!谢谢你的帮助!

代码如下:

import pygame
from pytmx import load_pygame
import random


white = (255,255,255)


#create window
screenSize = (800,600)
screen = pygame.display.set_mode(screenSize)
pygame.display.set_caption("GameName")
screen.fill(white)


gameMap = load_pygame("Frozen.tmx")


#creates list of single tiles in first layer
images = []
for y in range(50):
    for x in range(50):
        image = gameMap.get_tile_image(x,y,0)
        images.append(image)


#displays tiles in locations
i = 0
for y in range(50):
    for x in range(50):
        screen.blit(images[i],(x*32,y*32))
        i += 1


#main loop
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    pygame.display.flip()

pygame.quit()

共有1个答案

钱经业
2023-03-14

我对pytmx不是很熟悉,但我认为问题在于变量I在第一个for-循环中从0运行到2600(在images列表中有2600个项目/图像/磁贴)。但是,当您创建平铺位置列表(imageLocs)时,i仅从0运行到49,因此您有一个不同位置的列表50

这意味着您没有每个磁贴的“足够”位置。

除此之外,在python中,对于i In rang(value)-循环,您不需要增加中的任何变量,因为i运行时会抛出(即分配给)range()函数返回的所有值。

您可以更新代码以避免此问题:

#Original code    

#create a list of 2600 single tiles in first layer
images = []

for y in range(50):
    for x in range(50):
        image = gameMap.get_tile_image(x,y,0)
        images.append(image)

#blit all tiles onto the screen
i = 0 #runs from 0 to 2600

for y in range(50):
    for x in range(50):
        screen.blit(images[i],(x * 32, y * 32))
        i += 1

#Orginal code

我希望这有帮助:)

 类似资料:
  • 嗨,我正在尝试创建一个模式内的地图。但是地图只显示了一部分。我尝试过在节点创建后使其无效,但它似乎不起作用。谢谢!

  • 在谷歌地图V2中有没有隐藏地图(使不可见)瓷砖的方法? 我想拥有地图(标记,信息窗口)的所有其他功能,但不是地图,我想有静态的背景图像。作为转机,我尝试使用瓷砖覆盖,但它是加载多个图像,而不是一个,仍然是加载第一个原始地图瓷砖。 谷歌地图V2有这样的选择吗?

  • 我正在编程一个小游戏,它是基于瓷砖的。但当我渲染它的时候,有时那些瓷砖之间的一个小空间是可见的,(绿色)背景是暴露的(可以在视频中看到)。 我想知道,是否有一些双缓冲技术,可以解决这个bug,但我读到,双缓冲已经实现了。

  • 将数组平铺到指定的深度。 使用递归,为每个深度级别 depth 递减 1 。 使用 Array.reduce() 和 Array.concat() 来合并元素或数组。 基本情况下,depth 等于 1 停止递归。 省略第二个参数,depth 只能平铺到 1 (单层平铺) 的深度。 const flatten = (arr, depth = 1) => depth != 1 ? arr.

  • 我正在努力通过tiledmap实现一个碰撞检测系统。我有一个2d“口袋妖怪风格”的游戏,有一个平铺的地图渲染。具体来说,我的平铺地图中有一个“碰撞”层。我希望与播放器和其他实体进行交互的tmx文件。我的问题是,我如何将播放器sprite(扩展Sprite类)连接到tiledmap的“碰撞”层,并导致两者之间的碰撞。感谢任何建议。

  • 我正试着做作业,但做不到。我研究了很多相关的话题,但找不到答案,所以需要帮助。 我们的老师想要这个;制定一个计划,用4×4英寸大小的黑白相间的瓷砖铺一个矩形浴室地板。地板尺寸(以英寸为单位)是4的倍数 确定输入和输出。 输入是地板尺寸(长×宽),以英寸为单位。 输出是瓷砖地板。 Step2)将问题分解为更小的任务。 自然的子任务是铺设一排瓷砖。如果可以解决这个问题,那么可以通过从一面墙开始,将一行