Page 1 of 1

Collision Detection

PostPosted: Sun Jul 01, 2012 15:31
by lkjoel
I'm trying to write player collision detection (I'm making a teleporter that works like a nether pearl), but I can't seem to figure out how.
Here is my code:
Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
pos = user:getpos()
            pos.y = pos.y + 2
            -- Calculate the position of the user
            velocity = {x=xl, y=yl, z=zl}
            acceleration = {x=0, y=-.25, z=0}
            counter = 0
            while true do
                if(counter >= 100) then
                    break
                end
                local nn = minetest.env:get_node(pos).name
                pos.x = pos.x - .5
                if minetest.registered_nodes[nn].walkable then
                    pos.x = pos.x + .5
                    break
                end
                pos.x = pos.x + 1
                if minetest.registered_nodes[nn].walkable then
                    pos.x = pos.x - .5
                    break
                end
                pos.x = pos.x - .5
                pos.z = pos.z - .5
                if minetest.registered_nodes[nn].walkable then
                    pos.z = pos.z + .5
                    break
                end
                pos.z = pos.z + 1
                if minetest.registered_nodes[nn].walkable then
                    pos.z = pos.z - .5
                    break
                end
                pos.z = pos.z - .5
                pos.y = pos.y - 1
                if minetest.registered_nodes[nn].walkable then
                    pos.y = pos.y + 1
                    break
                end
                pos.x = pos.x - .5
                if minetest.registered_nodes[nn].walkable then
                    pos.x = pos.x + .5
                    break
                end
                pos.x = pos.x + 1
                if minetest.registered_nodes[nn].walkable then
                    pos.x = pos.x - .5
                    break
                end
                pos.x = pos.x - .5
                pos.z = pos.z - .5
                if minetest.registered_nodes[nn].walkable then
                    pos.z = pos.z + .5
                    break
                end
                pos.z = pos.z + 1
                if minetest.registered_nodes[nn].walkable then
                    pos.z = pos.z - .5
                    break
                end
                pos.z = pos.z - .5
                pos.y = pos.y + 2
                if minetest.registered_nodes[nn].walkable then
                    pos.y = pos.y - 1
                    break
                end
                pos.y = pos.y - 1
                pos.x = pos.x - .5
                if minetest.registered_nodes[nn].walkable then
                    pos.x = pos.x + .5
                    break
                end
                pos.x = pos.x + 1
                if minetest.registered_nodes[nn].walkable then
                    pos.x = pos.x - .5
                    break
                end
                pos.x = pos.x - .5
                pos.z = pos.z - .5
                if minetest.registered_nodes[nn].walkable then
                    pos.z = pos.z + .5
                    break
                end
                pos.z = pos.z + 1
                if minetest.registered_nodes[nn].walkable then
                    pos.z = pos.z - .5
                    break
                end
                pos.z = pos.z - .5
                pos.x = pos.x + velocity.x
                pos.y = pos.y + velocity.y + .5 * acceleration.y
                pos.z = pos.z + velocity.z
                pos.x = pos.x - .5
                if minetest.registered_nodes[nn].walkable then
                    pos.x = pos.x + .5 - velocity.x
                    break
                end
                pos.x = pos.x + 1
                if minetest.registered_nodes[nn].walkable then
                    pos.x = pos.x - .5 - velocity.x
                    break
                end
                pos.x = pos.x - .5
                pos.z = pos.z - .5
                if minetest.registered_nodes[nn].walkable then
                    pos.z = pos.z + .5 - velocity.z
                    break
                end
                pos.z = pos.z + 1
                if minetest.registered_nodes[nn].walkable then
                    pos.z = pos.z - .5 - velocity.z
                    break
                end
                pos.z = pos.z - .5
                pos.y = pos.y - 1
                if minetest.registered_nodes[nn].walkable then
                    pos.y = pos.y + 1 - velocity.y - .5 * acceleration.y
                    break
                end
                pos.x = pos.x - .5
                if minetest.registered_nodes[nn].walkable then
                    pos.x = pos.x + .5 - velocity.x
                    break
                end
                pos.x = pos.x + 1
                if minetest.registered_nodes[nn].walkable then
                    pos.x = pos.x - .5 - velocity.x
                    break
                end
                pos.x = pos.x - .5
                pos.z = pos.z - .5
                if minetest.registered_nodes[nn].walkable then
                    pos.z = pos.z + .5 - velocity.z
                    break
                end
                pos.z = pos.z + 1
                if minetest.registered_nodes[nn].walkable then
                    pos.z = pos.z - .5 - velocity.z
                    break
                end
                pos.z = pos.z - .5
                pos.y = pos.y + 2
                if minetest.registered_nodes[nn].walkable then
                    pos.y = pos.y - 1 - velocity.y - .5 * acceleration.y
                    break
                end
                pos.y = pos.y - 1
                pos.x = pos.x - .5
                if minetest.registered_nodes[nn].walkable then
                    pos.x = pos.x + .5 - velocity.x
                    break
                end
                pos.x = pos.x + 1
                if minetest.registered_nodes[nn].walkable then
                    pos.x = pos.x - .5 - velocity.x
                    break
                end
                pos.x = pos.x - .5
                pos.z = pos.z - .5
                if minetest.registered_nodes[nn].walkable then
                    pos.z = pos.z + .5 - velocity.z
                    break
                end
                pos.z = pos.z + 1
                if minetest.registered_nodes[nn].walkable then
                    pos.z = pos.z - .5 - velocity.z
                    break
                end
                pos.z = pos.z - .5
                counter = counter + 1
            end
            user:setpos(pos)

PostPosted: Sat Jul 07, 2012 11:35
by Keriz
Can you explain me how do you do that ?

thank you

PostPosted: Sat Jul 07, 2012 12:49
by Calinou
Proper player collision detection would have to be done in C++, client-side.
._.