/****************************************************************************** * Copyright (c) 2008 Marco Della Vedova, Matteo Foppiano * and Pimods contributors * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.pixelinstrument.net/license/cpl-v10.html ******************************************************************************/ package net.sf.robocode.bv3d.controller; import java.awt.AWTException; import java.awt.Point; import java.awt.Robot; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; 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 net.sf.robocode.bv3d.MVCManager; import net.sf.robocode.bv3d.camera.CameraManager; import net.sf.robocode.bv3d.scenegraph.TransformationNode; /** * @author Marco Della Vedova - pixelinstrument.net * @author Matteo Foppiano - pixelinstrument.net */ public class ControlListener implements KeyListener, MouseListener, MouseMotionListener, MouseWheelListener { private final static float MOVE_INC = 0.05f; private boolean motionEnabled; private MVCManager manager; private Robot robot; public ControlListener(MVCManager manager) { this.manager = manager; this.motionEnabled = false; try { // this.robot = new Robot( manager.getCanvas().getGraphicsConfiguration().getDevice() ); this.robot = new Robot(); } catch (AWTException e) { System.err.println("Problem during new Robot() call : " + e); } } public void keyPressed(KeyEvent k) { CameraManager cameraManager; try { cameraManager = this.manager.getScene().getCameraManager(); } catch (NullPointerException exception) { System.err.println( "Attenzione: tutto normale, pero` attento a quando generi gli eventi, sto ancora inizializzando! Capperi!"); cameraManager = null; } if (cameraManager != null) { switch (k.getKeyCode()) { case KeyEvent.VK_W: cameraManager.tryToSetMove(0, 0, MOVE_INC); break; case KeyEvent.VK_S: cameraManager.tryToSetMove(0, 0, -MOVE_INC); break; case KeyEvent.VK_A: cameraManager.tryToSetMove(-MOVE_INC, 0, 0); break; case KeyEvent.VK_D: cameraManager.tryToSetMove(MOVE_INC, 0, 0); break; case KeyEvent.VK_SPACE: cameraManager.tryToSetMove(0, MOVE_INC, 0); break; case KeyEvent.VK_C: cameraManager.tryToSetMove(0, -MOVE_INC, 0); break; case KeyEvent.VK_E: defaultCameraEvent(); break; case KeyEvent.VK_TAB: cameraFollowerEvent(manager.getScene().nextCameraFollowedIndex()); break; } } } public void keyTyped(KeyEvent e) {} public void keyReleased(KeyEvent e) {} public void mouseClicked(MouseEvent e) { this.motionEnabled = !this.motionEnabled; this.setPointerState(); } public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseDragged(MouseEvent e) {} public void mouseMoved(MouseEvent e) { CameraManager cameraManager; if (this.motionEnabled) { try { cameraManager = this.manager.getScene().getCameraManager(); } catch (NullPointerException exception) { System.err.println( "Attenzione: tutto normale, pero` attento a quando generi gli eventi, sto ancora inizializzando! Capperi!"); cameraManager = null; } if (cameraManager != null) { cameraManager.tryToSetCameraDimension(this.manager.getCanvas().getSize().width, this.manager.getCanvas().getSize().height); cameraManager.tryToSetDirection(e.getX(), e.getY()); int relCenterX = this.manager.getCanvas().getSize().width / 2; int relCenterY = this.manager.getCanvas().getSize().height / 2; if (relCenterX != e.getX() || relCenterY != e.getY()) { Point location = this.manager.getCanvas().getLocationOnScreen(); this.robot.mouseMove(relCenterX + location.x + 1, relCenterY + location.y + 1); } } } } public void mouseWheelMoved(MouseWheelEvent e) { for (int i = 0; i < e.getWheelRotation(); i++) { cameraFollowerEvent(manager.getScene().nextCameraFollowedIndex()); } } public void cameraFollowerEvent(int indexOfFollowed) { CameraManager cameraManager; try { cameraManager = this.manager.getScene().getCameraManager(); } catch (NullPointerException exception) { System.err.println( "Attenzione: tutto normale, pero` attento a quando generi gli eventi, sto ancora inizializzando! Capperi!"); cameraManager = null; } this.motionEnabled = false; this.setPointerState(); cameraManager.setAnchor(CameraManager.CAMERAANCHOR_FOLLOWER); TransformationNode tn = this.manager.getScene().setCameraFollower(indexOfFollowed); cameraManager.tryToSetFollowedNode(tn); manager.displayMessage("You are following " + tn.getName()); } public void defaultCameraEvent() { CameraManager cameraManager; try { cameraManager = this.manager.getScene().getCameraManager(); } catch (NullPointerException exception) { System.err.println( "Attenzione: tutto normale, pero` attento a quando generi gli eventi, sto ancora inizializzando! Capperi!"); cameraManager = null; } cameraManager.setAnchor(CameraManager.CAMERAANCHOR_CONTROLLER); manager.displayMessage("Default camera"); } private void setPointerState() { if (this.motionEnabled) { this.manager.setNullCursor(); } else { this.manager.setCrossCursor(); } } }