I just use the platform behavior to swim.
I have a boolean called Swimming that sets to True when I'm overlapping water, and False when I'm not. When Swimming is True, I change gravity to 0 and mess with the Platform Behavior's vector-y. Left and right movement works the same as not in water, so I don't have to change that.
One key thing I do is that I NEVER use the "jump" action at all in my game, I always just "set vector-y" to something (same effect as pressing jump). So when I'm in water and gravity is 0, pressing up sets vector-y to -250 and pressing down sets it to 250.
Then I have one more event that triggers every 0.01 seconds that NEITHER up nor down are pressed in water: If vector-y is greater than zero, subtract 50, and if it's less than zero, add 50. That way, my character will slow down and stop when I let go of up or down.
This method prevents me from having to add two movement behaviors to my character; I just don't like that.
As an added bonus, I have a sprite indicating the top of the water. If my character is overlapping that and up is pressed, I set vector-y to -600 so that she pops out of the water. It's not necessary but I think it adds a really nice little touch.
Here's a screenshot of the event sheet:
Hi , please can you post an example capx of that?