1 package version20;
2
10
11
12 import java.awt.Canvas;
13 import java.awt.Color;
14 import java.awt.Dimension;
15 import java.awt.Graphics2D;
16 import java.awt.Rectangle;
17 import java.awt.event.KeyEvent;
18 import java.awt.event.KeyListener;
19 import java.awt.event.WindowAdapter;
20 import java.awt.event.WindowEvent;
21 import java.awt.image.BufferStrategy;
22 import java.util.ArrayList;
23
24 import javax.swing.JFrame;
25 import javax.swing.JPanel;
26
27 public class Invaders extends Canvas implements Stage, KeyListener {
28
29 private BufferStrategy strategy;
30 private long usedTime;
31
32 private SpriteCache spriteCache;
33 private ArrayList actors;
34 private Player player;
35
36 public Invaders() {
37 spriteCache = new SpriteCache();
38
39
40 JFrame ventana = new JFrame("Invaders");
41 JPanel panel = (JPanel)ventana.getContentPane();
42 setBounds(0,0,Stage.WIDTH,Stage.HEIGHT);
43 panel.setPreferredSize(new Dimension(Stage.WIDTH,Stage.HEIGHT));
44 panel.setLayout(null);
45 panel.add(this);
46 ventana.setBounds(0,0,Stage.WIDTH,Stage.HEIGHT);
47 ventana.setVisible(true);
48 ventana.addWindowListener( new WindowAdapter() {
49 public void windowClosing(WindowEvent e) {
50 System.exit(0);
51 }
52 });
53 ventana.setResizable(false);
54 createBufferStrategy(2);
55 strategy = getBufferStrategy();
56 requestFocus();
57 addKeyListener(this);
58 }
59
60 public void initWorld() {
61 actors = new ArrayList();
62 for (int i = 0; i < 10; i++){
63 Monster m = new Monster(this);
64 m.setX( (int)(Math.random()*Stage.WIDTH) );
65 m.setY( i*20 );
66 m.setVx( (int)(Math.random()*20-10) );
67
68 actors.add(m);
69 }
70
71 player = new Player(this);
72 player.setX(Stage.WIDTH/2);
73 player.setY(Stage.HEIGHT - 2*player.getHeight());
74 }
75
76 public void addActor(Actor a) {
77 actors.add(a);
78 }
79
80 public void updateWorld() {
81 int i = 0;
82 while (i < actors.size()) {
83 Actor m = (Actor)actors.get(i);
84 if (m.isMarkedForRemoval()) {
85 actors.remove(i);
86 } else {
87 m.act();
88 i++;
89 }
90 }
91 player.act();
92 }
93
94 public void checkCollisions() {
95 Rectangle playerBounds = player.getBounds();
96 for (int i = 0; i < actors.size(); i++) {
97 Actor a1 = (Actor)actors.get(i);
98 Rectangle r1 = a1.getBounds();
99 if (r1.intersects(playerBounds)) {
100 player.collision(a1);
101 a1.collision(player);
102 }
103 for (int j = i+1; j < actors.size(); j++) {
104 Actor a2 = (Actor)actors.get(j);
105 Rectangle r2 = a2.getBounds();
106 if (r1.intersects(r2)) {
107 a1.collision(a2);
108 a2.collision(a1);
109 }
110 }
111 }
112 }
113
114 public void paintWorld() {
115 Graphics2D g = (Graphics2D)strategy.getDrawGraphics();
116 g.setColor(Color.black);
117 g.fillRect(0,0,getWidth(),getHeight());
118 for (int i = 0; i < actors.size(); i++) {
119 Actor m = (Actor)actors.get(i);
120 m.paint(g);
121 }
122 player.paint(g);
123
124 g.setColor(Color.white);
125 if (usedTime > 0)
126 g.drawString(String.valueOf(1000/usedTime)+" fps",0,Stage.HEIGHT-50);
127 else
128 g.drawString("--- fps",0,Stage.HEIGHT-50);
129 strategy.show();
130 }
131
132 public SpriteCache getSpriteCache() {
133 return spriteCache;
134 }
135
136 public void keyPressed(KeyEvent e) {
137 player.keyPressed(e);
138 }
139
140 public void keyReleased(KeyEvent e) {
141 player.keyReleased(e);
142 }
143 public void keyTyped(KeyEvent e) {}
144
145 public void game() {
146 usedTime=1000;
147 initWorld();
148 while (isVisible()) {
149 long startTime = System.currentTimeMillis();
150 updateWorld();
151 checkCollisions();
152 paintWorld();
153 usedTime = System.currentTimeMillis()-startTime;
154 try {
155 Thread.sleep(SPEED);
156 } catch (InterruptedException e) {}
157 }
158 }
159
160 public static void main(String[] args) {
161 Invaders inv = new Invaders();
162 inv.game();
163 }
164 }
165