Need help with an algebraic glitch in my programming

Get help using Construct 3!

Post » Fri Jun 02, 2017 6:31 pm

So for my start menu, I'm trying to create a button that vibrates more as the mouse gets closer to the center. My current programming for this is as follows:

X=124+random(-(Mouse.X-160), (Mouse.X-160))
Y=78+random(-(Mouse.Y-90), (Mouse.Y-90))
Image

If you can't make out what all this gibberish means, its purpose is to
Set X to (the button's position) +/- a random number that gets exponentially bigger as the mouse gets closer
Set Y to (the button's position) +/- a random number that gets exponentially bigger as the mouse gets closer

This programming works fine, except the effect I want is inverted. Currently, the button vibrates more as the mouse gets further away, and less as it gets closer, which is the opposite of what I want.
___________________________
UPDATE:
I've sort of fixed the problem by getting the reciprocal of the increments, giving
X = 124+1/(random(-(Mouse.X-160), (Mouse.X-160)))
Y = 78+1/(random(-(Mouse.Y-90), (Mouse.Y-90)))

This does however create a weird glitch where the button moves to really far positions along the axes, so I now need help in fixing that.
Last edited by bilbonianswaggins on Fri Jun 02, 2017 8:13 pm, edited 1 time in total.
B
3
Posts: 6
Reputation: 187

Post » Fri Jun 02, 2017 7:19 pm

There is a range in play here.
If we normalise the range to '0 - 1', things get easier. To do this we use a scale factor.

ScaleFactor = 1 / (max - min)
Since min is zero in your case, ScaleFactor = 1 / max
Max (in your case) = Sprite.LineOfSight.Range
Or .. ScaleFactor = (1 / Sprite.LineOfSight.Range)

Any distance normalised is now DistanceNormalised = (1 / Sprite.LineOfSight.Range) * Distance

Say the Range is = 300 And we are 200 away:
(1 / 300 ) * 200 = 0.666
Say the Range is = 300 And we are 75 away:
(1 / 300 ) * 75 = 0.25

So we clearly now have a value between zero and 1, representing the range (normalised), and it is a small number when closer and bigger when further away. So lets reverse that.

ScaleFactor = (1 - (1 / Sprite.LineOfSight.Range))
or DistanceNormalised = (1 - (1 / Sprite.LineOfSight.Range)) * Distance

Only problem now is that things go negative when out of range.
We solve that by ... DistanceNormalised = max((1 - (1 / Sprite.LineOfSight.Range)),0) * (Distance)

Distance = distance(button.x,button.y,mouse.x,mouse.y)

So we gonna add a small random to the button.X and button.y, that is proportional to DistanceNormalised

random(DistanceNormalised , 0 )

Set button position to ...
x = Button.RestPositionX + (ScalarX * ((random( (max((1 - (1 / Sprite.LineOfSight.Range)),0) * (distance(button.x,button.y,mouse.x,mouse.y))) , 0 ))))
y = Button.RestPositionY + (ScalarY * ((random( (max((1 - (1 / Sprite.LineOfSight.Range)),0) * (distance(button.x,button.y,mouse.x,mouse.y))) , 0 ))))

Choose a value for ScalarX and ScalarY to your liking.

Button.RestPositionX is the position for the button in rest, (else he gonna vibrate off screen) stored in an instance variable 'RestPositionX'.
B
33
S
18
G
28
Posts: 2,493
Reputation: 20,950

Post » Fri Jun 02, 2017 8:02 pm

Thanks for your reply, but using the programming that you've told me to use the button only vibrates towards the bottom right of the screen. I want it to vibrate moving around the center, not in an increasing direction. If you could tell me how to fix it based on my original equation, it would be greatly appreciated.
B
3
Posts: 6
Reputation: 187

Post » Fri Jun 02, 2017 8:12 pm

UPDATE: sort of fixed the problem by getting the reciprocal of the increments, giving
X = 124+1/(random(-(Mouse.X-160), (Mouse.X-160)))
Y = 78+1/(random(-(Mouse.Y-90), (Mouse.Y-90)))

This does however create a weird glitch where the button moves to really far positions along the axes, so I now need help in fixing that.
B
3
Posts: 6
Reputation: 187

Post » Fri Jun 02, 2017 9:35 pm

Ohh you are right.

x = Button.RestPositionX + (choose(1,-1) * (ScalarX * ((random( (max((1 - (1 / Button.LineOfSight.Range)),0) * (distance(button.x,button.y,mouse.x,mouse.y))) , 0 )))))
y = Button.RestPositionY + (choose(1,-1) * (ScalarY * ((random( (max((1 - (1 / Button.LineOfSight.Range)),0) * (distance(button.x,button.y,mouse.x,mouse.y))) , 0 )))))
B
33
S
18
G
28
Posts: 2,493
Reputation: 20,950


Return to How do I...?

Who is online

Users browsing this forum: R0J0hound and 1 guest