1 package version25;
2
10
11
12 import java.awt.Canvas;
13 import java.awt.Color;
14 import java.awt.Dimension;
15 import java.awt.Font;
16 import java.awt.Graphics2D;
17 import java.awt.Rectangle;
18 import java.awt.TexturePaint;
19 import java.awt.event.KeyEvent;
20 import java.awt.event.KeyListener;
21 import java.awt.event.WindowAdapter;
22 import java.awt.event.WindowEvent;
23 import java.awt.image.BufferStrategy;
24 import java.awt.image.BufferedImage;
25 import java.util.ArrayList;
26
27 import javax.swing.JFrame;
28 import javax.swing.JPanel;
29
30 public class Invaders extends Canvas implements Stage, KeyListener {
31
32 private BufferStrategy strategy;
33 private long usedTime;
34
35 private SpriteCache spriteCache;
36 private ArrayList actors;
37 private Player player;
38 private BufferedImage ocean;
39 private int t;
40
41 private boolean gameEnded=false;
42
43 public Invaders() {
44 spriteCache = new SpriteCache();
45
46
47 JFrame ventana = new JFrame("Invaders");
48 JPanel panel = (JPanel)ventana.getContentPane();
49 setBounds(0,0,Stage.WIDTH,Stage.HEIGHT);
50 panel.setPreferredSize(new Dimension(Stage.WIDTH,Stage.HEIGHT));
51 panel.setLayout(null);
52 panel.add(this);
53 ventana.setBounds(0,0,Stage.WIDTH,Stage.HEIGHT);
54 ventana.setVisible(true);
55 ventana.addWindowListener( new WindowAdapter() {
56 public void windowClosing(WindowEvent e) {
57 System.exit(0);
58 }
59 });
60 ventana.setResizable(false);
61 createBufferStrategy(2);
62 strategy = getBufferStrategy();
63 requestFocus();
64 addKeyListener(this);
65 }
66
67 public void gameOver() {
68 gameEnded = true;
69 }
70
71 public void initWorld() {
72 actors = new ArrayList();
73 for (int i = 0; i < 10; i++){
74 Monster m = new Monster(this);
75 m.setX( (int)(Math.random()*Stage.WIDTH) );
76 m.setY( i*20 );
77 m.setVx( (int)(Math.random()*20-10) );
78
79 actors.add(m);
80 }
81
82 player = new Player(this);
83 player.setX(Stage.WIDTH/2);
84 player.setY(Stage.PLAY_HEIGHT - 2*player.getHeight());
85 }
86
87 public void addActor(Actor a) {
88 actors.add(a);
89 }
90
91 public Player getPlayer() {
92 return player;
93 }
94
95 public void updateWorld() {
96 int i = 0;
97 while (i < actors.size()) {
98 Actor m = (Actor)actors.get(i);
99 if (m.isMarkedForRemoval()) {
100 actors.remove(i);
101 } else {
102 m.act();
103 i++;
104 }
105 }
106 player.act();
107 }
108
109 public void checkCollisions() {
110 Rectangle playerBounds = player.getBounds();
111 for (int i = 0; i < actors.size(); i++) {
112 Actor a1 = (Actor)actors.get(i);
113 Rectangle r1 = a1.getBounds();
114 if (r1.intersects(playerBounds)) {
115 player.collision(a1);
116 a1.collision(player);
117 }
118 for (int j = i+1; j < actors.size(); j++) {
119 Actor a2 = (Actor)actors.get(j);
120 Rectangle r2 = a2.getBounds();
121 if (r1.intersects(r2)) {
122 a1.collision(a2);
123 a2.collision(a1);
124 }
125 }
126 }
127 }
128
129 public void paintShields(Graphics2D g) {
130 g.setPaint(Color.red);
131 g.fillRect(280,Stage.PLAY_HEIGHT,Player.MAX_SHIELDS,30);
132 g.setPaint(Color.blue);
133 g.fillRect(280+Player.MAX_SHIELDS-player.getShields(),Stage.PLAY_HEIGHT,player.getShields(),30);
134 g.setFont(new Font("Arial",Font.BOLD,20));
135 g.setPaint(Color.green);
136 g.drawString("Shields",170,Stage.PLAY_HEIGHT+20);
137
138 }
139
140 public void paintScore(Graphics2D g) {
141 g.setFont(new Font("Arial",Font.BOLD,20));
142 g.setPaint(Color.green);
143 g.drawString("Score:",20,Stage.PLAY_HEIGHT + 20);
144 g.setPaint(Color.red);
145 g.drawString(player.getScore()+"",100,Stage.PLAY_HEIGHT + 20);
146 }
147
148 public void paintAmmo(Graphics2D g) {
149 int xBase = 280+Player.MAX_SHIELDS+10;
150 for (int i = 0; i < player.getClusterBombs();i++) {
151 BufferedImage bomb = spriteCache.getSprite("bombUL.gif");
152 g.drawImage( bomb ,xBase+i*bomb.getWidth(),Stage.PLAY_HEIGHT,this);
153 }
154 }
155
156 public void paintfps(Graphics2D g) {
157 g.setFont( new Font("Arial",Font.BOLD,12));
158 g.setColor(Color.white);
159 if (usedTime > 0)
160 g.drawString(String.valueOf(1000/usedTime)+" fps",Stage.WIDTH-50,Stage.PLAY_HEIGHT);
161 else
162 g.drawString("--- fps",Stage.WIDTH-50,Stage.PLAY_HEIGHT);
163 }
164
165
166 public void paintStatus(Graphics2D g) {
167 paintScore(g);
168 paintShields(g);
169 paintAmmo(g);
170 paintfps(g);
171 }
172
173 public void paintWorld() {
174 Graphics2D g = (Graphics2D)strategy.getDrawGraphics();
175 ocean = spriteCache.getSprite("oceano.gif");
176 g.setPaint(new TexturePaint(ocean, new Rectangle(0,t,ocean.getWidth(),ocean.getHeight())));
177 g.fillRect(0,0,getWidth(),getHeight());
178 for (int i = 0; i < actors.size(); i++) {
179 Actor m = (Actor)actors.get(i);
180 m.paint(g);
181 }
182 player.paint(g);
183
184
185 paintStatus(g);
186 strategy.show();
187 }
188
189 public void paintGameOver() {
190 Graphics2D g = (Graphics2D)strategy.getDrawGraphics();
191 g.setColor(Color.white);
192 g.setFont(new Font("Arial",Font.BOLD,20));
193 g.drawString("GAME OVER",Stage.WIDTH/2-50,Stage.HEIGHT/2);
194 strategy.show();
195 }
196
197 public SpriteCache getSpriteCache() {
198 return spriteCache;
199 }
200
201 public void keyPressed(KeyEvent e) {
202 player.keyPressed(e);
203 }
204
205 public void keyReleased(KeyEvent e) {
206 player.keyReleased(e);
207 }
208 public void keyTyped(KeyEvent e) {}
209
210 public void game() {
211 usedTime=1000;
212 t = 0;
213 initWorld();
214 while (isVisible() && !gameEnded) {
215 t++;
216 long startTime = System.currentTimeMillis();
217 updateWorld();
218 checkCollisions();
219 paintWorld();
220 usedTime = System.currentTimeMillis()-startTime;
221 try {
222 Thread.sleep(SPEED);
223 } catch (InterruptedException e) {}
224 }
225 paintGameOver();
226 }
227
228 public static void main(String[] args) {
229 Invaders inv = new Invaders();
230 inv.game();
231 }
232 }
233