No description
Find a file
2023-10-03 08:02:27 -07:00
.vscode feature: loading tilesets 2022-12-28 20:56:59 -08:00
src fix: broken tests and missing exports 2023-10-03 08:02:27 -07:00
tests fix: properties are now tables 2023-03-05 15:21:05 -08:00
.gitignore added htmldocs to gitignore 2023-03-05 15:25:33 -08:00
CHANGELOG.md Update readme, changelog and copyright 2022-01-24 18:29:37 +00:00
LICENSE Update readme, changelog and copyright 2022-01-24 18:29:37 +00:00
nim_tiled.nimble fix: broken tests and missing exports 2023-10-03 08:02:27 -07:00
README.md resized screenshot 2023-01-02 18:23:28 -08:00
screenshot.png resized screenshot 2023-01-02 18:23:28 -08:00

Nim Tiled

nimble

Introduction

A tiled map loader for the Nim programming language. The Tiled map editor can be found here. Documentation for the tiled file format can be found here.

Example

echo "Loaded the tiled map: ", loadTiledMap("tilemap.tmx").orDefault

Example with error handling

let res = loadTiledMap("tilemap.tmx")

if res.isOk:
  echo "Loaded the tiled map: ", res.tiledMap

Documentation

Generate documentation by running the nimble docs command

Example using Windy, Pixie and Boxy

Infinite Tilemap demo

Infinite Tilemap demo

import windy, boxy, pixie, opengl, options, os, nim_tiled

when isMainModule:
  var window = newWindow("Tiled Map Demo!", ivec2(640, 640))
  window.makeContextCurrent()
  loadExtensions()

  var bxy = newBoxy()

  let
    tiledMap = loadTiledMap("res/TestArea.tmx").orDefault
    tileset = tiledMap.tilesets[0]
    tilesetImage = readImage("res".joinPath tileset.image.get().source)

  proc renderTile(key: string, gid: Tile) =
    if not bxy.contains(key):
      let
        img = newImage(tileset.tilewidth, tileset.tileheight)
        ctx = newContext(img)
        tw = tileset.tilewidth.float
        th = tileset.tileheight.float
        rx = (gid mod tileset.columns).float * tw
        ry = (gid.float / tileset.columns.float).int.float * th

      ctx.drawImage(tilesetImage, rect(vec2(rx.float, ry.float), vec2(tw, th)),
          rect(vec2(), vec2(tw, th)))

      bxy.addImage(key, img)

  while not window.closeRequested:
    glClear(GL_COLOR_BUFFER_BIT)
    bxy.beginFrame(window.size)

    for layer in tiledMap.layers:
      if layer.kind == tiles:
        for chunk in layer.data.chunks:
          for x in 0..<chunk.width.int:
            for y in 0..<chunk.height.int:
              let
                tw = tileset.tilewidth.float
                th = tileset.tileheight.float
                gid = chunk.tiles[x + y * chunk.width.int]
                key = "tile-" & $gid

              if gid > 0:
                renderTile(key, gid - 1)
                bxy.drawImage(key, pos = vec2(200.0, 128.0) + vec2(((
                    chunk.x.int + x) * tw.int).float, ((chunk.y.int + y) *
                        th.int).float))

    bxy.endFrame()
    window.swapBuffers()
    pollEvents()

Preview