This user is yet to take control of their account and provide a biography. If you are the author of this article, please contact us via support AT actionscript DOT org.
Tutorial details: Written by: Flashjunkie [email:flashjunkie@canada.com] Difficulty Level: Advanced Requirements: Flash 4 Download FLA This is what we are aiming for in this tutorial. Move your mouse around the black screen below:
On top of the code that was built in the last tutorial here are some more variables for the main timeline that are needed for the gun: [as] Set Variable: "/gun:shootchance" = 12 Set Variable: "shotspeed" = 15 Comment: ---------------------------------------------- Start Drag ("/ship", lockcenter) [/as] "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.
Here is the extra code that goes into the gun to make it shoot. (See our tutorial "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.) [as] Comment: ---------------------------------------------- Comment: shoot at user? Comment: ---------------------------------------------- [/as] 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". [as] Set Variable: "shotname" = shotname+1 If (shotname>=1000) Set Variable: "shotname" = 1 End If Duplicate Movie Clip ("../star", "shot"&shotname, shotname) [/as] 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. [as] Comment: ---------------------------------------------- Comment: determine shot travel values Comment: ---------------------------------------------- If (abs_mouse_x>=abs_mouse_y) [/as]
Page 2 of 2
Part 2 Creating a New Laser Shot (con't) 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. [as] 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 [/as] 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.) [as] Set Property ("../shot"&shotname, Rotation) = angle Set Property ("../shot"&shotname, X Position) = gunx Set Property ("../shot"&shotname, Y Position) = guny End If [/as] 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. (The next tutorial "Laser Collision Checking" will deal with this)
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?" [as] Set Variable: "my_x" = GetProperty("",_x) Set Variable: "my_y" = GetProperty("",_y) [/as] The Laser Shot asks "Am I off the screen?" [as] If (my_y>(350) or my_y<(0) or my_x>(650) or my_x<(0)) [/as] If yes, it self-terminates. [as] Remove Movie Clip ("") Else [/as] If no, the Laser Shot continues its journey. [as] Set Property ("", X Position) = my_x+xmov Set Property ("", Y Position) = my_y+ymov End If [/as] And lives happily ever after. Now that you have understood the theory behind detecting the mouse angle and created the gun that can track its target.