1     package version16;
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.event.WindowAdapter;
17    import java.awt.event.WindowEvent;
18    import java.awt.image.BufferStrategy;
19    import java.util.ArrayList;
20    
21    import javax.swing.JFrame;
22    import javax.swing.JPanel;
23    
24    public class Invaders extends Canvas implements Stage {
25      
26      private BufferStrategy strategy;
27      private long usedTime;
28      
29      private SpriteCache spriteCache;
30      private ArrayList actors; 
31      private Player player;
32      
33      public Invaders() {
34        spriteCache = new SpriteCache();
35        
36      
37        JFrame ventana = new JFrame("Invaders");
38        JPanel panel = (JPanel)ventana.getContentPane();
39        setBounds(0,0,Stage.WIDTH,Stage.HEIGHT);
40        panel.setPreferredSize(new Dimension(Stage.WIDTH,Stage.HEIGHT));
41        panel.setLayout(null);
42        panel.add(this);
43        ventana.setBounds(0,0,Stage.WIDTH,Stage.HEIGHT);
44        ventana.setVisible(true);
45        ventana.addWindowListener( new WindowAdapter() {
46          public void windowClosing(WindowEvent e) {
47            System.exit(0);
48          }
49        });
50        ventana.setResizable(false);
51        createBufferStrategy(2);
52        strategy = getBufferStrategy();
53        requestFocus();
54      }
55      
56      public void initWorld() {
57        actors = new ArrayList();
58        for (int i = 0; i < 10; i++){
59          Monster m = new Monster(this);
60          m.setX( (int)(Math.random()*Stage.WIDTH) );
61          m.setY( i*20 );
62          m.setVx( (int)(Math.random()*20-10) );
63          
64          actors.add(m);
65        }
66        
67        player = new Player(this);
68        player.setX(Stage.WIDTH/2);
69        player.setY(Stage.HEIGHT - 2*player.getHeight());
70        player.setVx(5);
71      }
72      
73      public void updateWorld() {
74        for (int i = 0; i < actors.size(); i++) {
75          Actor m = (Actor)actors.get(i);
76          m.act();
77        }
78        player.act();
79      }
80      
81      public void paintWorld() {
82        Graphics2D g = (Graphics2D)strategy.getDrawGraphics();
83        g.setColor(Color.black);
84        g.fillRect(0,0,getWidth(),getHeight());
85        for (int i = 0; i < actors.size(); i++) {
86          Actor m = (Actor)actors.get(i);
87          m.paint(g);
88        }
89        player.paint(g);
90    
91        g.setColor(Color.white);
92        if (usedTime > 0)
93          g.drawString(String.valueOf(1000/usedTime)+" fps",0,Stage.HEIGHT-50);
94        else
95          g.drawString("--- fps",0,Stage.HEIGHT-50);
96        strategy.show();
97      }
98      
99      public SpriteCache getSpriteCache() {
100       return spriteCache;
101     }
102     
103     public void game() {
104       usedTime=1000;
105       initWorld();
106       while (isVisible()) {
107         long startTime = System.currentTimeMillis();
108         updateWorld();
109         paintWorld();
110         usedTime = System.currentTimeMillis()-startTime;
111         try { 
112            Thread.sleep(SPEED);
113         } catch (InterruptedException e) {}
114       }
115     }
116     
117     public static void main(String[] args) {
118       Invaders inv = new Invaders();
119       inv.game();
120     }
121   }
122