# [SOLVED]How do I constrict/expand?

Get help using Construct 2

### » Tue Jul 07, 2015 11:18 am

Hello World,

So lets say I have a rhomb shape on the background and then a bunch of balls on top of it outlining and filling it.
How would I go about making those balls constrict/shink to the center of the rhomb, and then expand back to their original position from the center of the rhomb? Would this effect be applied to the rhomb shape and have the balls pinned to it, would it be applied to the balls, or how do I do it?

Thank you.

P.S. Keep in mind that(for other reasons) those balls will olso have the physics behavior on them. I don't know if this matters or not, but I figured I'd trow it in there just in case there is a chance that what you are about to suggest might conflict with the physics behavior, cause that one is there to stay.
P.S.S Olso I would like that constrict/expand effect to happen ad infinitum, not just once, regardless of what happens to some of the balls(like if some get destroyed for example). I say this just in case there isn't a easy way to do it with a behavior or effect or something(like the rotate behavior for example), and in case I have to manually do it with events, those events have to loop continuously.
Last edited by VIKINGS on Wed Jul 08, 2015 4:16 pm, edited 2 times in total.
B
21
S
11
G
6
Posts: 414
Reputation: 5,335

### » Tue Jul 07, 2015 12:04 pm

i am not entirely sure but i think pin would not work here, as the rhomb does not move...
my approach would be to set the oject scale of the balls and move them closer to the center...
something like

Code: Select all
`each x seconds  balls set scale to balls.scale -0.05                balls move 1px at angle angle(balls.x,balls.y,rhomb.x,rhomb.y) `

but thats when the balls are not in motion... you can also try to use a force on the balls directing to the center of the rhomb and as closer they get the lower is the scale
Code: Select all
`balls set scale to distance(balls.x,balls.y,rhomb.x,rhomb.y)/100`

hope that helps
kind regards
Patrick
B
23
S
8
G
1
Posts: 225
Reputation: 2,757

### » Tue Jul 07, 2015 1:10 pm

The first one has 2 problems:
1. There is no .scale as far as I can see that I can add in the expression "set scale balls.scale"
2. While the movement part does seem to do what I want, it doesn't adress the part that once they reach the center of the rhomb I want them to expand/move back to their original position.

The second suggestion doesn't work at all for what I want. Because if I set it like that then the balls that are farther from the center start way bigger then the rest. I need all of them to start/end at the size that I originally set them to.

Any other ideas guys?

P.S. Sorry if I'm not explaining it too well guys, it's the damn heat!! After every 2 letters typed I have to stop to wipe the sweat from my brow.... I can't work like this!!!:( So let me know which parts are unclear and I'll try to do a better job at explaining them.
B
21
S
11
G
6
Posts: 414
Reputation: 5,335

### » Tue Jul 07, 2015 1:28 pm

regarding the 2nd suggestiion you can also work with distance traveled (set the starting xy for each ball and calculate the distance to the current position) or with the proportion of that to the distance to the rhomb its just math XD can you provide a capx?
B
23
S
8
G
1
Posts: 225
Reputation: 2,757

### » Tue Jul 07, 2015 1:49 pm

Yeah.... If there's one thing I hate in this world it's math mate!! Funny how I got into game development considering. Guess that's the magic of programs like C2, hide that ugly math as much as possible!!!:P

Sure, here's a basic capx. Things to keep in mind:
1. You can look but you can't touch when it comes to the physics behavior. That's how it is in my game and that's how it has to stay.
2. The rhomb can be resized and made bigger in case you need more space for whatever you come up with, but I'd really rather we not mess with the initial size of the balls.

https://www.dropbox.com/s/597trf9v7b1a5 ... .capx?dl=0
B
21
S
11
G
6
Posts: 414
Reputation: 5,335

### » Tue Jul 07, 2015 2:37 pm

i dont think this is perfectly possible or even usefull as all objects check for collission and collide with each other... i think i cant be of much help here, as i dont get the use of it

some approach:
https://drive.kyberon.net/index.php/s/1FPhBAiihCmSqnJ pw: test

sorry i couldnt be of more help here, but i would suggest to approach this from another direction

regards
Patrick
B
23
S
8
G
1
Posts: 225
Reputation: 2,757

### » Tue Jul 07, 2015 3:26 pm

Well, thank you for trying mate.
Anyone else?
B
21
S
11
G
6
Posts: 414
Reputation: 5,335

### » Tue Jul 07, 2015 4:36 pm

Instance variables of each ball:
sizex <- width
sizey <- height
startx <- sprite.x at start
starty <- sprite.y at start

You probably know the center of your rhomb in x and y too. So the movement and size can be tweened quite simply back and forth. There are behaviors that do it, like LiteTween (behavior-litetween_t70700) or you can do it by yourself with the event system and some simple expressions (http://gizma.com/easing/ for reference).

Be aware that they will necessarily touch each other, if they all reach the center of the rhomb, so you might want to stop a tiny bit earlier.
You can try to tweak the size reduction yourself (let it reach "0" a bit earlier than finishing the movement), or do the math and check how large (relative to starting size) each ball can be along the timeline.

I'm not sure how moving the balls via events by setting the position interacts with the physics behavior. Maybe there are problems or even easier solutions I am not aware off - I have not used the physics behavior so far.
Visual Novel 'Engine' in 100 Events
if you ever have to choose between buying Construct 2 on scirra.com or on Steam, read this: Review
B
22
S
9
G
1
Posts: 788
Reputation: 3,788

### » Tue Jul 07, 2015 9:56 pm

This should do it if you give the balls two instance variables dx and dy:
Code: Select all
`start of layout:--- ball: set dx to self.x-rhomb.x--- ball: set dy to self.y-rhomb.yglobal number t=0every tick:--- set t to cosp(1, 0.5, time)--- ball: set x to rhomb.x+lerp(0,self.dx,t)--- ball: set y to rhomb.y+lerp(0,self.dy,t)--- ball: set size to (lerp(0,32,t), lerp(0,32,t))`

The cosp() equation is the only one you'd need to tweak.
With cosp(1, 0.5, time) it will take one second to go from full size (32,32) to half size (16,16), and another second to go back to full size.

1 is full size and 0.5 is half. You can change those.
You can make it go twice as fast if you multiply time by 2. To make it half as fast multiply by 0.5.
B
95
S
34
G
128
Posts: 5,495
Reputation: 81,678

### » Wed Jul 08, 2015 3:55 pm

Hahaha, that's perfect @R0J0hound !! Just what I needed. Where you guys come up with those stuff(like cosp for example) I'll never understand.
But it works, so thank you very very much.

And thank you too @mindfaQ , I downloaded the behavior but haven't tried it yet. For whatever reason I decided to go from end to start(I'm weird like that) so I ended up trying R0J0hounds suggestion first, and since it works I'm gonna stick with it for now.
But I am gonna test that behavior too, and even if I don't end up using it now, knowing of it's existence is sure to prove usefull one day.

Thank you all again.^^
B
21
S
11
G
6
Posts: 414
Reputation: 5,335

Next