
bibuti.
[AS3] bullet spawning pattern help
I was curious if anyone knew of the most efficient way to spawn an arbitrary number of bullets from a specified point in a "fan" type pattern.
I've attached an image that helps illustrate what I mean:
So if I spawn one bullet, it more or less goes straight down, two bullets is split left and right, three has a left, a center, and a right, and so on.
It sort of makes me think of drawing a circle out of multiple points, but even that is a bit beyond me.
Any insight?
i'm obsessed with video games.

Pumpkin Carving 2008
Figure out beforehand how many degrees you want between each bullet. When you fire, take your bullet count and multiply it by this number. That is your spread angle. If you had a space of 15 and 4 bullets, it would be a 60 degree spread. So, take your total spread and center it over the angle your pointing. In this case I'll use 270 degrees since it matches your images. Take that same total spread angle, cut it in half, and subtract it from 270. You get 240. Take the half again and this time add it to the 270. Take these two values as your start and end angle. Starting from the start value in a for loop, iterate to the end value, incrementing by your predetermined space between bullets. Here's an AS2 example: Angle Test 1
And here's the singleframe code, which should be selfexplanatory as to what you need to use.
Code:
onEnterFrame = run;
deg2rad = Math.PI/180;
rad2deg = 180/Math.PI;
delay = 7;
timer = 0;
function run() {
timer++;
if (timer%delay == 0 && Key.isDown(Key.CONTROL)) {
fire();
}
dx = _xmouse  _root.spawn._x;
dy = _ymouse  _root.spawn._y;
xd = spawn._x_root._xmouse;
yd = spawn._y_root._ymouse;
rot = Math.atan2(yd, xd);
angle.text = rot*(180/Math.PI)+180;;
}
function fire() {
bc = Number(_root.bullets.text)1;
sa = Number(_root.spreadAngle.text);
trace("SA: " + sa + "  BC: " + bc);
if (!isNaN(bc) && !isNaN(sa)) {
var sh = sa/2;
var sp = sa/bc;
var s = 90 + sh;
var e = 90  sh;
for (var i = s; i>=e; i=sp) {
var ang = i;
ang *= deg2rad;
var b = attachMovie("bullet", "b"+getNextHighestDepth(), getNextHighestDepth());
b.xc = 10*Math.cos(ang);
b.yc = 10*Math.sin(ang);
b._x = spawn._x;
b._y = spawn._y;
b.onEnterFrame = function() {
this._x += this.xc;
this._y += this.yc;
if (this._x < 0  this._x > Stage.width  this._y < 0  this._y > Stage.height) {
this.removeMovieClip();
}
}
}
}
}
stop();
You ought to note that the method I provided just divides the bullets into the total spread to get the bullet spacing.
Last edited by ImprisonedPride; 04292009 at 06:51 PM.
The 'Boose':
ASUS Sabertooth P67 TUF
Intel Core i72600K QuadCore Sandy Bridge 3.4GHz Overclocked to 4.2GHz
8GB G.Skill Ripjaws 1600 DDR3
ASUS ENGTX550 TI DC/DI/1GD5 GeForce GTX 550 Ti (Fermi) 1GB 1GDDR5 (Overclocked to 1.1GHz)
New addition: OCZ Vertex 240GB SATA III SSD
WEI Score: 7.6

bibuti.
Thanks IP, this is pretty much exactly how I was thinking it would work.
I'll setup a special conditional for a single bullet so that it travels straight down, but otherwise this makes sense.
Cheers.
i'm obsessed with video games.

Pumpkin Carving 2008
That's weird... I had it firing straight down with a single bullet... Let me check it again.
Last edited by ImprisonedPride; 04292009 at 07:25 PM.
The 'Boose':
ASUS Sabertooth P67 TUF
Intel Core i72600K QuadCore Sandy Bridge 3.4GHz Overclocked to 4.2GHz
8GB G.Skill Ripjaws 1600 DDR3
ASUS ENGTX550 TI DC/DI/1GD5 GeForce GTX 550 Ti (Fermi) 1GB 1GDDR5 (Overclocked to 1.1GHz)
New addition: OCZ Vertex 240GB SATA III SSD
WEI Score: 7.6

Pumpkin Carving 2008
Code:
onEnterFrame = run;
deg2rad = Math.PI/180;
rad2deg = 180/Math.PI;
delay = 7;
timer = 0;
function run() {
timer++;
if (timer%delay == 0 && Key.isDown(Key.CONTROL)) {
fire();
}
dx = _xmouse  _root.spawn._x;
dy = _ymouse  _root.spawn._y;
xd = spawn._x_root._xmouse;
yd = spawn._y_root._ymouse;
rot = Math.atan2(yd, xd);
angle.text = rot*rad2deg+180;;
}
function fire() {
bc = Number(_root.bullets.text)1;
sa = Number(_root.spreadAngle.text);
st = bc * sa;
sp = st/2;
s = 90 + sp;
e = 90  sp;
for (var i = s; i>=e; i=sa) {
var ang = i;
ang *= deg2rad;
var b = attachMovie("bullet", "b"+getNextHighestDepth(), getNextHighestDepth());
b.xc = 10*Math.cos(ang);
b.yc = 10*Math.sin(ang);
b._x = spawn._x;
b._y = spawn._y;
b.onEnterFrame = function() {
this._x += this.xc;
this._y += this.yc;
if (this._x < 0  this._x > Stage.width  this._y < 0  this._y > Stage.height) {
this.removeMovieClip();
}
}
}
}
stop();
Here's test 2. Play with the numbers again. I got it right this time. Angle Test 2
You can see an example of a variable pointing angle by replacing the start/end variable lines with
Code:
s = (rot*rad2deg+180) + sp;
e = (rot*rad2deg+180)  sp;
Then hold Control while you move the mouse.
Last edited by ImprisonedPride; 04292009 at 07:29 PM.
The 'Boose':
ASUS Sabertooth P67 TUF
Intel Core i72600K QuadCore Sandy Bridge 3.4GHz Overclocked to 4.2GHz
8GB G.Skill Ripjaws 1600 DDR3
ASUS ENGTX550 TI DC/DI/1GD5 GeForce GTX 550 Ti (Fermi) 1GB 1GDDR5 (Overclocked to 1.1GHz)
New addition: OCZ Vertex 240GB SATA III SSD
WEI Score: 7.6
Posting Permissions
 You may not post new threads
 You may not post replies
 You may not post attachments
 You may not edit your posts

Forum Rules

Click Here to Expand Forum to Full Width
