entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

problemas con pytmx (pygame - python)

Error

Link imagen del error: http://es.tinypic.com/r/ouxh68/9

Ese es el error que me sale.
Estoy empezando a hacer juegos con pygame, y para cargar el mapa y demás necesito la librería pytmx.
La descargué, y si pongo un código que no uso en le programa no me salta el error, pero si lo uso sí. Creo que no es del código, si no que algo funciona mal. Agradecería una ayuda.

Aquí dejo el código por si sirve de algo:

import pygame as pg
import sys
import pytmx
from pytmx.util_pygame import load_pygame

WIDTHWINDOW = 700
HEIGHTWINDOW = 500
SPRITEWIDTH = 30
SPRITEHEIGHT = 30

class Background(pg.sprite.Sprite):
    def __init__(self, image_file, location):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.image.load(image_file)
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = location

class Player(pg.sprite.Sprite):
    def __init__(self, location):
        pg.sprite.Sprite.__init__(self)
        #load images
        self.imageDown1 = pg.image.load('./player/5.png')
        self.imageDown2 = pg.image.load('./player/4.png')
        self.imageUp1 = pg.image.load('./player/1.png')
        self.imageUp2 = pg.image.load('./player/0.png')
        self.imageRight1 = pg.image.load('./player/3.png')
        self.imageRight2 = pg.image.load('./player/2.png')
        self.imageLeft1 = pg.image.load('./player/6.png')
        self.imageLeft2 = pg.image.load('./player/7.png')
        #create a list of lists of the images
        self.images = [[self.imageDown1,self.imageDown2],[self.imageUp1,self.imageUp2],[self.imageRight1,self.imageRight2],[self.imageLeft1,self.imageLeft2]]
        #create orientation
        self.orientation = 0
        #actual image
        self.actual_image = self.images[self.orientation][0]
        #get rectangle of the image
        self.rect = self.imageDown1.get_rect()

        #set position of the image
        self.rect.left, self.rect.top = location
    def move(self, vx, vy):
        self.rect.move_ip(vx,vy)
        """self.rect.left = self.rect.left + vx
        self.rect.top = self.rect.top + vy"""

class Map:
    def __init__(self, filename):
        tm = load_pygame(filename, pixelalpha=True)
        self.size = tm.width * tm.tilewidth, tm.height * tm.tileheight
        self.tmx_data = tm

    def render(self, surface):
        tw = self.tmx_data.tilewidth
        th = self.tmx_data.tileheight
        gt = self.tmx_data.getTileImageByGid

        if self.tmx_data.background_color:
            surface.fill(self.tmx_data.background_color)

        for layer in self.tmx_data.visibleLayers:
            if isinstance(layer, pytmx.TiledTileLayer):
                for x, y, gid in layer:
                    tile = gt(gid)
                    if tile:
                        surface.blit(tile, (x * tw, y * th))

            elif isinstance(layer, pytmx.TiledObjectGroup):
                pass

            elif isinstance(layer, pytmx.TiledImageLayer):
                image = gt(layer.gid)
                if image:
                    surface.blit(image, (0, 0))

    def make_map(self):
        temp_surface = pg.Surface(self.size)
        self.render(temp_surface)
        return temp_surface

def main():
    pg.init()
    FPSClock = pg.time.Clock()
    DISPLAYSURFACE = pg.display.set_mode((WIDTHWINDOW,HEIGHTWINDOW))
    pg.display.set_caption("Pokemon")
    #backGround = Background('./map/5.png', [0,0])
    backGround = Map('map/pokemon01.tmx')
    t=0
    player = Player([int(WIDTHWINDOW/2), 50])
    vx = 0
    vy = 0
    vel=2
    rightIsPressed,leftIsPressed,upIsPressed,downIsPressed = False,False,False,False
    isMoving = False

    while True:
        for event in pg.event.get():
            if event.type==pg.QUIT:
                pg.quit()
                sys.exit()
            if event.type==pg.KEYDOWN:
                if event.key==pg.K_DOWN:
                    downIsPressed=True
                    vy=vel
                    vx=0
                    player.orientation = 0
                if event.key==pg.K_UP:
                    upIsPressed=True
                    vy=-vel
                    vx=0
                    player.orientation = 1
                if event.key==pg.K_LEFT:
                    leftIsPressed=True
                    vx=-vel
                    vy=0
                    player.orientation = 3
                if event.key==pg.K_RIGHT:
                    rightIsPressed=True
                    vx=vel
                    vy=0
                    player.orientation = 2
            if event.type==pg.KEYUP:
                if event.key==pg.K_DOWN:
                    downIsPressed=False
                    if upIsPressed: 
                        vy=-vel
                        vx=0
                    else: 
                        vy=0
                if event.key==pg.K_UP:
                    upIsPressed=False
                    if downIsPressed: 
                        vy=vel
                        vx=0
                    else: 
                        vy=0
                if event.key==pg.K_LEFT:
                    leftIsPressed=False
                    if rightIsPressed: 
                        vx=vel
                        vy=0
                    else: 
                        vx=0
                if event.key==pg.K_RIGHT:
                    rightIsPressed=False
                    if leftIsPressed: 
                        vx=-vel
                        vy=0
                    else: 
                        vx=0
        if t>=1:
            t=0
        else:
            t+=1

        if rightIsPressed==False and leftIsPressed==False and upIsPressed==False and downIsPressed==False:
            isMoving = False
        else:
            isMoving = True

        if isMoving == False:
            t=0

        player.actual_image=player.images[player.orientation][t]
        player.move(vx,vy)

        #DISPLAYSURFACE.blit(pg.transform.scale(backGround.image, (WIDTHWINDOW, HEIGHTWINDOW)), backGround.rect)
        DISPLAYSURFACE.blit(pg.transform.scale(backGround.make_map(), (WIDTHWINDOW, HEIGHTWINDOW)), backGround.make_map().get_rect())
        DISPLAYSURFACE.blit(pg.transform.scale(player.actual_image, (SPRITEWIDTH, SPRITEHEIGHT)), player.rect)

        """
        for x in range(0, WIDTHWINDOW, TILESIZE):
            pg.draw.line(DISPLAYSURFACE, (0,0,0), (x, 0), (x, HEIGHTWINDOW))
        for y in range(0, HEIGHTWINDOW, TILESIZE):
            pg.draw.line(DISPLAYSURFACE, (0,0,0), (0, y), (WIDTHWINDOW, y))
        """

        FPSClock.tick(30)
        pg.display.update()

if __name__ == '__main__':
    main()

El error: http://es.tinypic.com/r/ouxh68/9

0voto

steven comentado

hola si te interesa desarrollar juegos puedes contactarme para hablar sobre el tema y hablarte del mio si te gustaria podemos colaborar juntos.
mi cuenta de skype [email protected]

1 Respuesta

2votos

white Puntos75840

Parece un problema buscando la ruta de una imagen para el tilemap, el error esta claro, asegurate de que la ruta hacia tileset_256_32x32_by_chaoticcherrycake-dab2byf.png este correctamente colocada en el fichero pokemon01.tmx, tal ves si nos pasas el código de ese fichero podamos saber que ruta esta mal, tambien cuentanos la estructura del directorio de tu juego y cuentanos con que programa realizas los ficheros .tmx

saludos!

0voto

TheHomicide comentado

No me deja responderte. Lo pondré por partes.

0voto

TheHomicide comentado

El archivo tmx es un archivo creado con Tiled, que consiste en un mapa.

Lo que hice fue abrir el programa Tiled que es algo así como un editor de mapa, y arrastré la carpeta del tileset que me descargué de internet, para hacer el mapa, sobre el programa. Ese archivo (el .png de mi tileset) está, como bien pone en el código, en "Mis Imágenes". Luego construí el mapa.

La estructura del directorio del juego es la siguiente:
Dentro de la carpeta Pokemon, estan las carpetas map y player, y el archivo "pokemon.py". En map estan las imagenes de mapa .png, más el archivo "pokemon01.tmx" que es el que utilizo.
Dentro de player estan cada uno de los sprites del jugador, en sus distintas direcciones. Y por último el código que esta en "pokemon.py"
La carpeta pokemon a su vez, esta incluida en "C:\Users\NombreUsuario\EclipseProjects\"

0voto

TheHomicide comentado

Código del archivo .tmx (1a parte):

<?xml version="1.0" encoding="UTF-8"?>
<map version="1.0" orientation="orthogonal" renderorder="right-down" width="22" height="16" tilewidth="32" tileheight="32" nextobjectid="16">
 <tileset firstgid="1" name="tileset_256_32x32_by_chaoticcherrycake-dab2byf" tilewidth="32" tileheight="32" tilecount="5208" columns="8">
  <image source="../../Pictures/tileset-pokemon/tileset_256_32x32_by_chaoticcherrycake-dab2byf.png" width="256" height="20832"/>
  <tile id="0">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="1">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="8">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="9">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="563">
   <properties>
    <property name="collision" type="bool" value="false"/>
   </properties>
  </tile>
  <tile id="3096">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3097">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3098">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3099">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3100">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3101">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3102">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3104">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3105">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3106">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3107">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3108">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3109">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3110">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3112">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3113">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3114">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3115">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3116">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3117">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3118">
   <properties>
    <property name="collision" type="bool" value="true"/>
   </properties>
  </tile>
  <tile id="3120">
   <properties>
    <property name="collision" type="bool" value="false"/>
   </properties>
  </tile>
  <tile id="3121">
   <properties>
    <property name="collision" type="bool" value="false"/>
   </properties>
  </tile>
  <tile id="3122">
   <properties>
    <property name="collision" type="bool" value="false"/>
   </properties>
  </tile>
  <tile id="3123">
   <properties>
    <property name="collision" type="bool" value="false"/>
   </properties>
  </tile>
  <tile id="3124">
   <properties>
    <property name="collision" type="bool" value="false"/>
   </properties>
  </tile>
  <tile id="3125">
   <properties>
    <property name="collision" type="bool" value="false"/>
   </properties>
  </tile>
  <tile id="3126">
   <properties>
    <property name="collision" type="bool" value="false"/>
   </properties>
  </tile>
 </tileset>

0voto

TheHomicide comentado

Código (2a parte):

<layer name="cesped" width="22" height="16">
  <data encoding="csv">
564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564
</data>
 </layer>
 <layer name="arboles" width="22" height="16">
  <data encoding="csv">
1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,
9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,
1,2,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,1,2,
9,10,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,9,10,
1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,
9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,
1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,
9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,
1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,
9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,
1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,
9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,
1,2,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,1,2,
9,10,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,9,10,
1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,
9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10
</data>
 </layer>
 <layer name="casas" width="22" height="16">
  <data encoding="csv">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,3097,3098,3099,0,0,0,0,0,0,0,0,3100,3101,3102,3103,0,0,0,
0,0,0,0,3105,3106,3107,0,0,0,0,0,0,0,0,3108,3109,3110,3111,0,0,0,
0,0,0,0,3113,3114,3115,0,0,0,0,0,0,0,0,3116,3117,3118,3119,0,0,0,
0,0,0,0,3121,3122,3123,0,0,0,0,0,0,0,0,3124,3125,3126,3127,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,3097,3098,3099,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,3105,3106,3107,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,3113,3114,3115,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,3121,3122,3123,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</data>
 </layer>
 <objectgroup name="objetos">
  <object id="4" x="133" y="134" width="81" height="90"/>
  <object id="5" x="325" y="294" width="82" height="91"/>
  <object id="6" x="486" y="129.5" width="100" height="80"/>
  <object id="7" x="528" y="129" width="58" height="97"/>
  <object id="8" x="0" y="0" width="703" height="66"/>
  <object id="9" x="-0.5" y="447" width="703" height="66"/>
  <object id="10" x="-0.5" y="0" width="62" height="512"/>
  <object id="11" x="641" y="1" width="62" height="512"/>
  <object id="12" x="63" y="67" width="64" height="59"/>
  <object id="13" x="64" y="392.5" width="64" height="54"/>
  <object id="14" x="574" y="65.5" width="67" height="62"/>
  <object id="15" x="575" y="392.5" width="64" height="53"/>
 </objectgroup>
</map>

0voto

white comentado

es posible que python no encuentre la ruta ../../Pictures/tileset-pokemon/tileset_256_32x32_by_chaoticcherrycake-dab2byf.png hagamos esto, modifica el fichero .tmx

reemplaza:

<image source="../../Pictures/tileset-pokemon/tileset_256_32x32_by_chaoticcherrycake-dab2byf.png" width="256" height="20832">

por:

<image source="map/tileset_256_32x32_by_chaoticcherrycake-dab2byf.png" width="256" height="20832">

verifica que el archivo tileset_256_32x32_by_chaoticcherrycake-dab2byf.png exista en la ruta C:/Users/NombreUsuario/EclipseProjects/Pokemon/map/ si persiste el problema intenta con una ruta completa:

<image source="C:/Users/NombreUsuario/EclipseProjects/Pokemon/map/tileset_256_32x32_by_chaoticcherrycake-dab2byf.png" width="256" height="20832">

cuando uses el editor Tiled asegurate de que importes las imagenes desde: C:/Users/NombreUsuario/EclipseProjects/Pokemon/map/ y no desde otro lugar.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta