package com.jpii.navalbattle.game; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import java.awt.image.BufferedImage; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.Timer; import com.jpii.navalbattle.game.turn.TurnManager; import com.jpii.navalbattle.pavo.Game; import com.jpii.navalbattle.pavo.PavoHelper; import com.jpii.navalbattle.pavo.PavoOpenState; import com.jpii.navalbattle.pavo.WorldSize; import com.jpii.navalbattle.pavo.io.PavoImage; import com.jpii.navalbattle.util.WindowLib; public class GameComponent extends JComponent { private static final long serialVersionUID = 1L; static JFrame frame; Timer ticker; Timer logicUpdator; NavalGame game; WindowLib winlib; boolean isFullscreen = false; Timer alert; boolean startDialog = false; PavoImage notifier; public GameComponent(NavalGame ng){ winlib = new WindowLib(frame); game = ng;MouseListener ml = new MouseListener() { public void mouseClicked(MouseEvent arg0) { } public void mouseEntered(MouseEvent arg0) { } public void mouseExited(MouseEvent arg0) { } public void mousePressed(MouseEvent arg0) { if (game == null) return; game.mouseDown(arg0); } public void mouseReleased(MouseEvent arg0) { if (game == null) return; game.mouseUp(arg0); } }; MouseWheelListener mwl = new MouseWheelListener() { public void mouseWheelMoved(MouseWheelEvent arg0) { if (game == null) return; game.mouseWheelChange(arg0); } }; MouseMotionListener mml = new MouseMotionListener() { public void mouseDragged(MouseEvent arg0) { if (game == null) return; game.mouseDragged(arg0); } public void mouseMoved(MouseEvent arg0) { if (game == null) return; game.mouseMove(arg0); } }; addMouseWheelListener(mwl); addMouseMotionListener(mml); addMouseListener(ml); ActionListener al = new ActionListener() { public void actionPerformed(ActionEvent arg0) { update(); updateDialog(); repaint(); } }; ActionListener al2 = new ActionListener() { public void actionPerformed(ActionEvent arg0) { updateGame(); } }; ticker = new Timer(47, al); ticker.start(); logicUpdator = new Timer(125,al2); logicUpdator.start(); } public GameComponent(WorldSize ws,TurnManager tm, PavoOpenState pos, String params) { winlib = new WindowLib(frame); if (pos != PavoOpenState.NORMAL) game = new NavalGame(ws,tm,pos,params); else game = new NavalGame(ws,tm); MouseListener ml = new MouseListener() { public void mouseClicked(MouseEvent arg0) { } public void mouseEntered(MouseEvent arg0) { } public void mouseExited(MouseEvent arg0) { } public void mousePressed(MouseEvent arg0) { if (game == null) return; game.mouseDown(arg0); } public void mouseReleased(MouseEvent arg0) { if (game == null) return; game.mouseUp(arg0); } }; MouseWheelListener mwl = new MouseWheelListener() { public void mouseWheelMoved(MouseWheelEvent arg0) { if (game == null) return; game.mouseWheelChange(arg0); } }; MouseMotionListener mml = new MouseMotionListener() { public void mouseDragged(MouseEvent arg0) { if (game == null) return; game.mouseDragged(arg0); } public void mouseMoved(MouseEvent arg0) { if (game == null) return; game.mouseMove(arg0); } }; addMouseWheelListener(mwl); addMouseMotionListener(mml); addMouseListener(ml); ActionListener al = new ActionListener() { public void actionPerformed(ActionEvent arg0) { update(); updateDialog(); repaint(); } }; ActionListener al2 = new ActionListener() { public void actionPerformed(ActionEvent arg0) { updateGame(); } }; ticker = new Timer(47, al); ticker.start(); logicUpdator = new Timer(125,al2); logicUpdator.start(); } public void update() { game.render(); Game.Settings.currentWidth = frame.getWidth(); Game.Settings.currentHeight = frame.getHeight(); setSize(frame.getWidth(), frame.getHeight()); } public void updateGame() { game.forceUpdate(); } boolean isWaving = false; double ss = 0.0; boolean isLocked = false; public void paintComponent(Graphics g) { if (isLocked) return; isLocked = true; //g.setColor(Color.black); //g.fillRect(0,0,DynamicConstants.WND_WDTH,DynamicConstants.WND_HGHT); if (game != null) { if (isWaving) { PavoImage buffer = game.getBuffer(); Thread.currentThread().setPriority(Thread.MAX_PRIORITY); ss += 1.2; PavoImage buffer2 = new PavoImage(buffer.getWidth(),buffer.getHeight(),BufferedImage.TYPE_INT_RGB); Graphics m = buffer2.getGraphics(); m.setColor(Color.black); m.fillRect(0,0,getWidth(),getHeight()); for (int c = 0; c < buffer.getWidth(); c++) { int wh = (int)(Math.sin(ss+(c/8.0))*10); for (int y = 0; y < buffer.getHeight(); y++) { m.setColor(new Color(buffer.getRGB(c, y))); m.fillRect(c,y+wh,1,1); } } m.dispose(); g.drawImage(buffer2,0,0,null); } else { g.drawImage(game.getBuffer(),0,0,null); } } else { g.setColor(Color.red); g.fillRect(0,0,getWidth(),getHeight()); } if (notifier != null) g.drawImage(notifier,(Game.Settings.currentWidth/2)-(notifier.getWidth()/2), (Game.Settings.currentHeight/2)-(notifier.getHeight()/2),null); isLocked = false; } float transparency = 200; long ticks = 0; public void updateDialog() { if (startDialog) { ticks++; if (transparency <= 10) { startDialog = false; transparency = 200; notifier = null; return; } else transparency -= 5.0f; notifier = new PavoImage(550,100,BufferedImage.TYPE_INT_ARGB); Graphics2D g = PavoHelper.createGraphics(notifier); g.setColor(new Color(0,0,0,(int)transparency)); g.fillRoundRect(0,0,550,100,60,60); g.setColor(new Color(255,255,255,(int)transparency)); g.setFont(new Font("Arial",Font.BOLD,28)); g.drawString("Press F11 to exit fullscreen mode.", 42,60); g.dispose(); } else notifier = null; } public NavalGame getGame() { return game; } public void setGame(NavalGame ng){ game = ng; } public void toggleFullscreen() { if (isFullscreen) { isFullscreen = false; winlib.hideFullscreen(); transparency = 200; startDialog = false; Game.Settings.isGameFullscreen = false; } else { ticks = 0; winlib.showFullscreen(); isFullscreen = true; startDialog = true; Game.Settings.isGameFullscreen = true; } } public void dispose(){ ticker.stop(); logicUpdator.stop(); //alert.stop(); getGame().shutdown(); ticker = null; logicUpdator = null; alert = null; game = null; repaint(); Game.Instance = null; System.gc(); try { Thread.sleep(600); } catch (Throwable t) { } System.gc(); //System.out.println("shutdown complete."); } }