## Mouse moved character

Questions about the LÖVE API, installing LÖVE and other support related questions go here.
Forum rules
dominicus
Prole
Posts: 4
Joined: Tue Sep 08, 2015 8:21 pm

### Mouse moved character

Well my problem seems to be the logic one or i just don't understand how love engine works, but either way i have some code,
problem lies in character movement it moves a little then stops i want it to move to exact destination point clicked by mouse.
Its just part of code...

Code: Select all

player = {}
player.image = love.graphics.newImage("data/player.png");
player.x = 0
player.y = 0
player.speed = 100/20
function player.draw()
love.graphics.draw(player.image, player.x, player.y);
end
function player.move_to(_x, _y)
dx = _x - player.x
dy = _y - player.y
length = math.sqrt(dx*dx+dy*dy);

dx = (dx/length)
dy = (dy/length)

player.x = (player.x + dx * player.speed)
player.y = (player.y + dy * player.speed)
end

--============================================================
love.graphics.setBackgroundColor(255, 255, 255);
end

function love.update(dt)

end

function love.draw()
player.draw();
end

function love.mousepressed(x, y, button)
if love.mouse.isDown(button) and button == "l" then
player.move_to(x, y)
end
end


Qcode
Party member
Posts: 170
Joined: Tue Jan 10, 2012 1:35 am

### Re: Mouse moved character

You have the love.mouse.isDown part down correctly, but the thing is mousepressed is only triggered once for each individual click. For continuous movement, you want it checking every single frame. So to fix this you can completely remove love.mousepressed, and add this into love.update instead:

Code: Select all

function love.update(dt)
if love.mouse.isDown("l") then --Check every frame if left mouse button is down
local mousex, mousey = love.mouse.getPosition() --Get mousex and mousey because it's not given to us
player.move_to(mousex, mousey)
end
end
I'd also recommend using dt in your player movement calculations, if you weren't considering that already. Just multiply any speeds you use by dt to make sure that calculations are in pixels/second instead of pixels/frame (because variable frame rate would alter speed/second).

dominicus
Prole
Posts: 4
Joined: Tue Sep 08, 2015 8:21 pm

### Re: Mouse moved character

Thanks works like a charm... btw now I can use dt

Prole
Posts: 9
Joined: Thu Apr 17, 2014 10:17 pm

### Re: Mouse moved character

There is another way to get the player to move with a different technique. This one causes the player to move with a single click, rather than holding down the mouse button. You just have to add a couple variables (note: there may be a more elegant solution )

Code: Select all

player = {}
player.image = "@";
player.x = 0
player.y = 0

player.newX = 0 -- ADDED A TARGET FOR THE PLAYER
player.newY = 0 -- X AND Y (THESE GET CHANGED BY THE love.mousepressed (x,y, button) FUNCTION)

player.speed = 100/20

player.moving = false -- A BOOLEAN TO CHECK IF THE PLAYER SHOULD BE MOVING OR NOT. ALSO SET BY ...mousepressed ()... AND USED IN player.move_to ()

function player.draw()
love.graphics.print(player.image, player.x, player.y);
end
function player.move_to(_x, _y, dt) -- NOTICE YOU CAN ADD dt HERE, SINCE WE'LL CALL THIS IN love.update(dt) NOW
dx = _x - player.x
dy = _y - player.y
length = math.sqrt(dx*dx+dy*dy);

dx = (dx/length)
dy = (dy/length)

if player.moving == true then -- IF THE PLAYER SHOULD BE MOVING THEN...
player.x = (player.x + dx * player.speed)
player.y = (player.y + dy * player.speed)
else -- IF IT SHOULD STOP (REACHED NEW DESTINATION ALREADY)
player.x = player.x
player.y = player.y
end
end

--============================================================
--love.graphics.setBackgroundColor(0, 255, 255);
end

function love.update(dt)

player.move_to(player.newX, player.newY, dt) -- INCLUDE THIS IN UPDATE, TO CHECK EVERY TICK

--[[if love.mouse.isDown("l") then --Check every frame if left mouse button is down
local mousex, mousey = love.mouse.getPosition() --Get mousex and mousey because it's not given to us
player.move_to(mousex, mousey)
end]]
end

function love.draw()
player.draw();
end

function love.mousepressed(x, y, button)
if love.mouse.isDown(button) and button == "l" then

player.moving = true -- INSTEAD OF ACTUALLY MOVING THE PLAYER, WE CAN TELL move_to THAT THE PLAYER SHOULD MOVE NOW
player.newX = x        -- GIVE THE X
player.newY = y       -- AND Y DESTINATIONS
else
player.moving = false -- OR JUST DO NOTHING IF THE MOUSEBUTTON IS NOT PRESSED
end
end

PS. I didn't have a player image handy, so I changed the image to an @ symbol, and turned off the background color! Thanks for the initial code, I was coming at it in a confusing way before!

### Who is online

Users browsing this forum: No registered users and 35 guests