Page 79 of 92

Re: Simple Tiled Implementation - STI v1.2.3.0

Posted: Mon Dec 23, 2019 10:16 pm
by kinderalpha
ingsoc451 wrote: Mon Dec 23, 2019 10:00 pm Why don't you use objects if it is something like a door? Changing the tilelayer feels somewhat strange

and did you try:

Code: Select all

local tile = layer.data[8][5]
I did try that to no avail.

If I could use objects that would be great but I cant draw objects with a tile image (right?). On tiled I can only place a door tile in a tile layer, not object layer. Now that I'm typing this though. I could probably draw a tile image separately to the object in my code and do it that way.

Re: Simple Tiled Implementation - STI v1.2.3.0

Posted: Mon Dec 23, 2019 11:59 pm
by master both
kinderalpha wrote: Mon Dec 23, 2019 9:21 pm The way you layed this out makes a lot more sense to me compared to what I've read elsewhere. I understand it now, I just need to know one more detail.
master both wrote: Mon Dec 23, 2019 8:56 pm To get the tile instance, you first need to get the it's tile from it's position:

Code: Select all

local layer = map.layers["layer_name"]
local tile = layer.data[y][x]
What type of x and y value is expected for the layer.data index? On tiled, the door which I want to manipulate is at position (5,8) which correlates to tile position. So in my code I'm doing this.

Code: Select all

            local tile_x, tile_y = tilemap.map:convertTileToPixel(5, 8)
            local layer = tilemap.map.layers['Door']
            local tile = layer.data[tile_y][tile_x]
However, it's giving me an error for indexing a nil value for

Code: Select all

	local tile = layer.data[tile_y][tile_x]
So how should I go about getting the tile x and y if this isn't working?
Thank you so much for the help though, you have no idea how excited I am to tackle this issue.
To get the tile from the layer, you should use tile positioning, and since lua indexes start as 1, it should be as follows:

Code: Select all

local tile = layer.data[8+1][5+1]
But if data[8][5] gives you an error, then I don't know what the problem may be. Maybe you're already adding a 1 and the position should be (4, 7)?

Also I just realize I didn't specify the positioning that should be used when searching fot the instance, which is pixel positioning. I have edited my previous post to be more clear on this.

Re: Simple Tiled Implementation - STI v1.2.3.0

Posted: Tue Dec 24, 2019 1:36 am
by Karai17
Object layers support Tile Image Objects as part of the TIled spec, so you could use an object.

Re: Simple Tiled Implementation - STI v1.2.3.0

Posted: Tue Dec 24, 2019 5:49 pm
by kinderalpha
Thank you so much for the help guys! I'm so thrilled to have figured this out. Here's what I ended up doing, and some things I didn't understand. So below is the full code for opening a door and closing a door.

Code: Select all

-- x, y is the tile location of the door
  local layer = tilemap.map.layers['Door'] -- Layer containing door tiles
  local tile = layer.data[y+1][x+1] -- Tile data for the door we're interacting with
  local door_closed = 357 -- GID for closed door image
  local door_open = 358 -- GID for open door image

  local instance = false
  local px, py = tilemap.map:convertTileToPixel(x, y) -- get exact x and y of tile.
  for _, ti in pairs(tilemap.map.tileInstances[tile.gid]) do
    -- Search through tileInstances by our specified tile GID
    if ti.x == px and ti.y == py then -- if instance matches tile location
      instance = ti
      break
    end
  end

  -- if instance is not nil or false from before
  if instance ~= false then
    -- handle which image to show
    if door.closed then
      door.closed = false -- door is closed, lets open it
      local new_tile = tilemap.map.tiles[door_open] -- opened door tile
      instance.batch:set(instance.id, new_tile.quad, instance.x, instance.y)
    elseif not door.closed then
      door.closed = true -- door is open, let's close it
      local new_tile = tilemap.map.tiles[door_closed] -- closed door tile
      instance.batch:set(instance.id, new_tile.quad, instance.x, instance.y)
    end
  end
I ended up using

Code: Select all

instance.batch:set(instance, quad, x, y)
Because swapTile seemed to change the position of the instance and made it unable to swap between one and another. I'm not sure why that was happening, or what exactly batch:set does differently but it works and I seem to have no issue with my usage of it. Thank you everyone for the help, and I posted the full code incase somebody in my situation needs a reference. You guys rock!

Re: Simple Tiled Implementation - STI v1.2.3.0

Posted: Mon Dec 30, 2019 1:17 am
by OtherCannon
I'm a bit of a newbie here, so forgive my inexperience.
I was using the tutorial to implement the player object, but when I attempted to run it, I got this:
Error

main.lua:24: attempt to index local 'player' (a nil value)


Traceback

main.lua:24: in function 'load'
[C]: in function 'xpcall'
[C]: in function 'xpcall'

Code: Select all

local sti = require "sti"

function love.load()
  --Load map file
  map = sti("res/map/map.lua")
  
  --Create new dynamic data layer called "Sprites" as the 2nd layer
  local layer = map:addCustomLayer("Sprites", 2)
  
 --Error is in this chunk, lets figure it out shall we? 
  --Get player spawn object
  local player
	for k, object in pairs(map.objects) do
		if object.name == "Player" then
			player = object
			break
		end
	end

  --Create player object
  local sprite = love.graphics.newImage("res/img/sprite.bmp")
  layer.player = {
    sprite = sprite,
    x      = player.x,
    y      = player.y,
    ox     = sprite:getWidth() / 2,
    oy     = sprite:getHeight() / 1.35
  }
  
  --Draw player
  layer.draw = function(self)
    love.graphics.draw(
      self.player.sprite,
      math.floor(self.player.x),
      math.floor(self.player.y),
      0,
      1,
      1,
      self.player.ox,
      self.player.oy
    )
    
    --Temporarily draw a point at our location so we know
    --That our sprite is offset properly
    love.graphics.setPointSize(5)
    love.graphics.points(math.floor(self.player.x), math.floor(self.player.y))
  end
  
  --Remove unneeded object layer
  map:removeLayer("Spawn Point")
end

function love.update(dt)
  --Update world
  map:update(dt)
end

function love.draw()
  --Draw world
  map:draw()
end

Re: Simple Tiled Implementation - STI v1.2.3.0

Posted: Mon Dec 30, 2019 6:48 pm
by Karai17
it would seem that the object's name is not the exact same in your code and your map. strings are case sensitive.

Re: Simple Tiled Implementation - STI v1.2.3.0

Posted: Mon Dec 30, 2019 8:08 pm
by OtherCannon
That seemed to do the trick. Thanks!

Re: Simple Tiled Implementation - STI v1.2.3.0

Posted: Fri Jan 31, 2020 2:19 pm
by pauljessup
Hey all, I started working on a platformer, and thought that I'd use this rather than update the Green Tea in game map editor system. Mostly cause TileD rocks, etc. etc.

Anyway, I think I might end up doing a small tutorial for people that would walk through how to use this with Bump, and implementing gravity and that sort of thing.

Re: Simple Tiled Implementation - STI v1.2.3.0

Posted: Fri Jan 31, 2020 10:01 pm
by Karai17
additional tutorials and plugins are very much welcome! feel free to make a pull request if you'd like the tutorial added to the main repo. credit yourself and all that too~

Re: Simple Tiled Implementation - STI v1.2.3.0

Posted: Fri Jan 31, 2020 10:36 pm
by pauljessup
Sounds good, will do! I was like giving back to the tools I use, when I can