1     package version20;
2     /**
3      * Curso Básico de desarrollo de Juegos en Java - Invaders
4      * 
5      * (c) 2004 Planetalia S.L. - Todos los derechos reservados. Prohibida su reproducción
6      * 
7      * http://www.planetalia.com
8      * 
9      */
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