Reputation: 1
this is my code actually it's just a moving space invader game. i search the internet for the animation i have tried the double buffering, it gets rid the flickering but its ruining the entire output. it also has java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details. this is so hard...
import javax.sound.sampled.*;
import java.applet.*;
import java.awt.*;
public class SpaceInvaders extends Applet implements Runnable{
AudioClip soundFile1;
int Xposition=500,Xposition1=-500,Yposition=15;
Thread runner;
public void start()
{
if (runner == null);
{
runner = new Thread(this);
runner.start();
}
}
public void stop()
{
if (runner != null);
{
runner.stop();
runner = null;
}
}
public void run()
{
while(true)
{
setBackground(Color.black);
repaint();
try {Thread.sleep(20);}
catch(InterruptedException e) { }
}
}
public void init()
{
soundFile1 = getAudioClip(getDocumentBase(),"si.au");
//soundFile1.play();
soundFile1.loop();
}
public void paint( Graphics g ) {
g.setColor( Color.orange );
g.fillRect(Xposition+50,10,10,10);
g.fillRect(Xposition+60,10,10,10);
g.fillRect(Xposition+40,20,10,10);
g.fillRect(Xposition+50,20,10,10);
g.fillRect(Xposition+60,20,10,10);
g.fillRect(Xposition+70,20,10,10);
g.fillRect(Xposition+30,30,10,10);
g.fillRect(Xposition+40,30,10,10);
g.fillRect(Xposition+50,30,10,10);
g.fillRect(Xposition+60,30,10,10);
g.fillRect(Xposition+70,30,10,10);
g.fillRect(Xposition+80,30,10,10);
g.fillRect(Xposition+20,40,10,10);
g.fillRect(Xposition+30,40,10,10);
g.fillRect(Xposition+50,40,10,10);
g.fillRect(Xposition+60,40,10,10);
g.fillRect(Xposition+80,40,10,10);
g.fillRect(Xposition+90,40,10,10);
g.fillRect(Xposition+20,50,10,10);
g.fillRect(Xposition+30,50,10,10);
g.fillRect(Xposition+40,50,10,10);
g.fillRect(Xposition+50,50,10,10);
g.fillRect(Xposition+60,50,10,10);
g.fillRect(Xposition+70,50,10,10);
g.fillRect(Xposition+80,50,10,10);
g.fillRect(Xposition+90,50,10,10);
g.fillRect(Xposition+40,60,10,10);
g.fillRect(Xposition+70,60,10,10);
g.fillRect(Xposition+30,70,10,10);
g.fillRect(Xposition+50,70,10,10);
g.fillRect(Xposition+60,70,10,10);
g.fillRect(Xposition+80,70,10,10);
g.fillRect(Xposition+20,80,10,10);
g.fillRect(Xposition+40,80,10,10);
g.fillRect(Xposition+70,80,10,10);
g.fillRect(Xposition+90,80,10,10);
g.setColor(Color.red);
g.fillRect(Xposition+140,10,10,10);
g.fillRect(Xposition+200,10,10,10);
g.fillRect(Xposition+120,20,10,10);
g.fillRect(Xposition+150,20,10,10);
g.fillRect(Xposition+190,20,10,10);
g.fillRect(Xposition+220,20,10,10);
g.fillRect(Xposition+120,30,10,10);
g.fillRect(Xposition+140,30,10,10);
g.fillRect(Xposition+150,30,10,10);
g.fillRect(Xposition+160,30,10,10);
g.fillRect(Xposition+170,30,10,10);
g.fillRect(Xposition+180,30,10,10);
g.fillRect(Xposition+190,30,10,10);
g.fillRect(Xposition+200,30,10,10);
g.fillRect(Xposition+220,30,10,10);
g.fillRect(Xposition+120,40,10,10);
g.fillRect(Xposition+130,40,10,10);
g.fillRect(Xposition+140,40,10,10);
g.fillRect(Xposition+160,40,10,10);
g.fillRect(Xposition+170,40,10,10);
g.fillRect(Xposition+180,40,10,10);
g.fillRect(Xposition+200,40,10,10);
g.fillRect(Xposition+210,40,10,10);
g.fillRect(Xposition+220,40,10,10);
g.fillRect(Xposition+120,50,10,10);
g.fillRect(Xposition+130,50,10,10);
g.fillRect(Xposition+140,50,10,10);
g.fillRect(Xposition+150,50,10,10);
g.fillRect(Xposition+160,50,10,10);
g.fillRect(Xposition+170,50,10,10);
g.fillRect(Xposition+180,50,10,10);
g.fillRect(Xposition+190,50,10,10);
g.fillRect(Xposition+200,50,10,10);
g.fillRect(Xposition+210,50,10,10);
g.fillRect(Xposition+220,50,10,10);
g.fillRect(Xposition+130,60,10,10);
g.fillRect(Xposition+140,60,10,10);
g.fillRect(Xposition+150,60,10,10);
g.fillRect(Xposition+160,60,10,10);
g.fillRect(Xposition+170,60,10,10);
g.fillRect(Xposition+180,60,10,10);
g.fillRect(Xposition+190,60,10,10);
g.fillRect(Xposition+200,60,10,10);
g.fillRect(Xposition+210,60,10,10);
g.fillRect(Xposition+140,70,10,10);
g.fillRect(Xposition+200,70,10,10);
g.fillRect(Xposition+130,80,10,10);
g.fillRect(Xposition+210,80,10,10);
g.setColor(Color.blue);
g.fillRect(Xposition+280,10,10,10);
g.fillRect(Xposition+290,10,10,10);
g.fillRect(Xposition+270,20,10,10);
g.fillRect(Xposition+280,20,10,10);
g.fillRect(Xposition+290,20,10,10);
g.fillRect(Xposition+300,20,10,10);
g.fillRect(Xposition+260,30,10,10);
g.fillRect(Xposition+270,30,10,10);
g.fillRect(Xposition+280,30,10,10);
g.fillRect(Xposition+290,30,10,10);
g.fillRect(Xposition+300,30,10,10);
g.fillRect(Xposition+310,30,10,10);
g.fillRect(Xposition+250,40,10,10);
g.fillRect(Xposition+260,40,10,10);
g.fillRect(Xposition+280,40,10,10);
g.fillRect(Xposition+290,40,10,10);
g.fillRect(Xposition+310,40,10,10);
g.fillRect(Xposition+320,40,10,10);
g.fillRect(Xposition+250,50,10,10);
g.fillRect(Xposition+260,50,10,10);
g.fillRect(Xposition+270,50,10,10);
g.fillRect(Xposition+280,50,10,10);
g.fillRect(Xposition+290,50,10,10);
g.fillRect(Xposition+300,50,10,10);
g.fillRect(Xposition+310,50,10,10);
g.fillRect(Xposition+320,50,10,10); //20=250 30=260 40=270 50=280 60=290 70=300 80=310 90=320
g.fillRect(Xposition+260,60,10,10);
g.fillRect(Xposition+280,60,10,10);
g.fillRect(Xposition+290,60,10,10);
g.fillRect(Xposition+310,60,10,10);
g.fillRect(Xposition+250,70,10,10);
g.fillRect(Xposition+320,70,10,10);
g.fillRect(Xposition+260,80,10,10);
g.fillRect(Xposition+310,80,10,10);
g.setColor(Color.yellow);
g.fillRect(Xposition+370,10,10,10);
g.fillRect(Xposition+430,10,10,10);
g.fillRect(Xposition+380,20,10,10);
g.fillRect(Xposition+420,20,10,10);
g.fillRect(Xposition+370,30,10,10);
g.fillRect(Xposition+380,30,10,10);
g.fillRect(Xposition+390,30,10,10);
g.fillRect(Xposition+400,30,10,10);
g.fillRect(Xposition+410,30,10,10);
g.fillRect(Xposition+420,30,10,10);
g.fillRect(Xposition+430,30,10,10);
g.fillRect(Xposition+360,40,10,10);
g.fillRect(Xposition+370,40,10,10);
g.fillRect(Xposition+390,40,10,10);
g.fillRect(Xposition+400,40,10,10);
g.fillRect(Xposition+410,40,10,10);
g.fillRect(Xposition+430,40,10,10);
g.fillRect(Xposition+440,40,10,10);
g.fillRect(Xposition+350,50,10,10);
g.fillRect(Xposition+360,50,10,10);
g.fillRect(Xposition+370,50,10,10);
g.fillRect(Xposition+380,50,10,10);
g.fillRect(Xposition+390,50,10,10);
g.fillRect(Xposition+400,50,10,10);
g.fillRect(Xposition+410,50,10,10);
g.fillRect(Xposition+420,50,10,10);
g.fillRect(Xposition+430,50,10,10);
g.fillRect(Xposition+440,50,10,10);
g.fillRect(Xposition+450,50,10,10); //120=350 130=360 140=370 150=380 160=390 170=400 180=410 190=420 200=430 210=440 220=450
g.fillRect(Xposition+350,60,10,10);
g.fillRect(Xposition+370,60,10,10);
g.fillRect(Xposition+380,60,10,10);
g.fillRect(Xposition+390,60,10,10);
g.fillRect(Xposition+400,60,10,10);
g.fillRect(Xposition+410,60,10,10);
g.fillRect(Xposition+420,60,10,10);
g.fillRect(Xposition+430,60,10,10);
g.fillRect(Xposition+450,60,10,10);
g.fillRect(Xposition+350,70,10,10);
g.fillRect(Xposition+370,70,10,10);
g.fillRect(Xposition+430,70,10,10);
g.fillRect(Xposition+450,70,10,10);
g.fillRect(Xposition+380,80,10,10);
g.fillRect(Xposition+390,80,10,10);
g.fillRect(Xposition+410,80,10,10);
g.fillRect(Xposition+420,80,10,10);
Xposition--;
if (Xposition < -500)
{
Xposition = 500;
}
g.setColor(Color.green);
g.fillRect(Xposition1+230,130,10,10);
g.fillRect(Xposition1+240,130,10,10);
g.fillRect(Xposition1+250,130,10,10);
g.fillRect(Xposition1+260,130,10,10);
g.fillRect(Xposition1+270,130,10,10);
g.fillRect(Xposition1+280,130,10,10);
g.fillRect(Xposition1+210,140,10,10);
g.fillRect(Xposition1+220,140,10,10);
g.fillRect(Xposition1+230,140,10,10);
g.fillRect(Xposition1+240,140,10,10);
g.fillRect(Xposition1+250,140,10,10);
g.fillRect(Xposition1+260,140,10,10);
g.fillRect(Xposition1+270,140,10,10);
g.fillRect(Xposition1+280,140,10,10);
g.fillRect(Xposition1+290,140,10,10);
g.fillRect(Xposition1+300,140,10,10);
g.fillRect(Xposition1+200,150,10,10);
g.fillRect(Xposition1+210,150,10,10);
g.fillRect(Xposition1+220,150,10,10);
g.fillRect(Xposition1+230,150,10,10);
g.fillRect(Xposition1+240,150,10,10);
g.fillRect(Xposition1+250,150,10,10);
g.fillRect(Xposition1+260,150,10,10);
g.fillRect(Xposition1+270,150,10,10);
g.fillRect(Xposition1+280,150,10,10);
g.fillRect(Xposition1+290,150,10,10);
g.fillRect(Xposition1+300,150,10,10);
g.fillRect(Xposition1+310,150,10,10);
g.fillRect(Xposition1+190,160,10,10);
g.fillRect(Xposition1+200,160,10,10);
g.fillRect(Xposition1+220,160,10,10);
g.fillRect(Xposition1+230,160,10,10);
g.fillRect(Xposition1+250,160,10,10);
g.fillRect(Xposition1+260,160,10,10);
g.fillRect(Xposition1+280,160,10,10);
g.fillRect(Xposition1+290,160,10,10);
g.fillRect(Xposition1+310,160,10,10);
g.fillRect(Xposition1+320,160,10,10);
g.fillRect(Xposition1+180,170,10,10);
g.fillRect(Xposition1+190,170,10,10);
g.fillRect(Xposition1+200,170,10,10);
g.fillRect(Xposition1+210,170,10,10);
g.fillRect(Xposition1+220,170,10,10);
g.fillRect(Xposition1+230,170,10,10);
g.fillRect(Xposition1+240,170,10,10);
g.fillRect(Xposition1+250,170,10,10);
g.fillRect(Xposition1+260,170,10,10);
g.fillRect(Xposition1+270,170,10,10);
g.fillRect(Xposition1+280,170,10,10);
g.fillRect(Xposition1+290,170,10,10);
g.fillRect(Xposition1+300,170,10,10);
g.fillRect(Xposition1+310,170,10,10);
g.fillRect(Xposition1+320,170,10,10);
g.fillRect(Xposition1+330,170,10,10);
g.fillRect(Xposition1+200,180,10,10);
g.fillRect(Xposition1+210,180,10,10);
g.fillRect(Xposition1+220,180,10,10);
g.fillRect(Xposition1+250,180,10,10);
g.fillRect(Xposition1+260,180,10,10);
g.fillRect(Xposition1+290,180,10,10);
g.fillRect(Xposition1+300,180,10,10);
g.fillRect(Xposition1+310,180,10,10);
g.fillRect(Xposition1+210,190,10,10);
g.fillRect(Xposition1+300,190,10,10);
Xposition1++;
if (Xposition1 > 500)
{
Xposition1 = -500;
}
Yposition--;
if (Yposition > 500)
{
Yposition = -500;
}
g.setColor(Color.magenta);
g.fillRect(260,Yposition+240,10,10);
g.fillRect(260,Yposition+250,10,10);
g.setColor(Color.white);
g.fillRect(260,310,10,10);
g.fillRect(250,320,10,10);
g.fillRect(260,320,10,10);
g.fillRect(270,320,10,10);
g.fillRect(250,330,10,10);
g.fillRect(260,330,10,10);
g.fillRect(270,330,10,10);
g.fillRect(200,340,10,10);
g.fillRect(210,340,10,10);
g.fillRect(220,340,10,10);
g.fillRect(230,340,10,10);
g.fillRect(240,340,10,10);
g.fillRect(250,340,10,10);
g.fillRect(260,340,10,10);
g.fillRect(270,340,10,10);
g.fillRect(280,340,10,10);
g.fillRect(290,340,10,10);
g.fillRect(300,340,10,10);
g.fillRect(310,340,10,10);
g.fillRect(320,340,10,10);
g.fillRect(190,350,10,10);
g.fillRect(200,350,10,10);
g.fillRect(210,350,10,10);
g.fillRect(220,350,10,10);
g.fillRect(230,350,10,10);
g.fillRect(240,350,10,10);
g.fillRect(250,350,10,10);
g.fillRect(260,350,10,10);
g.fillRect(270,350,10,10);
g.fillRect(280,350,10,10);
g.fillRect(290,350,10,10);
g.fillRect(300,350,10,10);
g.fillRect(310,350,10,10);
g.fillRect(320,350,10,10);
g.fillRect(330,350,10,10);
g.fillRect(190,360,10,10);
g.fillRect(200,360,10,10);
g.fillRect(210,360,10,10);
g.fillRect(220,360,10,10);
g.fillRect(230,360,10,10);
g.fillRect(240,360,10,10);
g.fillRect(250,360,10,10);
g.fillRect(260,360,10,10);
g.fillRect(270,360,10,10);
g.fillRect(280,360,10,10);
g.fillRect(290,360,10,10);
g.fillRect(300,360,10,10);
g.fillRect(310,360,10,10);
g.fillRect(320,360,10,10);
g.fillRect(330,360,10,10);
g.fillRect(190,370,10,10);
g.fillRect(200,370,10,10);
g.fillRect(210,370,10,10);
g.fillRect(220,370,10,10);
g.fillRect(230,370,10,10);
g.fillRect(240,370,10,10);
g.fillRect(250,370,10,10);
g.fillRect(260,370,10,10);
g.fillRect(270,370,10,10);
g.fillRect(280,370,10,10);
g.fillRect(290,370,10,10);
g.fillRect(300,370,10,10);
g.fillRect(310,370,10,10);
g.fillRect(320,370,10,10);
g.fillRect(330,370,10,10);
g.fillRect(190,380,10,10);
g.fillRect(200,380,10,10);
g.fillRect(210,380,10,10);
g.fillRect(220,380,10,10);
g.fillRect(230,380,10,10);
g.fillRect(240,380,10,10);
g.fillRect(250,380,10,10);
g.fillRect(260,380,10,10);
g.fillRect(270,380,10,10);
g.fillRect(280,380,10,10);
g.fillRect(290,380,10,10);
g.fillRect(300,380,10,10);
g.fillRect(310,380,10,10);
g.fillRect(320,380,10,10);
g.fillRect(330,380,10,10);
}
public static void main(String[] args)
{
}
}
Upvotes: 0
Views: 456
Reputation: 347334
First of all, don't do this.
public void run() {
while (true) {
setBackground(Color.black);
repaint();
try {
Thread.sleep(20);
} catch (InterruptedException e) {
}
}
}
While I appricate that this is being run from inside a Runnable
context, you are effecting the UI from outside the Event Dispatching Thread, which is NEVER a good idea.
You're better of using a javax.swing.Timer
, see How to use Swing Timers for more info.
Second of all. There is nothing double buffered about your sample code.
Double buffering would have you using an off-screen buffered (such as a BufferedImage
) to draw the contents of the screen to before it's rendered to the screen.
Thridly, if you don't want to implement your own double buffering solution, I would use a JPanel
or JComponent
and add them to a JAppelt
. JComponent
(and it's children) support double buffering by default (you shouldn't paint directly to a top level container, there's to much icky stuff going on under the hood you don't want to have to become responsible for).
Fourthly, I would take some serious time to read through the Graphics 2D tutorial.
UPDATE
Here's my take on the basic idea. Note, I've not added the player, you can figure that out.
public class SpaceFrame {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
new SpaceFrame();
}
});
}
public SpaceFrame() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new SpacePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
protected class SpacePane extends JPanel implements Screen {
private BufferedImage buffer;
public SpacePane() {
}
@Override
public void addNotify() {
super.addNotify();
// We need to make that the screen pane is actually on the screen...
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Thread thread = new Thread(new UpdaterThread(SpacePane.this));
thread.setDaemon(true);
thread.start();
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(600, 400);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (buffer != null) {
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(buffer, 0, 0, this);
}
}
@Override
public void renderBuffer(final BufferedImage image) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
buffer = image;
repaint();
}
});
}
}
protected interface Screen {
public Dimension getSize();
public void renderBuffer(final BufferedImage image);
}
protected class UpdaterThread implements Runnable {
private int cycle = 0;
private BufferedImage[] buffers = new BufferedImage[2];
private Screen screen;
// A row of aliens...
private RowOfAliens rowOfAliens;
// Adjusts the speed at which the aliens move
private int speed = 10;
public UpdaterThread(Screen screen) {
this.screen = screen;
}
public Screen getScreen() {
return screen;
}
@Override
public void run() {
// We're only using 1 row...
rowOfAliens = new RowOfAliens();
rowOfAliens.setLocation(new Point(0, 0));
rowOfAliens.setDirection(10);
while (true) {
try {
Thread.sleep(16); // 60 fps
} catch (InterruptedException ex) {
}
cycle++;
// Update the offscreen buffer...
BufferedImage buffer = getBuffer();
if (buffer != null) {
// Move the alients...
updateAliens();
// Paint the various layers
int width = buffer.getWidth();
int height = buffer.getHeight();
Graphics2D g2d = buffer.createGraphics();
// You could paint a space scape here
paintBackground(g2d, width, height);
// The aliens and other game arifcates
paintMidground(g2d, width, height);
// Special effects
paintForeground(g2d, width, height);
g2d.dispose();
// Send the buffer to the screen
paintBuffer(buffer);
}
}
}
protected void updateAliens() {
Screen screen = getScreen();
if (screen != null) {
// Controls the speed at which the aliens move
if (cycle % speed == 0) {
// Get the aliens current location and direction...
Point p = rowOfAliens.getLocation();
p.x += rowOfAliens.getDirection();
int screenWidth = screen.getSize().width;
int screenHeight = screen.getSize().height;
// Boundray check...
if (p.x + rowOfAliens.getBounds().width > screenWidth) {
p.x = screenWidth - rowOfAliens.getBounds().width;
// Reverse direction
rowOfAliens.setDirection(-10);
p.y += 10;
} else if (p.x < 0) {
p.x = 0;
p.y += 10;
// Reverse direction
rowOfAliens.setDirection(10);
}
// Set the location of the row...
rowOfAliens.setLocation(p);
}
}
}
protected void paintBackground(Graphics2D g2d, int width, int height) {
g2d.setColor(Color.BLACK);
g2d.fillRect(0, 0, width, height);
}
protected void paintMidground(Graphics2D g2d, int width, int height) {
Point p = rowOfAliens.getLocation();
g2d.translate(p.x, p.y);
rowOfAliens.paint(g2d);
g2d.translate(-p.x, -p.y);
}
protected void paintForeground(Graphics2D g2d, int width, int height) {
}
protected BufferedImage getBuffer() {
BufferedImage buffer = null;
Screen screen = getScreen();
if (screen != null) {
// Determine which buffer to use
int index = 0;
if (cycle % 2 != 0) {
index = 1;
}
buffer = buffers[index];
if (buffer == null || buffer.getWidth() != screen.getSize().width || buffer.getHeight() != screen.getSize().height) {
// Create a compataible graphics object, so it will render faster on the screen...
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
buffer = gc.createCompatibleImage(screen.getSize().width, screen.getSize().height, Transparency.OPAQUE);
buffers[index] = buffer;
}
}
return buffer;
}
protected void paintBuffer(BufferedImage buffer) {
// Send the buffer to the screen...
Screen screen = getScreen();
if (screen != null) {
screen.renderBuffer(buffer);
}
}
}
protected class RowOfAliens {
private List<Alien> lstAliens;
private Point location;
private int direction;
private Rectangle bounds;
public RowOfAliens() {
lstAliens = new ArrayList<Alien>(25);
lstAliens.add(new AlienType1());
lstAliens.add(new AlienType2());
lstAliens.add(new AlienType3());
lstAliens.add(new AlienType4());
setLocation(new Point(0, 0));
// Calculate the size of the row...
bounds = new Rectangle(Integer.MAX_VALUE, Integer.MAX_VALUE, 0, 0);
int index = 0;
for (Alien alien : lstAliens) {
Rectangle aBounds = alien.getBounds();
aBounds.setLocation(alien.getLocation());
System.out.println(index + ": " + aBounds);
bounds.x = Math.min(bounds.x, aBounds.x);
bounds.y = Math.min(bounds.y, aBounds.y);
bounds.width = Math.max(bounds.width, aBounds.x + aBounds.width);
bounds.height = Math.max(bounds.height, aBounds.y + aBounds.height);
}
System.out.println(bounds);
}
protected void paint(Graphics2D g2d) {
// Paint the aliens
Point pos = getLocation();
for (Alien alien : lstAliens) {
g2d.setColor(alien.getColor());
Point p = alien.getLocation();
// We need to take into account the current location of the row
// in relation to the alien...
int xPos = p.x - pos.x;
g2d.translate(xPos, 0);
g2d.fill(alien);
g2d.translate(-xPos, 0);
}
}
protected void layoutRow() {
// Layout the aliens within there row based on the currrent location...
// Techniqually, we could offset the aliens at 0x0 and simply adjust the
// the x position by the width of each alien and it's gap
// This would eliminate the need to adjust the position in the
// paint method, but hay...
Point p = new Point(getLocation());
for (Alien alien : lstAliens) {
alien.setLocation(p);
p = new Point(p.x, p.y);
p.x += alien.getBounds().width + 10;
}
}
public Rectangle getBounds() {
return bounds;
}
public void setLocation(Point point) {
if (location == null || point == null || (!location.equals(point))) {
location = point;
layoutRow();
}
}
public Point getLocation() {
return new Point(location);
}
public void setDirection(int value) {
direction = value;
}
public int getDirection() {
return direction;
}
}
protected abstract class Alien extends Path2D.Float {
private Point location;
private Color color;
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
public void setLocation(Point location) {
this.location = location;
}
public Point getLocation() {
return location;
}
public void addRectangle(int x, int y, int width, int height) {
moveTo(x, y);
lineTo(x + width, y);
lineTo(x + width, y + height);
lineTo(x, y + height);
lineTo(x, y);
}
}
protected class AlienType1 extends Alien {
public AlienType1() {
setColor(Color.ORANGE);
addRectangle(30, 0, 10, 10);
addRectangle(40, 0, 10, 10);
addRectangle(20, 10, 10, 10);
addRectangle(30, 10, 10, 10);
addRectangle(40, 10, 10, 10);
addRectangle(50, 10, 10, 10);
addRectangle(10, 20, 10, 10);
addRectangle(20, 20, 10, 10);
addRectangle(30, 20, 10, 10);
addRectangle(40, 20, 10, 10);
addRectangle(50, 20, 10, 10);
addRectangle(60, 20, 10, 10);
addRectangle(0, 30, 10, 10);
addRectangle(10, 30, 10, 10);
addRectangle(30, 30, 10, 10);
addRectangle(40, 30, 10, 10);
addRectangle(60, 30, 10, 10);
addRectangle(70, 30, 10, 10);
addRectangle(0, 40, 10, 10);
addRectangle(10, 40, 10, 10);
addRectangle(20, 40, 10, 10);
addRectangle(30, 40, 10, 10);
addRectangle(40, 40, 10, 10);
addRectangle(50, 40, 10, 10);
addRectangle(60, 40, 10, 10);
addRectangle(70, 40, 10, 10);
addRectangle(20, 50, 10, 10);
addRectangle(50, 50, 10, 10);
addRectangle(10, 60, 10, 10);
addRectangle(30, 60, 10, 10);
addRectangle(40, 60, 10, 10);
addRectangle(60, 60, 10, 10);
addRectangle(0, 70, 10, 10);
addRectangle(20, 70, 10, 10);
addRectangle(50, 70, 10, 10);
addRectangle(70, 70, 10, 10);
closePath();
}
}
protected class AlienType2 extends Alien {
public AlienType2() {
setColor(Color.RED);
addRectangle(20, 0, 10, 10);
addRectangle(80, 0, 10, 10);
addRectangle(0, 10, 10, 10);
addRectangle(30, 10, 10, 10);
addRectangle(70, 10, 10, 10);
addRectangle(100, 10, 10, 10);
addRectangle(0, 20, 10, 10);
addRectangle(20, 20, 10, 10);
addRectangle(30, 20, 10, 10);
addRectangle(40, 20, 10, 10);
addRectangle(50, 20, 10, 10);
addRectangle(60, 20, 10, 10);
addRectangle(70, 20, 10, 10);
addRectangle(80, 20, 10, 10);
addRectangle(100, 20, 10, 10);
addRectangle(0, 30, 10, 10);
addRectangle(10, 30, 10, 10);
addRectangle(20, 30, 10, 10);
addRectangle(40, 30, 10, 10);
addRectangle(50, 30, 10, 10);
addRectangle(60, 30, 10, 10);
addRectangle(80, 30, 10, 10);
addRectangle(90, 30, 10, 10);
addRectangle(100, 30, 10, 10);
addRectangle(0, 40, 10, 10);
addRectangle(10, 40, 10, 10);
addRectangle(20, 40, 10, 10);
addRectangle(30, 40, 10, 10);
addRectangle(40, 40, 10, 10);
addRectangle(50, 40, 10, 10);
addRectangle(60, 40, 10, 10);
addRectangle(70, 40, 10, 10);
addRectangle(80, 40, 10, 10);
addRectangle(90, 40, 10, 10);
addRectangle(100, 40, 10, 10);
addRectangle(10, 50, 10, 10);
addRectangle(20, 50, 10, 10);
addRectangle(30, 50, 10, 10);
addRectangle(40, 50, 10, 10);
addRectangle(50, 50, 10, 10);
addRectangle(60, 50, 10, 10);
addRectangle(70, 50, 10, 10);
addRectangle(80, 50, 10, 10);
addRectangle(90, 50, 10, 10);
addRectangle(20, 60, 10, 10);
addRectangle(80, 60, 10, 10);
addRectangle(10, 70, 10, 10);
addRectangle(90, 70, 10, 10);
closePath();
}
}
protected class AlienType3 extends Alien {
public AlienType3() {
setColor(Color.YELLOW);
addRectangle(20, 0, 10, 10);
addRectangle(20, 0, 10, 10);
addRectangle(80, 0, 10, 10);
addRectangle(30, 10, 10, 10);
addRectangle(70, 10, 10, 10);
addRectangle(20, 20, 10, 10);
addRectangle(30, 20, 10, 10);
addRectangle(40, 20, 10, 10);
addRectangle(50, 20, 10, 10);
addRectangle(60, 20, 10, 10);
addRectangle(70, 20, 10, 10);
addRectangle(80, 20, 10, 10);
addRectangle(10, 30, 10, 10);
addRectangle(20, 30, 10, 10);
addRectangle(40, 30, 10, 10);
addRectangle(50, 30, 10, 10);
addRectangle(60, 30, 10, 10);
addRectangle(80, 30, 10, 10);
addRectangle(90, 30, 10, 10);
addRectangle(0, 40, 10, 10);
addRectangle(10, 40, 10, 10);
addRectangle(20, 40, 10, 10);
addRectangle(30, 40, 10, 10);
addRectangle(40, 40, 10, 10);
addRectangle(50, 40, 10, 10);
addRectangle(60, 40, 10, 10);
addRectangle(70, 40, 10, 10);
addRectangle(80, 40, 10, 10);
addRectangle(90, 40, 10, 10);
addRectangle(100, 40, 10, 10);
addRectangle(0, 50, 10, 10);
addRectangle(20, 50, 10, 10);
addRectangle(30, 50, 10, 10);
addRectangle(40, 50, 10, 10);
addRectangle(50, 50, 10, 10);
addRectangle(60, 50, 10, 10);
addRectangle(70, 50, 10, 10);
addRectangle(80, 50, 10, 10);
addRectangle(100, 50, 10, 10);
addRectangle(0, 60, 10, 10);
addRectangle(20, 60, 10, 10);
addRectangle(80, 60, 10, 10);
addRectangle(100, 60, 10, 10);
addRectangle(30, 70, 10, 10);
addRectangle(40, 70, 10, 10);
addRectangle(60, 70, 10, 10);
addRectangle(70, 70, 10, 10);
closePath();
}
}
protected class AlienType4 extends Alien {
public AlienType4() {
setColor(Color.GREEN);
addRectangle(50, 0, 10, 10);
addRectangle(60, 0, 10, 10);
addRectangle(70, 0, 10, 10);
addRectangle(80, 0, 10, 10);
addRectangle(90, 0, 10, 10);
addRectangle(100, 0, 10, 10);
addRectangle(30, 10, 10, 10);
addRectangle(40, 10, 10, 10);
addRectangle(50, 10, 10, 10);
addRectangle(60, 10, 10, 10);
addRectangle(70, 10, 10, 10);
addRectangle(80, 10, 10, 10);
addRectangle(90, 10, 10, 10);
addRectangle(100, 10, 10, 10);
addRectangle(110, 10, 10, 10);
addRectangle(120, 10, 10, 10);
addRectangle(20, 20, 10, 10);
addRectangle(30, 20, 10, 10);
addRectangle(40, 20, 10, 10);
addRectangle(50, 20, 10, 10);
addRectangle(60, 20, 10, 10);
addRectangle(70, 20, 10, 10);
addRectangle(80, 20, 10, 10);
addRectangle(90, 20, 10, 10);
addRectangle(100, 20, 10, 10);
addRectangle(110, 20, 10, 10);
addRectangle(120, 20, 10, 10);
addRectangle(130, 20, 10, 10);
addRectangle(10, 30, 10, 10);
addRectangle(20, 30, 10, 10);
addRectangle(40, 30, 10, 10);
addRectangle(50, 30, 10, 10);
addRectangle(70, 30, 10, 10);
addRectangle(80, 30, 10, 10);
addRectangle(100, 30, 10, 10);
addRectangle(110, 30, 10, 10);
addRectangle(130, 30, 10, 10);
addRectangle(140, 30, 10, 10);
addRectangle(0, 40, 10, 10);
addRectangle(10, 40, 10, 10);
addRectangle(20, 40, 10, 10);
addRectangle(30, 40, 10, 10);
addRectangle(40, 40, 10, 10);
addRectangle(50, 40, 10, 10);
addRectangle(60, 40, 10, 10);
addRectangle(70, 40, 10, 10);
addRectangle(80, 40, 10, 10);
addRectangle(90, 40, 10, 10);
addRectangle(100, 40, 10, 10);
addRectangle(110, 40, 10, 10);
addRectangle(120, 40, 10, 10);
addRectangle(130, 40, 10, 10);
addRectangle(140, 40, 10, 10);
addRectangle(150, 40, 10, 10);
addRectangle(20, 50, 10, 10);
addRectangle(30, 50, 10, 10);
addRectangle(40, 50, 10, 10);
addRectangle(70, 50, 10, 10);
addRectangle(80, 50, 10, 10);
addRectangle(110, 50, 10, 10);
addRectangle(120, 50, 10, 10);
addRectangle(130, 50, 10, 10);
addRectangle(30, 60, 10, 10);
addRectangle(120, 60, 10, 10);
closePath();
}
}
}
Upvotes: 1