Everything that has been said is good, I'll add one thing though, try to decompose what you want into simple statements, before trying to get them on C2, simple things are the most reliable ones, an exemple:
-"When I press W I want the player to shoot"
-"When I press W" => is it right when you press "W", or it has also other conditions?=>When I press W, no other requirement
-What does "Player to shoot" means?=>I want the player to change his animation, then I want it to spawn an object at a point I defined in the image editor
-What is this object, where should it goes?=>It is a "Bullet" (using the bullet behavior), and it should go in front of the player
-In front? so the angle should be changed if the sprite isn't at a good orientation?=>indeed, if the player is mirrored I'll also change it
It seems like stupid in that case(and maybe not needed), but in more complex events, it can be a real life saver to simplify everything at first, when you know what you want to do in a low level logic, it is easier to write it in conditions/actions.
having events easy to read, and to write, is really good, the readeability part is an important one, but mostly experience will give it to you.