# touch and drag actor

Member, PRO Posts: 604

So, I've been working on trying to put something together where I press and hold an actor and drag it along the screen, when I let it go I want it to slide back to its original position.

I have the basics down, when actor is pressed constrain x and y position to the mouse position
when touch is released I interpolate the actor back to its original position.

This all works fine and dandy, but I don't like the way the constrain X and Y attribute looks when Im dragging the actor around, its too precise and doesn't have a good ascetic appeal. I would like for it to have a tiny bit of a lag (just like when you are moving app icons around on the iPhone home screen).

Ive tried "move to" but it causes some issues with the actor interpolate back to original position.

Anyone have a good method from dragging an actor?

• Member Posts: 797

When touch is pressed use a timer. Every 0.2 constrain attribute x and y to mouse

• Member Posts: 1,276

Try something like this.

Mental Donkey Games

• ImagineLabs.rocks Member, BASIC Posts: 5,718

• London, UK.Member Posts: 12,822
edited October 2015

@Player_E said:
Anyone have a good method from dragging an actor?

There are numerous ways to do this, here's another one . . . .

When touch is pressed
--Constrain self rotation to: vectorToAngle(Mouse X-self X, Mouse Y-self Y)
--Move: Dir 0°: Relative - Actor: Speed: magnitude(Mouse X-self X, Mouse Y-self Y)*2

The '*2' part controls the smoothness. *1 is smooth as butter, *10 is more reactive, but still takes the mechanical edge off a direct constrain to mouse.

I've included a picture of some butter to help you imagine how smooth *1 is:

• London, UK.Member Posts: 12,822
edited October 2015

Here's another method:

When touch is pressed
--Constrain Linear Velocity X to 5* (mouse X - self X )
--Constrain Linear Velocity Y to 5* (mouse Y - self Y )
--Constrain Rotation to vectorToAngle(Linear Velocity X, Linear Velocity.Y )
. . . . . . . .
Otherwise
--Change attribute Linear Velocity X to 0
--Change attribute Linear Velocity Y to 0

• Member Posts: 797

@Socks! That looks very smooth!

• Member Posts: 797

@Player_E... there are a lot of answers for you

• London, UK.Member Posts: 12,822

@jdlcrater said:
Socks! That looks very smooth!

It's the smoothest drag in the whole of the app world, it's used extensively in butter related apps.

• London, UK.Member Posts: 12,822

P.S . . . . . for the first version I posted above, this one . . .

When touch is pressed
--Constrain self rotation to: vectorToAngle(Mouse X-self X, Mouse Y-self Y)
--Move: Dir 0°: Relative - Actor: Speed: magnitude(Mouse X-self X, Mouse Y-self Y)*2

. . . the slide back to its original position would be placed in the otherwise section and would look like this:

When touch is pressed
--Constrain self rotation to: vectorToAngle(Origin X-self X, Origin Y-self Y)
--Move: Dir 0°: Relative - Actor: Speed: magnitude(Origin X-self X, Origin Y-self Y)*2

(Origin X and Origin Y are the coordinates for where you want it to return to)

• Member, PRO Posts: 604

Awesome guys!

I posted right before walking out the door for work, but glad there are so many other options.

I'll check them out tonight asap!

Thanks again

• London, UK.Member Posts: 12,822
edited October 2015

@Player_E said:
Awesome guys!

I posted right before walking out the door for work, but glad there are so many other options.

Here's another, a slightly slimmed down version of the above (all these variations offer different advantages / options):

When touch is pressed:
--Move:
----Dir: vectorToAngle(mouse X - self X, mouse Y - self Y)
----Speed: magnitude (mouse X - self X, mouse Y - self Y) *2
. . . . . . . . . . . . . . . .
Otherwise: (spring back to starting position)
--Move:
----Dir: vectorToAngle(Origin X - self X, Origin Y - self Y)
----Speed: magnitude (Origin X - self X, Origin Y - self Y) *10

(spring back looks better when the multiplier (the '*10' part) is bigger in the otherwise section than in the main section)

• Member Posts: 644

AaaaaaaAAAaa

• Member, PRO Posts: 604
edited October 2015

Thanks for all the help guys.

I went with the last method you posted socks, but in the otherwise section, I left the interpolate rules. I like the way those look

• Member, PRO Posts: 35

When moving multiple people at the same time, it goes to touch 1 which is actor 1. When I changed it to touch 2, it works fine. However, when I released the touch on actor 1, actor 2 goes crazy and glitches in the scene.

• Member, Sous Chef, PRO, Senior Sous-Chef Posts: 11,945

@Titanical Tech Production That's not enough information to solve the issue you're having. We'd need to know what rules you're using for each actor related to touch.

New to GameSalad? (FAQs)   |   Tutorials   |   Templates   |   Greenleaf Games   |   Educator & Certified GameSalad User

• Member, PRO Posts: 35

Here is a screenshot of the rules. I took @Socks suggestion except changed the mouseX and MouseY to TouchX and TouchY.

• Member, PRO Posts: 35

By the way it is applied to both actors.

• Member, Sous Chef, PRO, Senior Sous-Chef Posts: 11,945

The most important part of that screenshot is... hidden:

You can either click on the 'e' symbols and take another screenshot or just click on the 'e' symbols and then highlight each expression and copy and paste them (as text) into a comment.

New to GameSalad? (FAQs)   |   Tutorials   |   Templates   |   Greenleaf Games   |   Educator & Certified GameSalad User

• Member, PRO Posts: 35
edited November 2018

( game.Touches.Touch 1.X - self.Position.X ) * 10
( game.Touches.Touch 1.Y - self.Position.Y ) * 10
This is applied for both player 1 and player 2

• Member, Sous Chef, PRO, Senior Sous-Chef Posts: 11,945

So the player 2 actor uses game.Touches.Touch 2.X and Y?

New to GameSalad? (FAQs)   |   Tutorials   |   Templates   |   Greenleaf Games   |   Educator & Certified GameSalad User

• Member, PRO Posts: 35

Yes and what happens is when I let go of touch 1 then the AI cannot think and cannot decide which touch is engaged so the actor spins around the scene and causes glitches so the game is unplayable.