1) The animation swap trick is where you have a separate animation in your projectile which has the shape that you want to use when checking for collisions. You then do this:
Always (or some better optimised condition)
-- Bullet: Set animation to 'My Collision Shape'
Bullet Overlaps Backdrop
-- Do your collision detection stuff
Always
--- Bullet: Set animation back to 'Stopped' (or whatever the name of your standard animation is)
Doing this, the player sees the Stopped animation, but the collision detections work on the My Collision Shape animation. It saves you having multiple detector objects, but the down side is that it's harder to control animations for objects like this, because the animation frame gets reset each time you change the animation. That's why it's a good routine for bullets, which usually don't get animated, but not usually a good idea for characters and enemies.
Anyway, about bullets...
The method I use, rightly or wrongly, works this way:
Every bullet has an XPos, YPos, and TargetAngle in its Alterable Values. The XPos and YPos store decimal-point-accurate versions of the object's coordinates, and the TargetAngle is (obviously) the angle that the bullet is firing at. I also make a new Active to keep some values which are global to all bullets, like the distance they jump each loop (the 'Stride' value) and a value called 'Stop'. This last value is either 0 (No) or 1 (Yes). The Stop variable will tell the fastloop to stop, because all bullets have been processed.
I use an infinite fastloop, because I'm silly. Anyway, your loop works basically like this:
Start the Fastloop
Some condition
--- Start Loop 'Bullets' '-1' times (-1 makes it a scary infinite loop. While you test, put a value like 1000 here instead, so if you mess it up you're not stuck looping until Judgement Day)
Tell MMF this will be the last fastloop
On Bullets loop
--- Variables: Set 'Stop' to 1
Move those bullets using trigonometry
On Bullets loop
--- Bullet: Add to XPos variable:
-------- sin( TargetAngle ) * Stride
--- Bullet: Add to YPos variable:
-------- cos( TargetAngle ) * Stride
--- Bullet: Set X Position to value of XPos variable
--- Bullet: Set Y Position to value of YPos variable
Destroy bullets which hit a wall
On Bullets loop
+ Bullet overlaps backdrop
--- Make a spark or something, and a noise
--- Bullet: Destroy
Destroy bullets which hit an enemy
... Use a variation of the previous line, it should be easy to do ...
Check if there are still some bullets left, and if there are, keep the loop going
On Bullets Loop
+ Number of bullets is greater than zero
--- Vars: Set Stop to 0 (Keep the loop going)
If all bullets are gone, kill the fastloop. KaPow.
On Bullets Loop
+ Vars: Stop == 1
--- Stop the Bullets loop.
That should be more or less it. I've not tested the above, so sin() and cos() may be the wrong way round, and there may be some other horrible problem with it, but it's only intended as a guide. The usage of the Stop variable to stop the loop is a little awkward, and not strictly necessary if your loop ends when all the bullets are destroyed like this one does. But I kept it there because it's handy if you need to do a loop which has survivors. MMF is easier at testing whether something IS true, rather than if something ISN'T true, so this is a way I use to get around that. In our case, you could just as easily say 'Have all bullets been destroyed? Stop loop', but where's the fun in that? :p
Anyway, rather than using one loop per bullet, per step, this uses one loop per step, and uses ActionLoops to actually do the moving. So there's the same number of events being run if you fire 1 bullet as if you fire 1000.
Hope that makes sense.