[152] | 1 | package solarsim.renderer; |
---|
| 2 | |
---|
| 3 | import solarsim.*; |
---|
| 4 | import solarsim.common.State; |
---|
| 5 | import java.awt.*; |
---|
| 6 | import java.io.FileInputStream; |
---|
| 7 | import java.io.InputStream; |
---|
| 8 | import java.util.*; |
---|
| 9 | import javax.swing.*; |
---|
| 10 | |
---|
| 11 | |
---|
| 12 | public class Renderer2D extends JFrame implements Runnable { |
---|
| 13 | |
---|
| 14 | private final MyCanvas canvas; |
---|
| 15 | private final LinkedList<State> states; |
---|
| 16 | private volatile boolean running; |
---|
| 17 | private Thread thread; |
---|
| 18 | static int count=0; |
---|
| 19 | |
---|
| 20 | public Renderer2D() { |
---|
| 21 | super("Solar Sim"); |
---|
| 22 | this.canvas = new MyCanvas(); |
---|
| 23 | this.states = new LinkedList<State>(); |
---|
| 24 | |
---|
| 25 | this.setLayout(new BorderLayout()); |
---|
| 26 | this.add(canvas); |
---|
| 27 | |
---|
| 28 | this.pack(); |
---|
| 29 | this.setVisible(true); |
---|
| 30 | } |
---|
| 31 | |
---|
| 32 | public void drawState(State s) { |
---|
| 33 | if( count++ % RenderConstants.DRAW_EVERY != 0 ) |
---|
| 34 | return; |
---|
| 35 | if( s == null ) |
---|
| 36 | return; |
---|
| 37 | synchronized( states ) { |
---|
| 38 | states.addFirst(s); |
---|
| 39 | states.notify(); |
---|
| 40 | } |
---|
| 41 | } |
---|
| 42 | |
---|
| 43 | @Override |
---|
| 44 | public void run() { |
---|
| 45 | this.running = true; |
---|
| 46 | this.thread = Thread.currentThread(); |
---|
| 47 | while( running ) { |
---|
| 48 | synchronized( states ) { |
---|
| 49 | while( states.isEmpty() ) { |
---|
| 50 | try { |
---|
| 51 | states.wait(); |
---|
| 52 | } catch (InterruptedException ex) { } |
---|
| 53 | } |
---|
| 54 | State s = states.removeLast(); |
---|
| 55 | canvas.drawState(s); |
---|
| 56 | } |
---|
| 57 | try { |
---|
| 58 | thread.sleep(40); |
---|
| 59 | } catch( Exception ex ) {} |
---|
| 60 | } |
---|
| 61 | } |
---|
| 62 | |
---|
| 63 | public void stop() { |
---|
| 64 | this.running = false; |
---|
| 65 | this.thread.interrupt(); |
---|
| 66 | // close JFrame |
---|
| 67 | this.setVisible(false); |
---|
| 68 | this.dispose(); |
---|
| 69 | } |
---|
| 70 | |
---|
| 71 | |
---|
| 72 | /** |
---|
| 73 | * @param args the command line arguments |
---|
| 74 | */ |
---|
| 75 | public static void main(String[] args) { |
---|
| 76 | try { |
---|
| 77 | Renderer2D renderer = new Renderer2D(); |
---|
| 78 | new Thread(renderer).start(); |
---|
| 79 | /* |
---|
| 80 | ServerSocket ss = new ServerSocket(2200); |
---|
| 81 | Socket sock = ss.accept(); |
---|
| 82 | InputStream is = sock.getInputStream(); |
---|
| 83 | */ |
---|
| 84 | InputStream is = new FileInputStream("sim.dat"); |
---|
| 85 | while(true) { |
---|
| 86 | State s = State.readStateFromInputStream(is); |
---|
| 87 | if( s == null ) |
---|
| 88 | break; |
---|
| 89 | renderer.drawState(s); |
---|
| 90 | } |
---|
| 91 | |
---|
| 92 | System.out.println("Stopping."); |
---|
| 93 | |
---|
| 94 | Thread.currentThread().sleep(1000 * 60); |
---|
| 95 | renderer.stop(); |
---|
| 96 | // sock.close(); |
---|
| 97 | } catch(Exception e) { |
---|
| 98 | e.printStackTrace(); |
---|
| 99 | } |
---|
| 100 | } |
---|
| 101 | } |
---|