Page 1 of 1
Platformer game using Tiled , colission detection layer fail
Posted: Tue Mar 04, 2014 9:49 pm
by Oprogrammer
Hey guys , i am using Tiled to create my tile map , i have two layers , Solid and Death , before when i had integrated Solid layer only my character would not slip through the tiles , but ever since i have "tried" to integrate the death layer my character just slips into the tiles,
This is the code i have for the collision detection part.
Code: Select all
function player:isColliding(map, x, y) -- character collides with tile layer solid only from tmx map.
local layer = map.tl["Solid"]
local tileX, tileY = math.floor(x / map.tileWidth), math.floor(y / map.tileHeight)
local tile = layer.tileData(tileX, tileY)
local layer2 = map.tl["Death"]
local tileX, tileY = math.floor(x / map.tileWidth), math.floor(y / map.tileHeight)
local tile = layer2.tileData(tileX, tileY)
return not(tile == nil)
end
and here is my player:collide (event)
Code: Select all
function player:collide(event)
if event == "floor" then
self.y_vel = 0
self.standing = true
end
if event == "ceiling" then
self.y_vel = 0
end
if event == "death" then
self.y_vel = 0
player.x = 256
end
end
I assume there is something wrong in the player:collide function but i don't know what.
PS: i am using advance tiled loader, and looked at their range of in depth tutorials but could not even get the game to compile after the changes.
Re: Platformer game using Tiled , colission detection layer
Posted: Tue Mar 04, 2014 9:58 pm
by Azhukar
Try this:
Code: Select all
function player:isColliding(map, x, y) -- character collides with tile layer solid only from tmx map.
local tileX, tileY = math.floor(x / map.tileWidth), math.floor(y / map.tileHeight)
local layer = map.tl["Solid"]
local tile = layer.tileData(tileX, tileY)
local layer2 = map.tl["Death"]
local tile2 = layer2.tileData(tileX, tileY)
return (tile~=nil or tile2~=nil)
end
Re: Platformer game using Tiled , colission detection layer
Posted: Tue Mar 04, 2014 10:09 pm
by Oprogrammer
Hello ,
Thank you for the quick reply !! , i have put your code it and i am glad to say that my character does not slip into the tiles
.
I wanted to ask, as the tile in the "Death" layer has a physical presence , how would i make a function that would go if player is colliding with tile layer "Death" then ....
Edit: I have added this to my player: update(dt) function
Code: Select all
function player:update(dt) -- update player position
local halfX = self.w / 2
local halfY = self.h / 2
self.y_vel = self.y_vel + (world.gravity * dt)
self.x_vel = math.clamp(self.x_vel, -self.speed, self.speed)
self.y_vel = math.clamp(self.y_vel, -self.flySpeed, self.flySpeed)
local nextY = self.y + (self.y_vel*dt)
if self.y_vel < 0 then
if not (self:isColliding(map, self.x - halfX, nextY - halfY))
and not (self:isColliding(map, self.x + halfX - 1, nextY - halfY)) then
self.y = nextY
self.standing = false
else
self.y = nextY + map.tileHeight - ((nextY - halfY) % map.tileHeight)
self:collide("ceiling")
end
end
if self.y_vel > 0 then
if not (self:isColliding(map, self.x-halfX, nextY + halfY))
and not(self:isColliding(map, self.x + halfX - 1, nextY + halfY)) then
self.y = nextY
self.standing = false
else
self.y = nextY - ((nextY + halfY) % map.tileHeight)
self:collide("floor")
end
else self.y = nextY - ((nextY + halfY) % map.tileHeight)
self:collide("death")
end
local nextX = self.x + (self.x_vel * dt)
if self.x_vel > 0 then
if not(self:isColliding(map, nextX + halfX, self.y - halfY))
and not(self:isColliding(map, nextX + halfX, self.y + halfY - 1)) then
self.x = nextX
else
self.x = nextX - ((nextX + halfX) % map.tileWidth)
end
elseif self.x_vel < 0 then
if not(self:isColliding(map, nextX - halfX, self.y - halfY))
and not(self:isColliding(map, nextX - halfX, self.y + halfY - 1)) then
self.x = nextX
else
self.x = nextX + map.tileWidth - ((nextX - halfX) % map.tileWidth)
end
end
self.state = self:getState()
end
The issue i have is it registers a "floor" as a "death" which makes my character re spawn to the start ( which it should in an event of a death) I know it is linked to the "if not (self:isColliding) " as i have put an else statement in saying if event is not floor then event = death .
Re: Platformer game using Tiled , colission detection layer
Posted: Tue Mar 04, 2014 10:27 pm
by Azhukar
Oprogrammer wrote:The issue i have is it registers a "floor" even as a "death"
You will have to return a value in player:isColliding that will indicate whether the collision was caused by one layer or the other. Then you can get this value in your update and react accordingly.
Re: Platformer game using Tiled , colission detection layer
Posted: Wed Mar 05, 2014 12:57 pm
by Oprogrammer
Would i have to put an If else statement in the player:isColliding , that would say something like
Code: Select all
If tile then
a=1
end
if tile2 then
a =2
end
and then in the player:update(dt) i just put a statement that goes if a =1 then ......... else .........
PS: sorry i am new to lua and don't understand all the concepts.
Re: Platformer game using Tiled , colission detection layer
Posted: Wed Mar 05, 2014 1:34 pm
by Azhukar
Something similar.
Read about function return values here
http://www.lua.org/pil/5.1.html