# Detecting when a moving Sprite is touched

Hi! I have this simple code which moves a Sprite back and forwards from the left to the right of the screen:

``````function setup()

tweenObject =  vec3(WIDTH/4,HEIGHT/2,0)

tween(4,tweenObject, {x = WIDTH/2+500,
y = HEIGHT/2,
z = 0},
{easing = tween.easing.quintInOut,
loop = tween.loop.pingpong})
end

function draw()
background(0, 0, 0, 255)

strokeWidth(5)
pushMatrix()

translate(tweenObject.x,tweenObject.y)
rotate(tweenObject.z)

sprite("Platformer Art:Block Brick", 0,0,100,100)

popMatrix()

end
``````

I want to detect when the Sprite is touched, and if it is touched before reaching the right part of the screen, to go back to the left part from wherever it was touched. I plan to have several of these sprites in different parts of the screen, so just touching the screen anywhere would not work, does anybody have an idea how to do that?

@DrSurname One way is to determine the size of a circle that would fit around the sprite. Then you can detect anytime the screen is touched within that circle with a little calculation using the x,y position of the sprite.

PS Since your sprite is a square, you can use the size of the square instead of a circle.

@dave1707 But how can I calculate the x and y position of the Sprite?

@DrSurname - if you are calculating sprite x and y values in the sprite call you can’t. But if you calculate the x and y positions in variables and use the variables in the sprite call you can.

Could you please give me an example in code? I’m not sure how to do that

@DrSurname You don’t have to calculate the x,y values of the sprite, the tween is doing that for you. To get the x,y values of the sprite, use tweenObject.x and tweenObject.y . You may not want to use tween for moving the sprites because you can’t easily change the direction of a tween that I know of. I’ll have to check on that to be sure. Here’s an example not using tween.

``````function setup()
x,y=0,HEIGHT/2
xv=5
end

function draw()
background(40, 40, 50)
sprite("Platformer Art:Block Brick",x,y)
x=x+xv
if x<0 or x>WIDTH then
xv=-xv
end
end
``````

@drsurname - just search the forum, lots of examples - look at these posts.

@DrSurname Here’s something else.

``````displayMode(FULLSCREEN)

function setup()
tab={}
for z=1,9 do
table.insert(tab,vec3(0,z*80,math.random(3,6)))
end
end

function draw()
background(40, 40, 50)
for a,b in pairs(tab) do
sprite("Platformer Art:Block Brick",b.x,b.y)
b.x=b.x+b.z
if b.x<0 or b.x>WIDTH then
b.z=-b.z
end
end
end

function touched(t)
if t.state==BEGAN then
for a,b in pairs(tab) do
if t.x>b.x-35 and t.x<b.x+35 and t.y>b.y-35 and t.y<b.y+35 then
b.z=-b.z
end
end
end
end
``````

@dave1707 - neat little demo.

@DrSurname Here’s a little game that might help you. The object is to get all the UFO’s going in the same direction by tapping on the one you want to reverse direction. If you get them going in the same direction, the number increases by 1. It starts with 2 UFO’s. The count doesn’t increase if all the UFO’s are going in the same direction because some bounced off a side. I made it to a count of 11, but couldn’t go farther.

``````displayMode(FULLSCREEN)

function setup()
cnt=2
setup1()
end

function setup1()
delay=0
size=HEIGHT//cnt
tab={}
for z=1,cnt do
sp=0
while sp==0 do
sp=math.random(-6,6)
end
table.insert(tab,vec3(WIDTH/2,z*size-size/2,sp))
end
end

function draw()
background(142, 223, 212, 255)
for a,b in pairs(tab) do
sprite("Space Art:UFO",b.x,b.y,size)
b.x=b.x+b.z
if b.x<0 or b.x>WIDTH then
b.z=-b.z
tch=false
end
end
getDirection()
fontSize(30)
fill(255,0,0)
text(#tab,WIDTH/2,HEIGHT/2)
end

function touched(t)
if t.state==BEGAN then
for a,b in pairs(tab) do
if t.x>b.x-size/2 and t.x<b.x+size/2 and t.y>b.y-size/2 and t.y<b.y+size/2 then
b.z=-b.z
tch=true
end
end
end
end

function getDirection()
dir=0
for a,b in pairs(tab) do
if b.z>0 then
dir=dir+1
end
end
if dir==0 or dir==#tab then
if tch then
tch=false
cnt=cnt+1
setup1()
end
end
end
``````