import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class Screen extends JPanel implements ActionListener, KeyListener, MouseListener, MouseMotionListener {
// __working variables__
// mouse
private boolean captured = true;
private final Point2D mouseRel = new Point2D(0d,0d);
//private final Cursor invisibleCursor;
// testing
private Line line = new Line(new Point2D(200, 200),
new Point2D(1, 1));
private Triangle Triangle = new Triangle(new Point2D(200, 200), new Point2D(1, 1), new Point2D(400,200));
double ang = 0;
// __config variables__
// controls the delay between each tick in ms
private final int DELAY = 25;
// controls the size of the board
public static final int TILE_SIZE = 50;
public static final int ROWS = 12;
public static final int COLUMNS = 18;
// suppress serialization warning
private static final long serialVersionUID = 490905409104883233L;
// keep a reference to the timer object that triggers actionPerformed() in
// case we need access to it in another method
private final Timer timer;
// objects that appear on the game board
private final Player player;
public Screen() {
// set the game board size
setPreferredSize(new Dimension(TILE_SIZE * COLUMNS, TILE_SIZE * ROWS));
// set the game board background color
setBackground(new Color(232, 232, 232));
// hide the mouse cursor (https://stackoverflow.com/questions/191592/how-do-i-get-rid-of-the-mouse-cursor-in-full-screen-exclusive-mode)
Toolkit toolkit = Toolkit.getDefaultToolkit();
Point hotSpot = new Point(0,0);
BufferedImage cursorImage = new BufferedImage(1, 1, BufferedImage.TRANSLUCENT);
//invisibleCursor = toolkit.createCustomCursor(cursorImage, hotSpot, "InvisibleCursor");
//setCursor(invisibleCursor);
// initialize the game state
player = new Player();
// this timer will call the actionPerformed() method every DELAY ms
timer = new Timer(DELAY, this);
timer.start();
}
@Override
public void actionPerformed(ActionEvent e) {
// this method is called by the timer every DELAY ms.
// runs the tick of the player before the board is redrawn
player.tick(get_mouse_rel());
// calling repaint() will trigger paintComponent() to run again,
// which will refresh/redraw the graphics.
repaint();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// when calling g.drawImage() we can use "this" for the ImageObserver
// because Component implements the ImageObserver interface, and JPanel
// extends from Component. So "this" Board instance, as a Component, can
// react to imageUpdate() events triggered by g.drawImage()
// draw graphics.
drawScreen(g);
// player.draw(g, this);
// this smooths out animations on some systems
Toolkit.getDefaultToolkit().sync();
}
private void drawScreen(Graphics g) {
BufferedImage img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB );
line.point2.x = 100*Math.sin(ang) + 200;
line.point2.y = 100*Math.cos(ang) + 200;
Triangle.point2.x = 100*Math.sin(ang+3) + 200;
Triangle.point2.y = 100*Math.cos(ang+3) + 200;
line.draw(img);
Triangle.draw(img);
ang += 0.02;
g.drawImage(img, 0, 0, this);
}
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_ESCAPE){
captured = false;
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
// pass key-press to the player, so they can handle it as well
player.keyPressed(key);
}
@Override
public void keyReleased(KeyEvent e) {}
// gets the relative position of the mouse since the last time this function was called
public Point2D get_mouse_rel(){
Point2D rel;
// this doesn't work if the mouse isn't captured. If I need it to, I can
// probably make it, but I don't know what the functionality looks like.
if (captured) {
rel = new Point2D(MouseInfo.getPointerInfo().getLocation().x - getLocationOnScreen().x - getSize().width / 2d + mouseRel.x,
MouseInfo.getPointerInfo().getLocation().y - getLocationOnScreen().y - getSize().height / 2d + mouseRel.y);
mouseRel.set(0, 0);
// set the position of the mouse back to (0,0)
try {
Robot robot = new Robot();
robot.mouseMove(getLocationOnScreen().x + getSize().width / 2,
getLocationOnScreen().y + getSize().height / 2);
} catch (AWTException ex) {
ex.printStackTrace();
}
}
else{
rel = new Point2D(0,0);
}
return rel;
}
@Override
public void mouseClicked(MouseEvent mouseEvent) {
if (mouseEvent.getButton() == MouseEvent.BUTTON1){
captured = true;
//setCursor(invisibleCursor);
}
}
@Override
public void mousePressed(MouseEvent mouseEvent) {}
@Override
public void mouseReleased(MouseEvent mouseEvent) {}
@Override
public void mouseEntered(MouseEvent mouseEvent) {}
@Override
public void mouseExited(MouseEvent mouseEvent) {
if (captured) {
// add current mouse relative location to mouseRel so mouse movements are not lost
mouseRel.x += mouseEvent.getX() - getSize().width / 2d;
mouseRel.y += mouseEvent.getY() - getSize().height / 2d;
// System.out.println(mouseEvent.getX() + " " + mouseEvent.getY());
// set the position of the mouse back to (0,0)
try {
Robot robot = new Robot();
robot.mouseMove(getLocationOnScreen().x + getSize().width / 2,
getLocationOnScreen().y + getSize().height / 2);
} catch (AWTException ex) {
ex.printStackTrace();
}
}
}
@Override
public void mouseDragged(MouseEvent mouseEvent) {}
@Override
public void mouseMoved(MouseEvent mouseEvent) {
}
}