# Need help with an algebraic glitch in my programming

• 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))

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.

• 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'.

• 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.

• 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.

• ## Try Construct 3

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

Construct 3 users don't see these ads
• 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 )))))