I created a test applet to try and recreate the problem using the code as posted above.
http://www.paulscode.com/source/ShipFireProblem/As you can see from this applet, both test cases I listed in my last post are successful. This means that the align() and moveTowards() methods work fine. The problem must be coming from somewhere else in your code, after you have placed the laser and laserTarget.
What else is happening behind the scenes in your program (how is the ship being rotated, etc)? This really is a puzzling bug!
I also uploaded the source code for the above applet, but I doubt it will help much. It is basically everything previously posted here plus methods to create the ship object and rotate it with the mouse, etc:
http://www.paulscode.com/source/ShipFireProblem/ShipFireProblem.java-- UPDATE --
When I created the above applet, I accidentally left out the following line:
laser1.addChild( laserTarget1 );
When I went back and added this line, the exact problem you described is showing up. Here is another test applet demonstrating (exactly the same code as the last applet, except this time laserTarget is a child of laser1):
http://www.paulscode.com/source/ShipFireProblem/ShipFireProblem2.htmlSource:
http://www.paulscode.com/source/ShipFireProblem/ShipFireProblem2.javaAs you can see in this case, the laser is placed in the correct spot, but not laserTarget (as you described). You can also see that the orientation of the laserTarget is correct, only it's position is wrong.
OK, so here is what APPEARS to be the source of the problem (still could be something else, of course). It looks like the calls to "translate" are not being executed immediately. They are happening later (perhaps when the frame is rendered), AFTER laserTarget has been assigned as a child to laser. So when that first laser translation happens (to place it on top of the laserDummy), it drags the laserTarget along with it.