# Move camera with 2d object

Hi all,

How can I get the scene ‘camera’ to follow an object as it moves around.

I’ve thought about just trying to move a sprite background but not sure that’s the answer here?

Probably really simple?!

Moving the background would be one approach but I think what you’re looking for is the `translate(x,y)` function Edit: Note it’s cumulative so `translate(20,0) translate(30,0)` is the same as `translate(50,0)`. But you can pass positive and negative values so `translate(50,0) translate(-50,0)` is the same as
`translate(0,0)`.

Also, use resetMatrix() to set the transform back to 0, 0, and pushMatrix() and popMatrix() work like pushStyle() and popStyle().

Here is my rough code.

``````-- physics

-- Use this function to perform your initial setup
function setup()
w1 = physics.body(EDGE,vec2(0,0),vec2(WIDTH,0))
w2 = physics.body(EDGE, vec2(0,0), vec2(0,HEIGHT))
w3 = physics.body(EDGE, vec2(WIDTH, 0), vec2(WIDTH, HEIGHT))

ball_diam = 60
p_ball = physics.body(CIRCLE, ball_diam/2)
p_ball.gravityScale = 0
p_ball.restitution = .8
p_ball.friction =0
-- p_ball.linearVelocity = vec2(math.random(400), math.random(400))
p_ball.x = 100
p_ball.y = 200
vel = "up"
hang = 0
bgy = 100
end

-- This function gets called once every frame
function draw()
-- This sets a dark background color
background(200,200,200,255)
sprite("SpaceCute:Background",p_ball.x,bgy,WIDTH*3,HEIGHT*3)

pushStyle()
fill(255,0,0,255)
if (vel ~= "down" or ball_diam<10) then
ball_diam = ball_diam + 1.5
vel = "up"
bgy = bgy + (1*2.5)
if (ball_diam>=100) then vel = "float" end
end
if (vel== "float") then
hang = hang + 2
ball_diam = 100
if (hang>=101) then
vel = "down"
hang = 0
end
bgy = bgy

end
if (vel == "down") then
ball_diam = ball_diam - 1.5
vel = "down"
if (ball_diam<2) then vel = "up" end
bgy = bgy + (1*1.4)
end

p_ball.y = p_ball.y + 1.5

ellipse(WIDTH/2, HEIGHT/2, ball_diam)

popStyle()

end
``````

I tried the translate code before posting here, but it didn’t work…? Ill have to look up the matrix stuff as I don’t understand it.

This code is a top down view of a ball rising, floating and falling back down to earth for a 2d golf idea I have.

This is kind of on topic. I am animating 2d textures rectangles. I have 200 rectangles in one mesh in one mesh. I am using setRec to change the postions. The reason behind this is less meshs means less draw calls, or would it be better to use a mesh for each object and use translate to move them. Also, not all rectangels are moved each frame

@Thwapp it depends how the performance works out. Moving vertices each frame, even if it’s just a subset probably means the full vertex buffer has to be transfered to the GPU each frame, and this can be expensive. However, a seperate mesh:draw call for each rectangle with translates is a lot of calls. You probably need to benchmark it each way and figure out which is best for you.

Also if they move in a somewhat predictable way, eg if you were using it for several layers with parallax type scrolling you could have a mesh for each “layer” and then translate groups of rectangles…

Alternately if they move in a very predefined way you could get a shader to do the movement such as the shader particle system I build a while back, where you state the start and end positions for a rectangle when it’s added to the mesh, and the shader interpolates it’s position over time.

This kind of optimisation is very context dependant.

Thas is what I thought. I’ll do some tests and I was just looking for a NO never, don"t do that! 