The Game Gun
(The Game Gun requires understanding "Detect Mouse Angle" (separate tutorial on www.virtual-fx.net).
This tutorial will cover how to use the "Detect Mouse Angle" to create a gun. The necessary additions are as follows: A) Making the gun decide to shoot    B) Making a separate laser object "shoot" out of the gun.


Move your mouse around the black screen below:

Actual Flash code is in green.

Variables
Here are the extra variables on the main timeline that are needed for the gun...

Set Variable: "/gun:shootchance" = 12
Set Variable: "shotspeed" = 15
Comment: ----------------------------------------------
Start Drag ("/ship", lockcenter)


"shootchance" is a variable that the gun will consult to see what percentage of the time (out of 100) it should be shooting. This depends on how much code is running at any one time in your Flash game. If you have lots and lots of code, it will take the game a while to get around to testing if it should shoot. If this is the case, you may want to set the shootchance higher. If there is nothing else running (like in the tutorial above) EVEN if you set "shootchance" very low... it still shoots almost constantly

I have created a target for the gun to shoot at. The target is called "ship". I start a drag so that the gun will constantly shoot at your mouse for this demo.

New Gun Code

Here is the extra code that goes into the gun to make it shoot. (See separate tutorial on www.virtual-fx.net "Detect Mouse Angle" for an explanation of all the code before this point. I used the "Detect Mouse Script" and just made some additions to it to make it a gun.)

Comment: ----------------------------------------------
Comment: shoot at user?
Comment: ----------------------------------------------
Comment: the variable "shootchance" represents a percentage of 100. Since I use a random number, there is (in theory) a "shootchance" (pretend shootchance is set to 12) ... a 12 percent chance that the random number will be between 1 and 100. Since Random ACTUALLY returns a value between 0 and 99 I add +1.
Set Variable: "shootnow" = Random(100)+1
If (shootnow<=shootchance
Comment: keep increasing "shotname" so there are no shots with the same name ever.
When duplicating movie clips (there is only one "shot", which is duplicated whenever we need another one to appear...) you must never have more than one item with the same "depth". Only one item can exist at one depth at one time. So I keep increasing the variable "shotname" and use it in naming the new shots so they have unique names. I used "1000" as a maximum because it is unlikely I will ever need to have 1000 shots on the screen at the same time so I can recycle the numbers. The reason I do this, is in a game, you will have many many items that you need to duplicate. Each one needs guaranteed unique "depths" for its own use. I set aside numbers for use by different movie clips in chunks of 500 or 1000 because that is easier to keep track of.

Here, we create ourselves a new "shot".

Set Variable: "shotname" = shotname+1
If (shotname>=1000)
Set Variable: "shotname" = 1
End If
Duplicate Movie Clip ("../star", "shot"&shotname, shotname)

Now, the gun doesn't want to worry about the shot anymore, because it has other things to worry about. So I made the shot with the ability to move itself. It does, however, need to know a few things in order to do that. It needs to know how far to travel in the (x) direction, and how far to travel in th (y) direction each time it moves itself.

Comment: ----------------------------------------------
Comment: determine shot travel values
Comment: ----------------------------------------------
If (abs_mouse_x>=abs_mouse_y)

If the length of the (x) side  of our right triangle is greater than the length of the (y) side, the shot must be more horizontal than vertical. We set it to some value... oh ... say ... "shotspeed". This is a convenient variable to be able to control. "xsign" keeps track of whether the shot should travel left (-) or right (+). To set the other value, we set it as a percentage of "shotspeed". Since we know (x) is the longer value, (y)/(x) is the correct relationship to use to tell what length (y) should be.

Comment: shot is more horizontal than vertical
Set Variable: "../shot"&shotname&":xmov" = ..:shotspeed*xsign
Set Variable: "../shot"&shotname&":ymov" = ..:shotspeed*(abs_mouse_y/abs_mouse_x)*ysign
Else
Comment: shot is more vertical than horizontal
Set Variable: "../shot"&shotname&":ymov" = ..:shotspeed*ysign
Set Variable: "../shot"&shotname&":xmov" = ..:shotspeed*(abs_mouse_x/abs_mouse_y)*xsign
End If

Now we set the final stage for the little laser shot to live out its life. We rotate the laser shot to match the rotation of the gun, and we tell it to physically start itself out at the center of the gun. From now on, the shot will control itself (the shot is currently programmed to keep moving until it moves off the edge of the screen.)

Set Property ("../shot"&shotname, Rotation) = angle
Set Property ("../shot"&shotname, X Position) = gunx
Set Property ("../shot"&shotname, Y Position) = guny
End If

The Laser Shot

The laser shot moves itself across the screen from its starting point, using the (xmov) and (ymov) variables that the gun set in it when it was created. In this case, there is no collision checking at all. (See separate tutorial "Laser Collision Checking") on www.virtual-fx.net 

The laser shot will cease to exist once it moves off the screen. You do this to keep the amount of moving objects as few as possible. Remove everything as soon as you can and your game will run more smoothly. In this case, we enter some actual numbers (the movie is 350x650 pixels .... see Modify > Movie in the Flash menubar. If you chance your movie size, be sure to reflect that here in these numbers. 

The Laser Shot asks "Where am I?"
 

Set Variable: "my_x" = GetProperty("",_x)
Set Variable: "my_y" = GetProperty("",_y)

The Laser Shot asks "Am I off the screen?"

If (my_y>(350) or my_y<(0) or my_x>(650) or my_x<(0))

If yes, it self-terminates.

Remove Movie Clip ("")
Else

If no, the Laser Shot continues its journey.

Set Property ("", X Position) = my_x+xmov
Set Property ("", Y Position) = my_y+ymov
End If


And lives happily ever after.

: )
by: