move_and_collide()
is the basic movement method for kinematic bodies. It attempts to move the body along the given vector, stopping if it collides with another body. If a collision happens, it returns a collision object containing the details.
move_and_slide()
was designed as a special case, because a common use case was to calculate a slide vector along the collision. However, because it slides, it's possible for there to be more than one collision in a frame (think when you hit a corner between the floor and the wall. For this reason, it can't return a collision, so you need to use the get_slide_collision()
method to retrieve the details. Fun fact: move_and_slide()
calls move_and_collide()
internally to process the movement.
Both take a vector for the movement, but move_and_collide()
, being the more basic method, is just the frame-based (ie multiplied by delta
) movement vector. move_and_slide()
, however, takes the pre-delta velocity (yes, this can be confusing).
Hopefully that clarifies it at least somewhat questions 1-3.
As for #4, what is melting your brain about vectors? Have you read this:
https://docs.godotengine.org/en/3.0/tutorials/math/vector_math.html ? I think it's a pretty good overview of the topic specifically applied to its use in games.