panda3d-tmx2bam

CLI tool for converting Tiled TMX files to Panda3D BAM files.


License
CC0-1.0
Install
pip install panda3d-tmx2bam==0.0.26

Documentation

CLI tool for converting Tiled TMX files to Panda3D BAM files.

Usage:

$ pip install panda3d-tmx2bam
$ tmx2bam path/to/tmx/file.tmx path/to/bam/file.bam -prefabs=path/to/prefabs.bam

or

from tmx2bam import Tmx2Bam
from direct.showbase.ShowBase import ShowBase

base = ShowBase()
tmx_map = Tmx2Bam("path/to/tmx/file.tmx", prefabs="path/to/prefabs.bam")
tmx_map.node.reparent_to(render)
base.run()

Prefabs are optional. Without them all tiles will be cards. Find important tiles and their properties like so:

tiles_with_my_property = tmx_map.node.find_all_matches('**/=my_property_name')
for tile in tiles_with_my_property:
  my_property_value = tile.get_tag("my_property_name")

You can read more about searching Panda3d's scene graph here: https://docs.panda3d.org/1.10/python/programming/scene-graph/searching-scene-graph

Currently supports:

  • TMX file with CSV data (default)
  • Custom properties as PandaNode tags
  • Multiple tilesheets
  • Multiple layers and Groups
  • Animated tiles
  • Object layer/Objects (point, poly, rectangle, text, image)
  • Background images
  • Merge animated sprites
  • Allow more shapes than just cards

Left to do:

  • Infinite maps (chunks)
  • Hexagonal and Isometric tiles
  • Tile render order
  • Tilesheet image collection
  • Embedded tilesheet in tmx
  • Embedding texture in bam
  • Tiled features I'm not aware of
  • Error handling
  • A better readme

Exporter specific custom layer properties:

  • "flatten" will flatten_strong() the layer
  • "store_data" will store the data in the layer with set_python_tag()
  • "z" set's the layer's z height.

Prefabs: To use prefabs, simply make a bam (with blender and blend2bam for example), where each root object is a nodepath named after a type in the spritesheet's tsx. Tmx2bam will then replace the tiles or objects that have this type assigned with this nodepath.

Mind:

  • The Y axis is inverted in panda3d.
  • Animated sprites can only have one steady frame-rate that you can set on the first frame in Tiled.
  • Currently the image resolutions have to be power of two.
  • Rendering tons of individual tiles is slow. Use the "flatten" property as much as possible.
  • The ellipse and point objects are not drawn at this time, they're empty nodepaths.
  • I'm not a programmer but I play one on TV. Your mileage may vary.

Fun snippets:

  • Adding a "repeat" property to a "cube" prefabed tile to make towers and large walls and things.
for layer in tmx2bam.node.find_all_matches("**/=repeat"):
    repetitions = layer.get_tag("repeat")
    repeats_node = NodePath(layer.name+"-repeat")
    for repetition in range(int(repetitions)):
        repeat = NodePath("repeat")
        layer.copy_to(repeat)
        repeat.set_z(layer.get_z()+repetition-1)
        repeat.reparent_to(repeats_node)
    repeats_node.flatten_strong()
    repeats_node.reparent_to(layer)

Licensed WTFPL.