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: