Firing bullets in space invaders game
hey guys,
I am trying to work out the logic and the code required for firing a bullet in a space invaders style game.
I have a space ship on a stage that moves around freely using the arrow keys and I want to use the space bar to release a bullet.
So far my thinking is as follows:
when the space bar is pressed a bullet is released from the players space ship.
so I need to think about:
- the speed of the bullet
- the position of the spaceship when the bullet is fired
- being able to fire multiple bullets one after the other
- the bullet should move from the bottom of the screen to the top of the screen
- the consequence of a bullet hitting a target
I do not know how many scripts I would need to tackle this? how many behaviours per script and more importantly the code required....
I am desperate for any help and support you can provide...
thank you
thank you for your support
at this current time it would be a waste of time to understand how things work that did not benefit my game, sure knowledge would give me power but at the moment Id rather concentrate on gaining the appropriate knowledge as per the mechanics of my game and not going off in the opposite direction
having had a look at your space invaders game and the code and logic you provided it is different to the game I am building because:
- you use the move for movement and fire whereas I use cursor keys and a space bar
- you have limited the amount of ammuntion, I have not
- there are no explosions or changing of cast members on intersection.
I understand the aim of you posting the guide however I am of the thinking it would be better to follow a tutorial that is in line with what I require rather then learning a particular style and then again having to work out how to amend it again to be used in my game...
So if anyone can help me understand or provide code as per my initial message , I would be so grateful
thank you
Similar Messages
-
How do i remove an Object (aliens/ bullets) from my Space Invaders game??
Creating Space Invaders game and im getting confused on removing objects from my game. How do you actually remove an object (i.e bullets and aliens).
I know this isnt the right way to do it, but for the bullets i had an array of the Objects bullets[] and set the x and y coordinates off screen so u cant see then wen they are painted you cant see them, then wen the player fires them, the x and y coordinates change so they come from the players ship till it hits an alien or goes off screen, then i reset the coordinates so they are pasted off screen again. Im relatively new to this so i would appreciate any help. Im going to have to do the same with aliens wen a collision is detected. Is there a way of actually removing an object?
Here is sum code incase you need to see it:
public void checkCollision()
Rectangle playerRec = new Rectangle(player1.getBoundingBox());
for(int i=0; i<alienRow; i++)
for(int j=0; j<alienCol; j++){
if(playerRec.intersects(aliens[i][j].getBoundingBox()))
collisionDetected();
for(int k=0; k<bulletNum; k++){
Rectangle bulletRec = new Rectangle(bullets[k].getBoundingBox());
if(bulletRec.intersects(aliens[i][j].getBoundingBox()))
removeBullet(bullets[k]);
collisionDetected();
public static void collisionDetected()
System.out.println("COLLISION");
private void removeBullet(Bullets bullet){
bullet.fired=false;
bullet.setX(-10);
bullet.setY(-10);
}Edited by: deathwings on Nov 25, 2009 8:20 AMdeathwings wrote:
I was thinking bout that arraylist angle before, but it makes sense now so i think that will work ok. Thx kevin.Not a problem.
Taking the List idea one step further, you could have a parent Object/Interface that all of your game objects extend/implement. Let's call it GameObject.
A GameObject would have a draw(Graphics g) function that you call from your paintComponent( ) method, and for example an act( ) function as well.
You'd have a single List of GameObjects that you add everything in your game into. Now painting is simply a matter of looping over a single List. And in your game logic loop, you could do a similar thing with the act( ) function: your bullet's act( ) would simply move it forward and check for collisions and going off screen. An alien's act( ) function would move it around and maybe shoot a weapon every so often.
Just an idea. -
Need Help with Java Space Invaders Game!
Hi, im new to these forums so forgive if i dont follow the right way on laying things out. Im trying to create space invaders game but im stuck when im trying to create multiple aliens/ invaders. I have a class called Aliens (which is the invaders), and i can create an instance of an Alien. But when I try to create multiple instances they are not showing up on screen. I am not getting any error message though (which im hoping is a good sign, lol).
GamePanel is where all the action is and Alien is the alien (invaders) class.
Here is the code:
import java.awt.; import javax.swing.; import java.awt.Image; import java.awt.event.KeyListener; import java.awt.event.KeyEvent;
public class GamePanel extends JComponent implements KeyListener { SpaceInvaders game; static Player player1; Aliens alien1; static public Image spaceship2R; static public Image spaceship2L;
public GamePanel(SpaceInvaders game)
this.game = game;
player1 = new Player(this);
player1.start();
///// trying to create multiple instances of aliens here
for(int i=0; i<4; i++)
alien1 = new Aliens(this);
alien1.setX(i*100);
alien1.start();
this.setFocusable(true);
this.addKeyListener(this);
public void paintComponent(Graphics g)
Image pic1 = player1.getImage();
Image pic2 = alien1.getImage();
super.paintComponent(g);
g.drawImage(pic1, player1.getX(), player1.getY(), 50, 50,this);
g.drawImage(pic2, alien1.getX(), alien1.getY(), 50, 50,this);
}//end class
import java.awt.Image; import java.awt.*;
class Aliens extends Thread { //variables GamePanel parent; private boolean isRunning; private int xPos = 0, yPos = 0; Thread thread; static char direction = 'r'; Aliens alien; static public Image alien1; static public Image alien2;
public Aliens(GamePanel parent)
this.parent = parent;
isRunning = true;
public void run()
while(isRunning)
Toolkit kit = Toolkit.getDefaultToolkit();
alien1 = kit.getImage("alien1.gif");
alien2 = kit.getImage("alien2.gif");
try
thread.sleep(100);
catch(InterruptedException e)
System.err.println(e);
updateAliens();
parent.repaint();
public static Image getImage()
Image alienImage = alien1;
switch(direction){
case('l'):
alienImage = alien1;
break;
case('r'):
alienImage = alien1;
break;
return alienImage;
public void updateAliens()
if(direction=='r')
xPos+=20;
if(xPos >= SpaceInvaders.WIDTH-50||xPos < 0)
yPos+=50;
xPos-=20;
direction='l';
else
xPos-=20;
if(xPos >= SpaceInvaders.WIDTH-50||xPos < 0)
yPos+=50;
xPos+=20;
direction='r';
public void setDirection(char c){ direction = c; }
public void setX(int x){ xPos = x; }
public void setY(int y){ yPos = y; }
public int getX(){ return xPos; }
public int getY(){ return yPos; }
}//end classEdited by: deathwings on Oct 19, 2009 9:47 AM
Edited by: deathwings on Oct 19, 2009 9:53 AMMaybe the array I have created is not being used in the paint method, or Im working with 2 different objects as you put it? Sorry, Im just learning and I appreciate your time and help. Here is my GamePanel Class and my Aliens class:
import java.awt.*;
import javax.swing.*;
import java.awt.Image;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.image.BufferStrategy;
public class GamePanel extends JComponent implements KeyListener
SpaceInvaders game;
static Player player1;
static Bullets bullet;
//static public Image spaceship2R;
//static public Image spaceship2L;
private BufferStrategy strategy;
static int alienNum =0;
static Aliens[] aliens;
public GamePanel(SpaceInvaders game)
this.game = game;
player1 = new Player(this);
player1.start();
Aliens[] aliens = new Aliens[10];
for(int i=0; i<4; i++)
aliens[i] = new Aliens(this);
aliens.setX(i*100);
aliens[i].start();
alienNum++;
initialiseGame();
this.setFocusable(true);
this.addKeyListener(this);
public void paintComponent(Graphics g)
Image pic1 = player1.getImage();
Image pic2 = aliens[0].getImage();
Image bulletPic = bullet.getImage();
super.paintComponent(g);
g.drawImage(pic1, player1.getX(), player1.getY(), 50, 50,this);
for ( int i = 0; i < alienNum; i++ )
g.drawImage(pic1, aliens[0].getX(), aliens[0].getY(), 50, 50,this);
//if (bullet.fired==true){
// g.drawImage(bulletPic, bullet.getX(), bullet.getY(), 20, 20,this);
public void keyPressed(KeyEvent k)
switch (k.getKeyCode()) {
case (KeyEvent.VK_KP_DOWN):
case (KeyEvent.VK_DOWN):
player1.setDirection('d');
break;
case (KeyEvent.VK_KP_UP):
case (KeyEvent.VK_UP):
player1.setDirection('u');
break;
case (KeyEvent.VK_KP_RIGHT):
case (KeyEvent.VK_RIGHT):
player1.setDirection('r');
break;
case (KeyEvent.VK_KP_LEFT):
case (KeyEvent.VK_LEFT):
player1.setDirection('l');
break;
case (KeyEvent.VK_SPACE):
fireBullet();
break;
public void keyTyped(KeyEvent k) {}//empty
public void keyReleased(KeyEvent k)
player1.setDirection('n');
public void initialiseGame()
public static void checkCollision()
Rectangle playerRec = new Rectangle(player1.getBoundingBox());
for(int i=0; i<alienNum; i++)
//if(playerRec.intersects(aliens[i].getBoundingBox()))
//collisionDetected();
public static void collisionDetected()
System.out.println("COLLISION");
public void fireBullet()
Bullets bullet = new Bullets(player1.getX(),player1.getY());
bullet.fired=true;
}//end GamePanelimport java.awt.Image;
import java.awt.*;
class Aliens extends Thread
//variables
GamePanel parent;
private boolean isRunning;
private int xPos = 0, yPos = 0;
Thread thread;
static char direction = 'r';
Aliens alien;
static public Image alien1;
static public Image alien2;
public Aliens(GamePanel parent)
this.parent = parent;
isRunning = true;
public void run()
while(isRunning)
Toolkit kit = Toolkit.getDefaultToolkit();
alien1 = kit.getImage("alien1.gif");
//alien2 = kit.getImage("alien2.gif");
try
thread.sleep(100);
catch(InterruptedException e)
System.err.println(e);
updateAliens();
parent.repaint();
public static Image getImage()
Image alienImage = alien1;
switch(direction){
case('l'):
alienImage = alien1;
break;
case('r'):
alienImage = alien1;
break;
return alienImage;
public void updateAliens()
if(direction=='r')
xPos+=20;
if(xPos >= SpaceInvaders.WIDTH-50||xPos < 0)
yPos+=50;
xPos-=20;
direction='l';
else
xPos-=20;
if(xPos >= SpaceInvaders.WIDTH-50||xPos < 0)
yPos+=50;
xPos+=20;
direction='r';
public Rectangle getBoundingBox()
return new Rectangle((int)xPos, (int)yPos, 50, 50);
public void setDirection(char c){ direction = c; }
public void setX(int x){ xPos = x; }
public void setY(int y){ yPos = y; }
public int getX(){ return xPos; }
public int getY(){ return yPos; }
}//end class -
Help with KeyDown (space invaders game)
I'm making a space invaders type game for school using Greenfoot (new Java IDE). Whenever I press space, a bullet will fire. However, multiple bullets are being created when I press space once, and when I hold space, a long stream of bullets are being made. I want one bullet to be created when I press space. Tried using KeyPress, but apparently Greenfoot does not recognize java.awt? Thanks in advance.
public class Ship extends Vehicle {
* Constructor for objects of class Shuttle
public Bullet B;
boolean canFire = false;
public Ship() {
GreenfootImage ship = new GreenfootImage("spaceship.gif");
this.setImage(ship);
//Create a bullet
public void fire(){
B = new Bullet();
getWorld().addObject(B,getX(),getY()-60);
public boolean collision(){
Actor enemy = getOneIntersectingObject(null);
return (enemy!=null) ? true : false;
public void act(){
// move with keys
if (this.canMove())
move();
if(Greenfoot.isKeyDown("space")){
fire();
else if(collision()){
getWorld().removeObject(this);
}Make a Class Variable to use as a flag indicating that a key was pressed... check to see if the flag is set, and if it is not, then fire a bullet and then set the flag. Reset the flag when they keyReleased action fires.
This way only one bullet can be fired for each time a key is pressed, provided your act() is being polled, but if a keyPressed fires act(), but not a keyRelease too, then it will not work. If it does not work, then you'll need to go to a regular KeyListener.
//Your code make these changes
public class Ship extends Vehicle {
* Constructor for objects of class Shuttle
public Bullet B;
boolean canFire = false;
public Ship() {
GreenfootImage ship = new GreenfootImage("spaceship.gif");
this.setImage(ship);
//Create a bullet
public void fire(){
B = new Bullet();
getWorld().addObject(B,getX(),getY()-60);
public boolean collision(){
Actor enemy = getOneIntersectingObject(null);
return (enemy!=null) ? true : false;
public void act(){
// move with keys
if (this.canMove())
move();
if(!GreenFoot.isKeyDown("space")) canFire = true; //add this
if(Greenfoot.isKeyDown("space") and canFire){
fire();
canFire = false; //add this
else if(collision()){
getWorld().removeObject(this);
} -
Controlling fire in Space Invaders game
Hi again,
still working through the tutorial on Space Invaders in Flash
MX 2004 (bit out of date, I know).
I've got the player craft under mouse control. What I don't
like about the game is that you can fire as rapidly as you wan't,
though the number of bullets is limited. You can change this limit
in the variable - I would rather have it though that you can only
have a set number of bullets in play at a time (at the moment, if
you go over the limit, the uppermost bullets just disapear).
Here is the code:
// when the mouse cliks
onClipEvent(mouseDown)
// duplicate the bullet mc
_root.bullet.duplicateMovieClip("bullet"+bulletNum,bulletNum);
// set the coords to the mouse clik
eval("_root.bullet" + bulletNum)._x = this._x;
eval("_root.bullet" + bulletNum)._y = this._y;
// increment the bullet number
bulletNum++;
// if more than 50 bullets , start again at 0
if(bulletNum>50)
bulletNum = 0;
What code could I use to have it so that you can only have,
say, 3 bullets in play at once, and you can't fire again until
they've hit / left the screen?
regards,
gHi again,
thanks for that. Another way would be to use code like the
following:
var enableInterval:Number;
var allowFire:Boolean;
function tempDisableFire():Void {
allowFire = false;
enableInterval = setInterval(enableFire, 500); // 500
millisecond delay
function enableFire():Void {
allowFire = true;
clearInterval(enableInterval);
I am unsure though whether to insert this within my existing
code, or to use this starting from scratch. If it was inside an
onClipEvent tag (the event being the mouse click), I could then use
it to control the fire. I'm not sure if I would do this with an "if
/ then" statement.
Any suggestions on this method? I know it may be asking a bit
much, but if you could even complete this piece of code that would
be magic!
cheers,
g -
Yet another Space Invaders game...
Yes, here is my first Java game:
www.fnfconsulting.no
Feel free to check it out. No registration necessary.
Comments&Questions are welcome.
Halhaha coded only using your right hand. nice . this
kicks your games to mars and back malo ;) 1 word
SOUND! and good sound :P good stuff although it doesnt
use 1.1 so your audience is limited (its like
developing for linux .. very limited) most people (i
know) wont bother downloading the plug in. very nice
thoughThanks. I dont think I understand all your comments, but I'll give it a try.
Firstly, the game has sound, and personally I think it's the coolest part of the game. The sounds are samples from the movies. I use standard AudioClip, no fancy stuff.
When you mention 1.1, do you mean JVM 1.1, the old stuff that was released with IE 5.0 or something? I think nowadays most people that develop Java games uses "Java 2" which as I understand it is Java SDK 1.2 and up. And most people playing Java games downloads some kind of JRE, often the newest version, 1.4.2.X.
Correct me if I'm wrong :) -
Help! trying to create 'space invaders'
hi. im a high school student with a little knowledge of java. im am currently working on a class assignment where each student has to create their own program. i decided to create the classic game of 'Space Invaders'. But i have a problem; i can't figure out how i will get the characters to move.
does anyone if there is a method that will allow the user to move a character? for example, in C++ there is a conio.h library that has a goto(x,y) function. is there one for java as well? thanks alot!This is another way
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Si extends JFrame
Timer ta;
myView view = new myView();
public Si()
setBounds(3,10,765,350);
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent ev)
{ dispose();
System.exit(0);
getContentPane().add("Center",view);
setVisible(true);
ta = new Timer(45, new ActionListener()
{ public void actionPerformed(ActionEvent e)
view.move();
ta.start();
public class myView extends JComponent
Point invs[] = new Point[15];
Color invc[] = new Color[15];
Color color[] = new Color[]{
Color.blue, Color.cyan, Color.green, Color.magenta,
Color.orange, Color.pink, Color.red, Color.yellow};
public myView()
for (int p=0; p < invs.length; p++)
int x = (int)(Math.random()*600)+33;
int y = (int)(Math.random()*200)+33;
invs[p] = new Point(x,y);
int c = (int)(Math.random()*8);
invc[p] = color[c];
public void move()
for (int p=0; p < invs.length; p++)
repaint(invs[p].x-1,invs[p].y-1,20,18);
int x = (int)(Math.random()*3)-1;
int y = (int)(Math.random()*3)-1;
invs[p].translate(x,y);
repaint(invs[p].x-1,invs[p].y-1,20,18);
public void paintComponent(Graphics g)
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
for (int p=0; p < invs.length; p++)
g.setColor(invc[p]);
g.fillOval(invs[p].x,invs[p].y,17,13);
public static void main (String[] args)
new Si();
} Noah -
[FLMX] ayuda con tutorial space invaders
Hola a todos.
estoy tratando de hacer una modificación de un FLA del
space invaders
que me bajé en:
http://www.flashkit.com/movies/Games/Full_Game_Source/Space_In-Paul_Nea-8765/index.php
Este jueguecillo incluye un PHP que guarda los records en
unos txt.
La cuestión es que no tengo mucha idea de
programación y no me funcionan
los records.
¿alguien podria ayudarme?
gracias mil
Juan -
Space invaders! I need some help...!
Hello,
i'm trying to program a very simple version of space invaders. I'm drawing my moving objects (spaceship, rockets, aliens) with drawstring but I'm getting these compiling error: illegal start of expression.
Also I want to move the spaceship with translate is this OK to do so!?
Can somebody help me? Thanks for your help!
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.Graphics2D;
//in deze klasse teken ik het ruimteschip en kan het links/rechts bewegen
public class Ruimteschip
//ruimteschip
Ruimteschip roderikschip = new Ruimteschip();
public void paint(Graphics ruimteschip)
{ //Ruimteschip weergeven
Graphics2D ruimteschip2D = (Graphics2D)ruimteschip;
String ruimteschip = "ruimteschip";
ruimteschip2D.drawString("ruimteschip", x, y,);
//beweegmethod
public void beweegRechts()
{ //teken opnieuw 1 coordinaat rechts
roderikschip.translate(1, 0);
ruimteschip2D.drawString("ruimteschip", x, y);
//beweegmethod
public void beweegLinks()
{ //teken opnieuw 1 coordinaat links
roderikschip.translate(-1, 0);
ruimteschip2D.drawString("ruimteschip", x, y);
}Hi and thanks for your replies.
I know drawString isn't the most beautiful way, but I'm making this game for an assignment, and I have to use drawString.
Still i'm getting "illegal start of expression" in my paint method...
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.Graphics2D;
//in deze klasse teken ik het ruimteschip en kan het links/rechts bewegen
public class Ruimteschip
//ruimteschip
Ruimteschip ruimteschip = new Ruimteschip();
public void paint(Graphics ruimteschip)
{ //Ruimteschip weergeven
Graphics2D ruimteschip2D = (Graphics2D)ruimteschip;
String s = "ruimteschip";
*ruimteschip2D.drawString(s, x, y,);*
//beweegmethod
public void beweegRechts()
{ //teken opnieuw 1 coordinaat rechts
s.translate(1, 0);
ruimteschip.drawString(s, x, y);
//beweegmethod
public void beweegLinks()
{ //teken opnieuw 1 coordinaat links
s.translate(-1, 0);
ruimteschip.drawString(s, x, y);
} Edited by: Roddy on May 1, 2008 8:28 AM -
Hi, could you please try my game Space Invaders, to see if you can find any bugs etc? Let me know...
http://www.geocities.com/ajbasic/SpaceInvaders.htmlthe ability to die should definitely be the last thing you code ;) It's so cool to play an early staged game without ever being able to die.
OK, so my comments:
The pictures, if you're going to allow them to overlap, as you do now, give them some transparency.
Also, right now, the ships will go all the way to the bottom and through the bottom of the screen.... that's bad.
Anything else I'd think would be immediately obvious. Keep going with it and I hope to see some origional twists that you come up with -
Making my enemies drop bombs in space invaders
Hi all,
I'm in the process of learning flash just now and am
completing an online tutorial on Space Invaders. Thing is, the
bombs drop from a random location on the screen. I want them to
drop from a random enemy (I'm not too bothered just now about
making it one on the bottom row or one with no other enemies before
them).
At the moment, here is the AS that makes them drop (the
frequency is determined elsewhere):
eval("_root.alienBomb" + alienBombNum)._x =random(700);
eval("_root.alienBomb" + alienBombNum)._y =
300*Math.random();
An I can modify it to get a certain one to drop:
eval("_root.alienBomb" + alienBombNum)._x
=_root.alienClip2_2._x;
eval("_root.alienBomb" + alienBombNum)._y =
_root.alienClip2_2._y;
I can' t get it to randomly choose one - I know I have to use
the random function, but don't know how to implement this.
Can anyone help?
regards,
gThe code you're using is really old...back to Flash 5, I'd
guess, which makes this rather more complicated than it need be.
Since you seem to be in AS1, I'll keep it that way. Try
using:
xGridNum = Math.round(Math.random() * 7);
yGridNum = Math.round(Math.random() * 7);
var bomb = _root["alienBomb"+alienBombNum];
var alien = _root["alien"+xGridNum+"_"+yGridNum];
bomb._x = alien._x;
bomb._y = alien._y;
The above isn't the best way to do this, but it's simple and
not far from what you've referenced. The sevens above assume 8 rows
and 8 columns of aliens (numbered alien0_0 to alien7_7).
Hope that helps. -
Spawning multiple instances of a sprite (firing bullets). Help needed.
Hello there. I'm currently trying to make a game in director 11.5 for a University project. I've decided to make a scrolling space shooter but I've run into a problem. Any tutorial I've found has created a limited 'bank' of bullets to fire, only allowing a certain number on the stage at any given time. What I need to do is to leave a single bullet sprite off the boundaries of the page and essentially copy it and it's lingo behaviors to spawn another instance of the bullet on the stage when the player fires (using the left mouse button in this case). I also need this copy to be deleted entirely when it collides with an enemy or leaves the boundaries of the stage, otherwise the game will just run slower and slower as more shots are fired.
I have heard that this is possible using the puppetSprite() method but the API doesn't shine much light on the issue and neither has literally hours of google searches. If anyone can let me know any method of doing this, I'd be very grateful.
On a related issue, when fired the bullet will need to intsect the location of where the mouse cursor was when the bullet was fired and then continue on a linear path. I've worked out a method of doing this but it isn't very effective or efficient (the speed of the bullets would be determined by how far away the mouse cursor is from the players ship and I think there's probably a less calculation intensive method for doing this) and as I can't spawn the bullets as of now, I really don't know if it will even work. If anyone has any advice on how to better implement this mechanic, again I'd welcome your input. Thanks in advance.You want to work with objects not numbers which means using Points for locs and Sprite references and not sprite numbers.
I feel that using a object manager object would make programming this a lot easier, cleaner, and more efficient. Rather than give a lecture on OOP and OOD, I took some of Josh's ideas like using a timeout object and wrote some scripts in my style to give you something else to boggle your brain.
I tested these scripts but not thoroughly and I left plenty for you to do.
I separated out the creation and control of "bullets" from the movement of the bullets. So, there is a behavior that does nothing more than move the bullet sprites and the control object handles everything else using a single timeout object.
I suggest creating a new project to play with these scripts. Throw a bunch of sprites on the stage and attach the "Hitable Sprite" behavior to them, make sure you have a sprite named "bullet", and a " go the frame" behavior to loop on and you should be good to go.
Note that where I set the velocity of the bullet sprites, that I use "100.0" instead of 20. 20 would be a very fast speed.
Here's the Parent script for the control:
-- Bullet Control parent script
property pUpdateTimer -- timeout object for doing updates
property pBullets -- list of bullet sprites
property pGunLoc -- location of the gun, ie the location where your bullets start at.
property pRightBounds -- right edge of the stage
property pBottomBounds -- bottom edge of the state
property pZeroRect -- used for intersection hit detection
on new me
pUpdateTimer = timeout().new("BulletCntrl", 25, #update, me) -- 25 milleseconds = 40 updates per second
pBullets = []
pGunLoc = point(300,550) -- *** SET THIS to where you want your bullets to start at.
pZeroRect = rect(0,0,0,0)
-- store stage bounds for later use
pRightBounds = _movie.stage.rect.width
pBottomBounds = _movie.stage.rect.height
return me
end new
on fire me
NewBullet = script("Bullet behavior").new(pGunLoc) -- create new bullet sprite
if ilk(NewBullet, #sprite) then pBullets.add(NewBullet) -- store sprite reference
end fire
on update me, timeob
if pBullets.count = 0 then exit -- no bullets to update
-- update bullet positions
call(#update, pBullets)
-- get list of sprites to test for hits/collisions
HitSprites = []
sendAllSprites(#areHitable, HitSprites) -- the list "HitSprites" is populated by each hitable sprite.
BulletsToDelete = [] -- list of bullet sprites to delete
-- check if any bullet has hit a hitable sprite
repeat with Bullet in pBullets
repeat with HitSprite in HitSprites
if Bullet.rect.intersect(HitSprite.rect) <> pZeroRect then
HitSprite.explode()
BulletsToDelete.add(bullet)
exit repeat -- leave inner loop
end if
end repeat
end repeat
-- check if bullet is out of bounds
repeat with Bullet in pBullets
Die = false
if Bullet.right < 0 then Die = true
if Bullet.left > pRightBounds then Die = true
if Bullet.top > pBottomBounds then Die = true
if Bullet.bottom < 0 then Die = true
if Die then BulletsToDelete.add(Bullet)
end repeat
-- remove any sprites that hit something or went off the screen
repeat with Bullet in BulletsToDelete
Bullet.die()
pBullets.deleteOne(Bullet) -- remove bullet from list of active bullets
end repeat
end update
on stopMovie
-- end of app cleanup
if pUpdateTimer.objectP then
pUpdateTimer.forget()
pUpdateTimer = void
end if
end
The behavior for the bullets is:
-- Bullet behavior
property pMe
property pVelocity
property pCurLoc
on new me, StartLoc
-- get a sprite
pMe = me.getSprite()
if pMe.voidP then return void -- if not a sprite then give up
-- setup this bullet sprite
pMe.puppet = true
pMe.member = member("bullet")
pMe.loc = StartLoc
pMe.scriptInstanceList.add(me) -- add this behavior to this sprite
-- set velocity
pVelocity = ( _mouse.mouseLoc - StartLoc) / 100.0 -- Note: magic number "20.0"
updateStage() -- need to update pMe.rect values
pCurLoc = pMe.loc -- store current location
return pMe -- Note: returning "pMe" not "me"
end new
on getSprite me
repeat with CurChannel = 1 to the lastchannel
if sprite(CurChannel).member = (member 0 of castLib 0) AND sprite(CurChannel).puppet = false then
return sprite(CurChannel)
end if
end repeat
return void
end getSprite
on update me
-- move bullet.
pCurLoc = pCurLoc + pVelocity -- add velocity to pCurLoc to maintain floating point accuracy
pMe.loc = pCurLoc
end update
on die me
pMe.scriptInstanceList = [] -- must manually clear this property
pMe.puppet = false
end
We setup everything in a Movie script:
-- Movie Script
global gBulletCntrl
on prepareMovie
gBulletCntrl = script("Bullet Control").new()
the mouseDownScript = "gBulletCntrl.fire()" -- route mouseDown events to the global object gBulletCntrl.
end prepareMovie
on stopMovie
the mouseDownScript = ""
end stopMovie
Finally since we are shooting at other sprites we need a script on them to interact with the bullets.
-- Hitable Sprite Behavior
property pMe
on beginSprite me
pMe = sprite(me.spriteNum)
end beginSprite
on enterFrame me
-- movie sprite
end enterFrame
on areHitable me, HitList
HitList.add(pMe)
end areHitable
on explode me
put "Boom"
end explode -
Im not sure if any one will be able to help me or not but Im a relatively new programmer and i am createing a space shooter type game and I am haveing some difficulties in wording my statements. Right now the way i have it set up I am able to fire only 1 shot from my ship but the shot hitting the enemy ship part works and i know it is only from this run statement i have becuase before i was able to shoot as much as i wanted. Like i said i doubt anyone will be able to help me without seeing more of my code but i thought id try.
//createing repaint timer
public void run(){
while(true) {
try{//attempt to execute
createEnemy(); //create enemy
updateEnemy(); //update enemys
n.updateShots(); //update shots
//make the enemy explode if the shots x,y is close to the enemy x,y
for(int i=0;i<n.size;i++){ //n = ship function and size is place holder for number of shots
if(n.shots[i] != null && n.shots.y - enemy[i].y >0&&n.shots[i].y - enemy[i].y<50){ //if the shot is hit in this y area the shot and enemy will delete
n.shots[i] = null;
enemy[i] = null;
}//end of if
else{
if(n.shots[i] != null &&n.shots[i].x - enemy[i].x >0&&n.shots[i].x - enemy[i].x<50){ //if the shot is hit in this x area the shot and enemy will delete
n.shots[i] = null;
enemy[i] = null;
}//end if
}//end else
}//end of for
repaint();
n.flame = false; //set flame to false so Flame is only true if Up is pressed
Thread.sleep(100);
}//end of try
catch (InterruptedException e) {
}//end of catch
}//end of while
} //end of runWhy not use a timer here? If you are using Swing, then a Swing Timer is much better here than the ugly while(true).
Also, when posting your code, please use code tags so that your code will retain its formatting and be readable. To do this, you will need to paste already formatted code into the forum, highlight this code, and then press the "code" button at the top of the forum Message editor prior to posting the message. You may want to click on the Preview tab to make sure that your code is formatted correctly. Another way is to place the tag [code] at the top of your block of code and the tag [/code] at the bottom, like so:
[code]
// your code block goes here.
// note the differences between the tag at the top vs the bottom.
[/code] -
Java space shooter game optimization
Hi
I've just started a little space-arcade type of game.
For now there's a ship but it doesn't do much:
- moves (accelerated)
- fires (SPACE bar)
Now I'm going to start work on an enemy generator + collision test.
After that: pick-ups, a status bar(remaining life, passed time and so on), etc
Since I'm not such a experienced programmer with Java graphics, I would need any opinion I can get to optimize my code (smoother movement, less CPU/memory usage, etc.). Read about sprites but not sure if it's the case here.
You can take a look at the game and source codes at:
http://www.stonefixion.com/temp/game
Please take a look over the four java files and if you have any optimization suggestions, they are mostly welcome.
Waiting for some feedback,
Cheers ;jI've done a bit of reading and I think I've already done that(double buffering) like this:
public void update (Graphics g)
if (dbImage == null)
dbImage = createImage (this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics ();
dbg.setColor (getBackground ());
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
dbg.setColor (getForeground());
paint (dbg);
g.drawImage (dbImage, 0, 0, this);
}I put all the drawing in paint() and call it update().
Thanx -
Comparing coordinates for space invaders clone
thanks a lot! The buttons now work! I have updated my code, but now my problem is to compare the position of the bullet with the position of the ufo. I have marked the part where I wrote my solution, but it doesn't really work, do you have any suggestions?
Thanks.
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
class Animation extends JPanel implements ActionListener{
JButton button=new JButton("links");
JButton button2=new JButton("rechts");
int xpos=60;
int xpos2=0;
int height=15;
int width=60;
int dx=3;
int dxshooter=3;
int shoot=300;
int ykogel=0;
int dxkogel=6;
int number=12;
int xposkogel;
int yposkogel;
int ovalx1=xpos,ovalx2=xpos+100,ovalx3=xpos+200,ovalx4=xpos+300,ovalx5=xpos+400,ovalx6=xpos+500;
int ovaly1=15,ovaly2=15,ovaly3=15,ovaly4=15,ovaly5=15,ovaly6=15;
int ovalxb1=xpos+19,ovalxb2=xpos+19+100,ovalxb3=xpos+19+200,ovalxb4=xpos+19+300,ovalxb5=xpos+19+400,ovalxb6=xpos+19+500;
int ovalyb1=5,ovalyb2=5,ovalyb3=5,ovalyb4=5,ovalyb5=5,ovalyb6=5;
Timer fastTicker;
Animation(){
fastTicker=new Timer(25,this);
void start(){
Listener ear = new Listener();
this.add(button);
button.setSize(100,50);
button.move(0,320);
button.addActionListener(ear);
this.add(button2);
button2.setSize(100,50);
button2.move(600,320);
button2.addActionListener(ear);
fastTicker.start();
class Listener implements ActionListener{
public void actionPerformed(ActionEvent b)
Object o =b .getSource();
if (o == button){
if(dxshooter==3){
dxshooter=-3;}
if (o == button2){
if(dxshooter==-3){
dxshooter=3;}
public void actionPerformed(ActionEvent e){
yposkogel=312-ykogel;
ovalx1=xpos;
ovalx2=xpos+100;
ovalx3=xpos+200;
ovalx4=xpos+300;
ovalx5=xpos+400;
ovalx6=xpos+500;
ovalxb1=xpos+19;
ovalxb2=xpos+19+100;
ovalxb3=xpos+19+200;
ovalxb4=xpos+19+300;
ovalxb5=xpos+19+400;
ovalxb6=xpos+19+500;
//bolletjesanimatie
if(e.getSource()==fastTicker){
ykogel+=dxkogel;
xposkogel=xpos2;
xpos2+=dxshooter;
if(ykogel>=3){
xposkogel=xposkogel;}
//schietding
if (xpos2>240){
dxshooter=-3;}
if(xpos2<-210){
dxshooter=3;}
//kogelanimatie
if(ykogel>310){
ykogel=0;}
//COMPARING THE POSITION OF THE BULLET WITH THE UFO's
if(yposkogel<=15){
if(xposkogel>=ovalx6&&xposkogel<=ovalx6+60){
ovaly6=1500;
ovalyb6=1500;}
if(xposkogel>=ovalx5&&xposkogel<=ovalx5+60){
ovaly5=1500;
ovalyb5=1500;}
if(xposkogel>=ovalx4&&xposkogel<=ovalx4+60){
ovaly4=1500;
ovalyb4=1500;}
if(xposkogel>=ovalx3&&xposkogel<=ovalx3+60){
ovaly3=1500;
ovalyb3=1500;}
if(xposkogel>=ovalx2&&xposkogel<=ovalx2+60){
ovaly2=1500;
ovalyb2=1500;}
if(xposkogel>=ovalx1&&xposkogel<=ovalx1+60){
ovaly1=1500;
ovalyb1=1500;}
this.repaint();
public void paintComponent(Graphics g){
super.paintComponent(g);
//ufo's
g.setColor(Color.black);
g.fillOval(ovalxb1,ovalyb1, 25,25);
g.setColor(Color.orange);
g.fillOval(ovalx1,ovaly1,width,height);
g.setColor(Color.black);
g.fillOval(ovalxb2,ovalyb2, 25,25);
g.setColor(Color.orange);
g.fillOval(ovalx2,ovaly2,width,height);
g.setColor(Color.black);
g.fillOval(ovalxb3,ovalyb3, 25,25);
g.setColor(Color.orange);
g.fillOval(ovalx3,ovaly3,width,height);
g.setColor(Color.black);
g.fillOval(ovalxb4,ovalyb4, 25,25);
g.setColor(Color.orange);
g.fillOval(ovalx4,ovaly4,width,height);
g.setColor(Color.black);
g.fillOval(ovalxb5,ovalyb5, 25,25);
g.setColor(Color.orange);
g.fillOval(ovalx5,ovaly5,width,height);
g.setColor(Color.black);
g.fillOval(ovalxb6,ovalyb6, 25,25);
g.setColor(Color.orange);
g.fillOval(ovalx6,ovaly6,width,height);
//schietding
g.fillRect(xpos2+350-17,317,6,40);
g.setColor(Color.green);
g.fillOval(xpos2+350-30,330,30,30);
g.setColor(Color.black);
g.fillRect(xpos2+350-40,350,50,height);
//kogel
g.fillRect(xposkogel+350-16,yposkogel,5,5);
public class AnimationDemo{
JFrame frame;
Animation animation;
void demo(){
frame=new JFrame("**Spees Inveeders** All rights reserved (Dave Senden and Joeri Oomen)");
animation=new Animation();
frame.getContentPane().add(animation);
frame.setSize(700,400);
frame.setVisible(true);
animation.start();
public static void main(String[] args){
AnimationDemo animationDemo=new AnimationDemo();
animationDemo.demo();thanks a lot! The buttons now work! I have updated my code, but now my problem is to compare the position of the bullet with the position of the ufo. I have marked the part where I wrote my solution, but it doesn't really work, do you have any suggestions?
Thanks.
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
class Animation extends JPanel implements ActionListener{
JButton button=new JButton("links");
JButton button2=new JButton("rechts");
int xpos=60;
int xpos2=0;
int height=15;
int width=60;
int dx=3;
int dxshooter=3;
int shoot=300;
int ykogel=0;
int dxkogel=6;
int number=12;
int xposkogel;
int yposkogel;
int ovalx1=xpos,ovalx2=xpos+100,ovalx3=xpos+200,ovalx4=xpos+300,ovalx5=xpos+400,ovalx6=xpos+500;
int ovaly1=15,ovaly2=15,ovaly3=15,ovaly4=15,ovaly5=15,ovaly6=15;
int ovalxb1=xpos+19,ovalxb2=xpos+19+100,ovalxb3=xpos+19+200,ovalxb4=xpos+19+300,ovalxb5=xpos+19+400,ovalxb6=xpos+19+500;
int ovalyb1=5,ovalyb2=5,ovalyb3=5,ovalyb4=5,ovalyb5=5,ovalyb6=5;
Timer fastTicker;
Animation(){
fastTicker=new Timer(25,this);
void start(){
Listener ear = new Listener();
this.add(button);
button.setSize(100,50);
button.move(0,320);
button.addActionListener(ear);
this.add(button2);
button2.setSize(100,50);
button2.move(600,320);
button2.addActionListener(ear);
fastTicker.start();
class Listener implements ActionListener{
public void actionPerformed(ActionEvent b)
Object o =b .getSource();
if (o == button){
if(dxshooter==3){
dxshooter=-3;}
if (o == button2){
if(dxshooter==-3){
dxshooter=3;}
public void actionPerformed(ActionEvent e){
yposkogel=312-ykogel;
ovalx1=xpos;
ovalx2=xpos+100;
ovalx3=xpos+200;
ovalx4=xpos+300;
ovalx5=xpos+400;
ovalx6=xpos+500;
ovalxb1=xpos+19;
ovalxb2=xpos+19+100;
ovalxb3=xpos+19+200;
ovalxb4=xpos+19+300;
ovalxb5=xpos+19+400;
ovalxb6=xpos+19+500;
//bolletjesanimatie
if(e.getSource()==fastTicker){
ykogel+=dxkogel;
xposkogel=xpos2;
xpos2+=dxshooter;
if(ykogel>=3){
xposkogel=xposkogel;}
//schietding
if (xpos2>240){
dxshooter=-3;}
if(xpos2<-210){
dxshooter=3;}
//kogelanimatie
if(ykogel>310){
ykogel=0;}
//COMPARING THE POSITION OF THE BULLET WITH THE UFO's
if(yposkogel<=15){
if(xposkogel>=ovalx6&&xposkogel<=ovalx6+60){
ovaly6=1500;
ovalyb6=1500;}
if(xposkogel>=ovalx5&&xposkogel<=ovalx5+60){
ovaly5=1500;
ovalyb5=1500;}
if(xposkogel>=ovalx4&&xposkogel<=ovalx4+60){
ovaly4=1500;
ovalyb4=1500;}
if(xposkogel>=ovalx3&&xposkogel<=ovalx3+60){
ovaly3=1500;
ovalyb3=1500;}
if(xposkogel>=ovalx2&&xposkogel<=ovalx2+60){
ovaly2=1500;
ovalyb2=1500;}
if(xposkogel>=ovalx1&&xposkogel<=ovalx1+60){
ovaly1=1500;
ovalyb1=1500;}
this.repaint();
public void paintComponent(Graphics g){
super.paintComponent(g);
//ufo's
g.setColor(Color.black);
g.fillOval(ovalxb1,ovalyb1, 25,25);
g.setColor(Color.orange);
g.fillOval(ovalx1,ovaly1,width,height);
g.setColor(Color.black);
g.fillOval(ovalxb2,ovalyb2, 25,25);
g.setColor(Color.orange);
g.fillOval(ovalx2,ovaly2,width,height);
g.setColor(Color.black);
g.fillOval(ovalxb3,ovalyb3, 25,25);
g.setColor(Color.orange);
g.fillOval(ovalx3,ovaly3,width,height);
g.setColor(Color.black);
g.fillOval(ovalxb4,ovalyb4, 25,25);
g.setColor(Color.orange);
g.fillOval(ovalx4,ovaly4,width,height);
g.setColor(Color.black);
g.fillOval(ovalxb5,ovalyb5, 25,25);
g.setColor(Color.orange);
g.fillOval(ovalx5,ovaly5,width,height);
g.setColor(Color.black);
g.fillOval(ovalxb6,ovalyb6, 25,25);
g.setColor(Color.orange);
g.fillOval(ovalx6,ovaly6,width,height);
//schietding
g.fillRect(xpos2+350-17,317,6,40);
g.setColor(Color.green);
g.fillOval(xpos2+350-30,330,30,30);
g.setColor(Color.black);
g.fillRect(xpos2+350-40,350,50,height);
//kogel
g.fillRect(xposkogel+350-16,yposkogel,5,5);
public class AnimationDemo{
JFrame frame;
Animation animation;
void demo(){
frame=new JFrame("**Spees Inveeders** All rights reserved (Dave Senden and Joeri Oomen)");
animation=new Animation();
frame.getContentPane().add(animation);
frame.setSize(700,400);
frame.setVisible(true);
animation.start();
public static void main(String[] args){
AnimationDemo animationDemo=new AnimationDemo();
animationDemo.demo();
Maybe you are looking for
-
I have just purchased an 80gb iPod classic, and installed iTunes for the first time. I used Adobe Premier Elements 3.0 to convert 5 video clips of our children to iPod (H.264). Of the 5, 4 were imported as movies by iTunes. However, I cannot find a w
-
Hi All Need some help as I'm so rubbish at technology!! I have the OLD I phone 3 and tomorrow I'm getting my I phone 5, anyone know how to back up on I tunes? I know I'll have a new dimension, but I just wanted to transfered everything from my old ph
-
Problem in downloading the role
I am trying to download a role via tcode "/n/virsa/re_dnldroles" but it gives a message "unknown error occured" ..Can anybody provide some information on this. Why the role is not getting downloaded. ?
-
Bapi_po_create1 - enjoy purchase orders
Hi I am using bapi_po_create1 for purchase orders conversion. I have a problem in using this. Whatever delivery date i supply in bapimeposchedule-delivery_date, it is getting overridden with the default date else current date. would like to have a so
-
HELP!!! Something going on this morning with some apps
When I touch my phone this morning, a message keeps on popping up that different apps are stopped unexpectedly and to force close, and try again. It has happened with my white pages app, and other apps, but repeatedly my swiftkey app. Whats going on?