Jump to content

  • Log In with Google      Sign In   
  • Create Account


AS3 creating new objects.


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 Ecoste   Members   -  Reputation: 128

Like
0Likes
Like

Posted 03 April 2013 - 09:24 AM

Basically I have a simple game. And each 2 seconds a bullet flies out across the screen.

 

//bullet spawner
import flash.utils.Timer;



var myTimer:Timer = new Timer(2000, 1); // 2 second
myTimer.addEventListener(TimerEvent.TIMER, runTimer);
myTimer.start();

function runTimer(e:TimerEvent):void{
	var bulletG:bullet = new bullet(565,Math.random()*400); //Screen is 400 pixels in heigth
	addChild(bulletG);
}
//bullet
package  {
	
	import flash.display.MovieClip;
	import flash.events.Event;
	
	
	public class bullet extends MovieClip {
		
		
		public function bullet(xS:int, yS:int) {
			addEventListener(Event.ENTER_FRAME, update);
			x = xS;
			y = yS
		}
		function update(e:Event){
			x -= 3;
		}
	}
	
}

 

Simple stuff right. Anyway, I wanted to ask if there's a better way of creating bullets. Because right now, if I wanted to create a shit ton of bullets, I could make an array full of bullets and simply spawn them.  That's cool until you get into spawning thousands of bullets, it's not time efficient to write each object yourself, so my question is how would you do it?


Edited by Ecoste, 03 April 2013 - 09:27 AM.


Sponsor:

#2 Arhim   Members   -  Reputation: 222

Like
2Likes
Like

Posted 03 April 2013 - 11:03 AM

I would make an array (or vector) of Bullet objects and have a var index:int that will tell me what the last used bullet in the array was.

 

So the implementation would go somewhat like this:

 

 

 

function spawnBullet():void
{
    //Pseudo code
    //Take the Bullet at position index and "activate it"(by activating I mean setting it's position and adding listeners)
    index = (index+1) % MaxNumberOfBullets;
}

// This next function I would call every few frames (it depends)
function cleanUp():void
{
    //Again pseudo code
    //Go through the array of bullets and check if they are ready for "deletion" (by deletion I mean removing the listeners and         
    //maybe making them invisible)
}
 

 

Now what this should do is it will allow you to always have a free bullet object that is hopefully destroyed (unless somehow you needed more bullets than the array could hold, in that case you increase the maximum size and add more bullets to the array) and it will make removing them not really taxing on the PC.

 

Ofcourse, the special case is when a bullet hits an enemy and it disapears but yout can solve that by implementing a function that will deactivate the bullet which you can, again, call in the cleanUp function instead of handling it manually.

 

Hope it helps you ;)


Edited by Arhim, 03 April 2013 - 11:05 AM.


#3 Ecoste   Members   -  Reputation: 128

Like
0Likes
Like

Posted 03 April 2013 - 12:22 PM

I would make an array (or vector) of Bullet objects and have a var index:int that will tell me what the last used bullet in the array was.

 

So the implementation would go somewhat like this:

 

 

 

function spawnBullet():void
{
    //Pseudo code
    //Take the Bullet at position index and "activate it"(by activating I mean setting it's position and adding listeners)
    index = (index+1) % MaxNumberOfBullets;
}

// This next function I would call every few frames (it depends)
function cleanUp():void
{
    //Again pseudo code
    //Go through the array of bullets and check if they are ready for "deletion" (by deletion I mean removing the listeners and         
    //maybe making them invisible)
}
 

 

Now what this should do is it will allow you to always have a free bullet object that is hopefully destroyed (unless somehow you needed more bullets than the array could hold, in that case you increase the maximum size and add more bullets to the array) and it will make removing them not really taxing on the PC.

 

Ofcourse, the special case is when a bullet hits an enemy and it disapears but yout can solve that by implementing a function that will deactivate the bullet which you can, again, call in the cleanUp function instead of handling it manually.

 

Hope it helps you ;)

 

(Solved my own question by replying to this reply)

Yep, that could work. Create an array with a shit ton of bullets, make the one's that aren't in use null and when we need some new bullets we can just scan the array for the ones that we're not using. That's what I had in mind. My problem was that I didn't know that you didn't need to specify a name for an object when putting it into an array.

 

//I did this 
var bulletA:bullet = new bullet();

var ary:Array = new Array(9000);
ary[0] = bulletA

//Instead of doing this-
var ary:Array = new Array(9000);
ary[0] = new bullet();


//I thought that you need a name for an object when putting it into an array, my problem was generating names for all the objects. Since you don't need a name for the object, then I can just put this shit in a for-loop and generate 9000 bullets. Thanks for the reply!

 

 

I'm still open to more efficient ways of creating bullets though, but for now this will do. Thanks!



#4 prototypical   Members   -  Reputation: 301

Like
0Likes
Like

Posted 03 April 2013 - 10:48 PM

Keep in mind that if you want to have multiple bullets on the screen, you might want to utilize pooling.

 

When you are constantly creating/deleting bullets, that can be a performance issue. With pooling, you create a bunch of bullets and then just reuse them as needed.I a

 

I am assuming that is what you are attempting to do, and it's definitely worthwhile.






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS