Page 1 of 2
Newbie has a few basic questions
Posted: Fri Jan 07, 2011 9:50 am
by radianc3
Hi guys and girls!
I'm new to LÖVE/LUA and started yesterday trying a few things. Now i have some questions because i couldn't find anything on the forum (may i haven't tried hard enough). I hope this is the right forum place for my thread.
Question 1:
I've a picture and can move it with the up, down, left, right keys. Thats fine, but how can i avoid it running out of the screen (e.g. its 640x480 resolution) when its moving?
Question 2:
How can i change the image depending on which direction the "player" moves? I tried some things but it didn't work (well).
Question 3:
Simple Animations. How do they work? Is there any Tutorial you know or some small code examples?
Question 4:
Simple collision detection. Same as above. Is there any Tutorial you guys know or some small code examples?
Ah yes, heres my little code and thx in advance!
Code: Select all
function love.load()
image = love.graphics.newImage("cake.png")
music = love.audio.newSource("polka.mp3")
love.audio.play(music)
playerX = "190"
playerY = "190"
love.graphics.setBackgroundColor(255,255,255)
end
function love.draw()
love.graphics.draw(image, playerX, playerY)
end
function love.update(dt)
if love.keyboard.isDown("right") then
playerX = playerX + 0.5
end
if love.keyboard.isDown("left") then
playerX = playerX - 0.5
end
if love.keyboard.isDown("up") then
playerY = playerY - 0.5
end
if love.keyboard.isDown("down") then
playerY = playerY + 0.5
end
end
Re: Newbie has a few basic questions
Posted: Fri Jan 07, 2011 10:08 am
by bartoleo
Question 1:
I've a picture and can move it with the up, down, left, right keys. Thats fine, but how can i avoid it running out of the screen (e.g. its 640x480 resolution) when its moving?
before you change X or Y in love.update
test them against 0 and love.graphics.getWidth( ) or love.graphics.getHeight( )
Question 2:
How can i change the image depending on which direction the "player" moves? I tried some things but it didn't work (well).
load one image for each direction
have a variable for direction
use it on love.draw
change it on love.update when changing x or y
Question 3:
Simple Animations. How do they work? Is there any Tutorial you know or some small code examples?
switch images
or use
http://love2d.org/wiki/AnAL
Question 4:
Simple collision detection. Same as above. Is there any Tutorial you guys know or some small code examples?
there are many topics in forum...
search
Re: Newbie has a few basic questions
Posted: Fri Jan 07, 2011 8:32 pm
by radianc3
Thanks so far. I'm a lil step further now but i still have some problems with the running out of the window thing.
I tried to get rid of the problem by setting the playerSpeed to Zero, but that didn't work good.
Then i tried the method to set the player to the love.graphics.getWidth position but i also failed at it. Just got some errors on that cuz my syntax was wrong or something, dunno exactly.
At last i tried a third method by just putting the player on the opposite side (e.g. he runs out right and comes back from the left). It worked, but only for one side. If i move the player out on the left side to appear on the right he gets stuck cuz of the check if he is running out on the right.
Maybe someone can help me with that or show me an simple example, please?
And the AnAl thing for animations didn't work for me. I tried the code snippet shown there with the same image but i only received an error message. Something with (nil), whatever it is. Do i have to use the AnAl library and integrate it as resource in my main.lua?
Thanks in advance and here is my 'updated' code again.
Code: Select all
function love.load()
-- Spieler Grafiken
image1 = love.graphics.newImage("cake_right.png")
image2 = love.graphics.newImage("cake_left.png")
-- Den Spieler als Variable definieren um die Spielergrafiken
-- ändern zu können
player = image1
-- Die Hintergrundmusik
music = love.audio.newSource("polka.mp3")
love.audio.play(music)
-- Startposition des Spielers auf X und Y Achse
playerX = "288"
playerY = "202"
playerSpeed = "0.5"
-- Spielfeldgröße zum abfragen
screenX = love.graphics.getWidth()
screenY = love.graphics.getHeight()
-- Hintergrundfarbe "weiss"
love.graphics.setBackgroundColor(255,255,255)
end
function love.draw()
-- laden der Spielergrafik
love.graphics.draw(player, playerX, playerY)
end
function love.update(dt)
-- Festlegen der Bewegungstasten und ändern des Spielerbilds
-- je nach Laufrichtung durch die Variable player
if love.keyboard.isDown("right") then
playerX = playerX + playerSpeed
player = image1
end
if love.keyboard.isDown("left") then
playerX = playerX - playerSpeed
player = image2
end
if love.keyboard.isDown("up") then
playerY = playerY - playerSpeed
end
if love.keyboard.isDown("down") then
playerY = playerY + playerSpeed
end
-- Abfragen der Position des Spielers um nicht aus dem
-- Bild laufen zu können
if playerX == screenX - 64 then
playerX = 0 - 64 elseif
playerY == screenY - 64 then
playerY = 0 - 64
end
end
Re: Newbie has a few basic questions
Posted: Fri Jan 07, 2011 9:07 pm
by tentus
I'm just eyeballing your code, but it seems like this should help:
Code: Select all
function love.load()
-- Spieler Grafiken
image1 = love.graphics.newImage("cake_right.png")
image2 = love.graphics.newImage("cake_left.png")
-- Den Spieler als Variable definieren um die Spielergrafiken
-- ändern zu können
player = image1
-- Die Hintergrundmusik
music = love.audio.newSource("polka.mp3")
love.audio.play(music)
-- Startposition des Spielers auf X und Y Achse
playerX = "288"
playerY = "202"
playerSpeed = "50"
-- Spielfeldgröße zum abfragen
screenX = love.graphics.getWidth()
screenY = love.graphics.getHeight()
-- Hintergrundfarbe "weiss"
love.graphics.setBackgroundColor(255,255,255)
end
function love.draw()
-- laden der Spielergrafik
love.graphics.draw(player, playerX, playerY)
end
function love.update(dt)
-- Festlegen der Bewegungstasten und ändern des Spielerbilds
-- je nach Laufrichtung durch die Variable player
if love.keyboard.isDown("right") then
playerX = playerX + (playerSpeed * dt)
player = image1
end
if love.keyboard.isDown("left") then
playerX = playerX - (playerSpeed * dt)
player = image2
end
if love.keyboard.isDown("up") then
playerY = playerY - (playerSpeed * dt)
end
if love.keyboard.isDown("down") then
playerY = playerY + (playerSpeed * dt)
end
-- Abfragen der Position des Spielers um nicht aus dem
-- Bild laufen zu können
if playerX > screenX then
playerX = -64
elseif playerX < -64 then
playerX = screenX
end
if playerY > screenY then
playerY = -64
elseif playerY < -64 then
playerY = screenY - 64
end
end
I split the X and Y if statements apart and also broke each one into a greather than and less than statement. If the player goes past the width the screen, he'll switch to -64, meaning that in a second he'll loop back around. Same idea for the Y axis.
I also multiplied your speed by dt, which means that you'll move at a constant rate independent of framerate. Get familiar with dt, it's very useful!
Re: Newbie has a few basic questions
Posted: Fri Jan 07, 2011 9:29 pm
by radianc3
Uh nice, thx for that info. I totally forgot about the bigger and smaller comparisons. But now another problem appears.
Error
Attempt to compare number with string.
But there isn't any string there`?!
Ah i got it now. When i defined the screen vars i didi it as string.*facepalm*
Working pretty fine now!
Re: Newbie has a few basic questions
Posted: Sat Jan 08, 2011 12:54 am
by tentus
Ooh, be sure to make your speed not a string too, I completely overlooked that.
Something else you may want to look into is how you are handling the player pressing both left and right at once. You'll probably need a nested if statement to create a logical behavior. Food for thought.
Re: Newbie has a few basic questions
Posted: Wed Mar 02, 2011 7:25 am
by obur
thanks for help, mate, but i have another question about that.
i figured out the above solution, and used it. however, i thought about adding a third image when there's no motion(action). like when the character is not moving. to clarify:
image1 -> when the object is moving right / pressed to "right"
image2 -> when the object is moving left / pressed to "left"
image3 -> when the object is standing still / pressed to nothing / no action / no movement
so, i thought that i can assign a variable for that. something like a sentinel(flag). i created a variable in love.load(), called motion. and assigned 0 into it. when there's no movement, my sentinel will be 0, whereas if there's a movement (user presses right, left, up, or down) the sentinel will be 1.
and i checked the sentinel variable in love.update(). however, i failed. i even tried "if love.keypressed("") then obj = img3; end" kind of stuff, and failed again.
so, what must i do? now i'm thinking about adding a timer and checking whether if there's a movement for let's say 10ms, then change my object's image as image3.
thanks for everything.
Re: Newbie has a few basic questions
Posted: Wed Mar 02, 2011 8:34 am
by nevon
obur wrote:so, what must i do? now i'm thinking about adding a timer and checking whether if there's a movement for let's say 10ms, then change my object's image as image3.
There are plenty of ways to solve this. One simple way would be to give your player a state variable and then do something like this:
Code: Select all
function love.load()
--First we initialize all the state images that we need
images = {
idle = love.graphics.newImage("images/idle.png"),
left = love.graphics.newImage("images/left.png"),
right = love.graphics.newImage("images/right.png)
}
--And here's our player object, complete with a state variable and a variable that holds the current image.
player = {
state = "idle",
image = images["idle"],
x = 500,
y = 300,
speed = 100
}
end
function love.update(dt)
--Now what we do is we check for a button to be pressed, and if it is we set the player state and move the player.
if love.keyboard.isDown("a") then
player.state = "left"
player.x = player.x - player.speed*dt
elseif love.keyboard.isDown("d") then
player.state = "right"
player.x = player.x + player.speed*dt
else
--If no button is being pressed, we just set the player state to idle
player.state = "idle"
end
--Now we update the player image with whatever image corresponds to the current state.
player.image = images[player.state]
end
function love.draw()
--And finally we draw the player.
love.graphics.draw(player.image, player.x, player.y)
end
Re: Newbie has a few basic questions
Posted: Wed Mar 02, 2011 12:58 pm
by obur
i löve you! i really löve you!
oh, but there's a problem. i'm making 2 different if statements for walking in 2 directions at the same time. like going up and right at the same time. however, if i make 2 different if statements in here, one of them will drop to else all the time.
Code: Select all
if (up)
go up;
else if (down)
go down;
if (right)
go right;
else if (left)
go left;
now, if i make only 1 if statement, i can't go in 2 directions at the same time.
by the way, do you know why my previous idea didn't work? i mean that sentinel stuff. thanks again
Re: Newbie has a few basic questions
Posted: Wed Mar 02, 2011 5:08 pm
by Robin
I'm sorry, what is your question?