Simple parabola?

  • How would I go about moving an object in a simple parabola from point A to B? No acc/dec, no varying speed, no platform behavior, etc. Just a simple linear tween but with a curve.

    I've searched around but everything I found has bizarre quirks or the above.

    I see the timeline supports bezier curves now but this is for an enemy behavior with dynamic points to jump to so I don't think that'll work either.

  • Let’s see. The simplest way to move in a parabola from one point to another would be to use the qarp expression. Of course you’ll need a third point as well for the middle but we can calculate that with a midpoint between the two points and move it up by some distance such as 100.

    Basically give your enemy five variables: t=1, x0,y0,x1,y1

    On some trigger to start the tween

    — enemy: set t to 0

    — enemy: set x0 to self.x

    — enemy: set y0 to self.y

    — enemy: set x1 to destination x

    — enemy: set y1 to destination y

    Enemy: t <1

    — enemy: set t to min(1, self.t+dt)

    — enemy: set x to qarp(self.x0, (self.x0+self.x1)/2-100, self.x1, self.t)

    — enemy: set y to qarp(self.y0, (self.y0+self.y1)/2, self.y1, self.t)

    Now since this is a parabola the speed will be faster at the start and end than at the middle. Making the speed constant is tricky. The simplest way is to store a list of points and treat it as a polyline. You’d do a loop to move over each line until a specified distance was moved per frame. Alternatively you could store the previous tick location and iteratively adjust t till the new calculated location from qarp is always approximately the same distance from the previous location.

    There is also the math way to do it. I think the terms are function reparameterization to length. It involves calculus with integrals which I’m a bit rusty on. It could simplify to a reasonable equation though. Typically I’ve seen it approximated with the other two methods.

    Or instead of a parabola you could use an arc instead. Arcs can be moved over with constant speed easily. You just need a center.

    Give the enemy these variables: t=1, cx,cy, a, r

    On some trigger

    — enemy: set t to 0

    — enemy: set cx to (self.x+destination.x)/2

    — enemy: set cy to (self.y+destination.y)/2

    — enemy: set a to angle(destination.x, destination.y, self.x, self.y)

    — enemy: set r to distance(self.x,self.y,destination.x,destination.y)/2

    Enemy: t<1

    — enemy: set t to min(1, self.t+dt)

    — enemy: set x to self.cx+self.r*cos(self.a+180*self.t)

    — enemy: set y to self.cy+self.r*sin(self.a+180*self.t)

    That will make the enemy move in a half circle arc. More subtle arcs could be possible too with further tweaks of the equations.

    Also note both methods will complete the motion in one second. To make it complete in say 0.5 seconds change the *dt to *2*dt in the equations.

  • A parabola can describe quite a few final shapes. You mentioned constant speed, so rather than a fixed duration you would have a proportional duration based on distance traveled. Do you care if it swings out to the left or right? How wide do you want your curve? Will the width vary depending the distance traveled as well, or fixed?

    After giving this a shot, the problem is harder than it seems... especially considering the distance traveled is also affected (non linearly) by the shape of the curve, making it difficult to get a fixed speed across all situations as far as lerp and qarp are concerned. Tween also has difficulties when non linear factors come into play. Maybe I can try again with custom movement.

  • rojohound Thank you so much! You never fail to impress with this stuff. I think the arc is more in line with what I'm thinking. Forgive my terminology my math is (obviously) quite rusty as well. I'll give this a shot soon.

    oosyrag I will try r0j0hound's method but yes ideally the object will move accurately and at a constant rate from A to B with C being the curve. All 3 points will be adjustable (but not during motion). I think bezier curve or arc might be more appropriate terms.

  • Try Construct 3

    Develop games in your browser. Powerful, performant & highly capable.

    Try Now Construct 3 users don't see these ads
  • R0J0hound can you explain how and why this works? I mean I plugged it in and it works exactly as you say. The object moves in 180 arcs until it reaches the end destination.. But why? Can you walk through the code and explain what is happening?

    Give the enemy these variables: t=1, cx,cy, a, r

    On some trigger

    — enemy: set t to 0

    — enemy: set cx to (self.x+destination.x)/2

    — enemy: set cy to (self.y+destination.y)/2

    — enemy: set a to angle(destination.x, destination.y, self.x, self.y)

    — enemy: set r to distance(self.x,self.y,destination.x,destination.y)/2

    Enemy: t<1

    — enemy: set t to min(1, self.t+dt)

    — enemy: set x to self.cx+self.r*cos(self.a+180*self.t)

    — enemy: set y to self.cy+self.r*sin(self.a+180*self.t)

    That will make the enemy move in a half circle arc. More subtle arcs could be possible too with further tweaks of the equations.

    Also note both methods will complete the motion in one second. To make it complete in say 0.5 seconds change the *dt to *2*dt in the equations.

  • theseanmullins

    To move along the arc it is just moving along a circle. And you can do that with a bit of trig with:

    X = radius*cos(angle) +centerX

    Y = radius*sin(angle) +centerY

    So basically the code calculates the radius and center from the start and end positions.

    Angle is the angle from the center to the start point, which is then gradually changed to the angle to the end point. Basically a lerp, but I do it here with t. we make t go from 0 to 1 and stop at 1.

    Angle = startAngle +180*t

  • R0J0hound I really appreciate that you took the the time to explain this. Unfortunately, I did what I should have done before I posted which was search and study what was going on. I actually drew a grid on paper and worked it out to see what was going on. Thank you for your time though!

  • R0J0hound

    Very Usefull for the Comunity , Ive been looking for this a long time , Thanks

Jump to:
Active Users
There are 1 visitors browsing this topic (0 users and 1 guests)