[Home]PluggableRobot/EventListener

Robo Home | PluggableRobot | Changes | Preferences | AllPages

Difference (from prior minor revision) (no other diffs)

Changed: 5,6c5,6
* This software is made available under the RoboWiki Public Code License (RWPCL). The full text of
* the license may be found at http://robowiki.net/cgi-bin/robowiki?RWPCL.
* This software is made available under the RoboWiki Limited Public Code License (RWLPCL). The full
* text of the license may be found at http://robowiki.net/cgi-bin/robowiki?RWLPCL.

Added: 9a10,13
import java.awt.Graphics2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;


Changed: 13,14c17,18
* Event listener interfaces. Objects that wish to be notified of events must extend one of these
* subinterfaces.
* A pluggable listener and strategy architecture for a robot.
* http://robowiki.net/cgi-bin/robowiki?PluggableRobot

Changed: 17,22c21,162
public interface EventListener? {
public interface BulletHitBullet? extends EventListener? {
/**
* Called by PluggableRobot when a bullet fired by your robot has hit another bullet.
*/
public void notifyBulletHitBullet?(BulletHitBulletEvent? event);
public abstract class PluggableRobot extends AdvancedRobot {
private static boolean _battleInitialized = false;
private static Hud _hud;

private ListenerDelegate? _listenerDelegate;
private ArrayList<Component> _components;
private ArrayList<Hud.Painter> _painters;
private Point2D.Double _center;

/**
* Sets up the ListenerDelegate? and the Component and Painter lists.
*/
protected PluggableRobot() {
_listenerDelegate = new ListenerDelegate?();
_components = new ArrayList<Component>();
_painters = new ArrayList<Hud.Painter>();
}

/**
* Set up the robot, then continuously collect events and invoke components.
*/
@Override
public final void run() {
// Initialize battle (at start of first round only)
if(!_battleInitialized) {
_hud = new Hud(this);
initializeBattle();
_battleInitialized = true;
}

// Register custom event test() hook for event manager
addCustomEvent(new Condition("eventManager") {
public boolean test() {
PluggableRobot.this.handleEvents();
return false;
}
});

// Round is starting
initializeRound();

// Main loop
while(true) {
for(Component component : _components) {
component.go();
}

execute();
}
}

/**
* This method will be called at the beginning of a battle. Robots can override this method to
* initialize their properties. This is a good place to initialize static properties or set your
* tank color.
*/
protected void initializeBattle() {
// Default implementation does nothing
}

/**
* This method will be called at the beginning of each round. Robots can override this method to
* initialize their properties. This is a good place to set up non-static properties and
* register listeners, painters and components.
*/
protected void initializeRound() {
// Default implementation does nothing
}

/**
* Called before events get processed each tick. The default implementation does nothing.
*/
public void onBeforeEventsProcessed?() {
// Do nothing
}

/**
* Returns a Point2D.Double object representing the center of the battlefield.
*/
public Point2D.Double getCenter() {
if(_center == null) {
_center = new Point2D.Double(getBattleFieldWidth?() / 2, getBattleFieldHeight?() / 2);
}

return _center;
}


/**
* Registers the given EventListener?, which will cause it to receive notifications of the events
* indicated by the listener interfaces it implements.
*/
protected void registerListener(EventListener? listener) {
_listenerDelegate.register(listener);
}

/**
* Reigsters the given Component, which will give it the opportunity to act each turn.
*/
protected void registerComponent(Component component) {
_components.add(component);
}

/**
* Reigsters the given Painter, which will give it the opportunity to draw on the HUD each turn.
*/
protected void registerPainter(Hud.Painter painter) {
_painters.add(painter);
}

/**
* Hand out notifications to the Painters.
*/
@Override
public final void onPaint(Graphics2D g) {
_hud.setContext(g); // Inject the graphics context into the Hud

for(Hud.Painter painter : _painters) {
painter.paint(_hud, getTime());
}

_hud.setContext(null); // Clear the injected graphics context
}

/**
* Process all the events in the queue.
*/
private void handleEvents() {
onBeforeEventsProcessed?();
_listenerDelegate.processEvents(getAllEvents?());
clearAllEvents?();
}

// Since we have our own event manager, we want to prevent overrides of the Robocode event
// methods, so we'll make them final.

@Override
public final void onCustomEvent(CustomEvent event) {
}

@Override
public final void onDeath(DeathEvent? event) {

Changed: 25,29c165,166
public interface BulletHit? extends EventListener? {
/**
* Called by PluggableRobot when a bullet fired by your robot has hit another robot.
*/
public void notifyBulletHit?(BulletHitEvent? event);
@Override
public final void onSkippedTurn(SkippedTurnEvent? event) {

Changed: 32,36c169,170
public interface BulletMissed? extends EventListener? {
/**
* Called by PluggableRobot when a bullet fired by your robot has hit a wall.
*/
public void notifyBulletMissed?(BulletMissedEvent? event);
@Override
public final void onBulletHit?(BulletHitEvent? event) {

Changed: 39,43c173,174
public interface Death extends EventListener? {
/**
* Called by PluggableRobot when your robot has been destroyed.
*/
public void notifyDeath(DeathEvent? event);
@Override
public final void onBulletHitBullet?(BulletHitBulletEvent? event) {

Changed: 46,50c177,178
public interface HitByBullet? extends EventListener? {
/**
* Called by PluggableRobot when your robot has been hit by an enemy bullet.
*/
public void notifyHitByBullet?(HitByBulletEvent? event);
@Override
public final void onBulletMissed?(BulletMissedEvent? event) {

Changed: 53,57c181,182
public interface HitRobot? extends EventListener? {
/**
* Called by PluggableRobot when your robot has collided with another robot.
*/
public void notifyHitRobot?(HitRobotEvent? event);
@Override
public final void onHitByBullet?(HitByBulletEvent? event) {

Changed: 60,64c185,186
public interface HitWall? extends EventListener? {
/**
* Called by PluggableRobot when your robot has collided with a wall.
*/
public void notifyHitWall?(HitWallEvent? event);
@Override
public final void onHitRobot?(HitRobotEvent? event) {

Changed: 67,71c189,190
public interface RobotDeath? extends EventListener? {
/**
* Called by PluggableRobot when an enemy robot has been destroyed.
*/
public void notifyRobotDeath?(RobotDeathEvent? event);
@Override
public final void onHitWall?(HitWallEvent? event) {

Changed: 74,78c193,194
public interface ScannedRobot extends EventListener? {
/**
* Called by PluggableRobot when your radar has swept over an enemy robot.
*/
public void notifyScannedRobot(ScannedRobotEvent event);
@Override
public final void onRobotDeath?(RobotDeathEvent? event) {

Changed: 81,85c197,198
public interface SkippedTurn extends EventListener? {
/**
* Called by PluggableRobot when your robot skipped a turn.
*/
public void notifySkippedTurn(SkippedTurnEvent? event);
@Override
public final void onScannedRobot(ScannedRobotEvent event) {

Changed: 88,92c201,202
public interface Win extends EventListener? {
/**
* Called by PluggableRobot when all robots besides yours have been destroyed.
*/
public void notifyWin(WinEvent? event);
@Override
public final void onWin(WinEvent? event) {

Changed: 95c205
</nowiki></pre>
</nowiki></pre>

/*
 * PluggableRobot, by Robert J. Walker
 * Home page: http://robowiki.net/cgi-bin/robowiki?PluggableRobot
 * This software is made available under the RoboWiki Limited Public Code License (RWLPCL). The full
 * text of the license may be found at http://robowiki.net/cgi-bin/robowiki?RWLPCL.
 */
package rjw.pluggablerobot;

import java.awt.Graphics2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;

import robocode.*;

/**
 * A pluggable listener and strategy architecture for a robot.
 * http://robowiki.net/cgi-bin/robowiki?PluggableRobot
 * @author Robert J. Walker
 */
public abstract class PluggableRobot extends AdvancedRobot {
	private static boolean _battleInitialized = false;
	private static Hud _hud;

	private ListenerDelegate _listenerDelegate;
	private ArrayList<Component> _components;
	private ArrayList<Hud.Painter> _painters;
	private Point2D.Double _center;

	/**
	 * Sets up the ListenerDelegate and the Component and Painter lists.
	 */
	protected PluggableRobot() {
		_listenerDelegate = new ListenerDelegate();
		_components = new ArrayList<Component>();
		_painters = new ArrayList<Hud.Painter>();
	}

	/**
	 * Set up the robot, then continuously collect events and invoke components.
	 */
	@Override
	public final void run() {
		// Initialize battle (at start of first round only)
		if(!_battleInitialized) {
			_hud = new Hud(this);
			initializeBattle();
			_battleInitialized = true;
		}

		// Register custom event test() hook for event manager
		addCustomEvent(new Condition("eventManager") {
			public boolean test() {
				PluggableRobot.this.handleEvents();
				return false;
			}
		});

		// Round is starting
		initializeRound();

		// Main loop
		while(true) {
			for(Component component : _components) {
				component.go();
			}

			execute();
		}
	}

	/**
	 * This method will be called at the beginning of a battle. Robots can override this method to
	 * initialize their properties. This is a good place to initialize static properties or set your
	 * tank color.
	 */
	protected void initializeBattle() {
		// Default implementation does nothing
	}

	/**
	 * This method will be called at the beginning of each round. Robots can override this method to
	 * initialize their properties. This is a good place to set up non-static properties and
	 * register listeners, painters and components.
	 */
	protected void initializeRound() {
		// Default implementation does nothing
	}

	/**
	 * Called before events get processed each tick. The default implementation does nothing.
	 */
	public void onBeforeEventsProcessed() {
		// Do nothing
	}

	/**
	 * Returns a Point2D.Double object representing the center of the battlefield.
	 */
	public Point2D.Double getCenter() {
		if(_center == null) {
			_center = new Point2D.Double(getBattleFieldWidth() / 2, getBattleFieldHeight() / 2); 
		}

		return _center;
	}


	/**
	 * Registers the given EventListener, which will cause it to receive notifications of the events
	 * indicated by the listener interfaces it implements.
	 */
	protected void registerListener(EventListener listener) {
		_listenerDelegate.register(listener);
	}

	/**
	 * Reigsters the given Component, which will give it the opportunity to act each turn.
	 */
	protected void registerComponent(Component component) {
		_components.add(component);
	}

	/**
	 * Reigsters the given Painter, which will give it the opportunity to draw on the HUD each turn.
	 */
	protected void registerPainter(Hud.Painter painter) {
		_painters.add(painter);
	}

	/**
	 * Hand out notifications to the Painters.
	 */
	@Override
	public final void onPaint(Graphics2D g) {
		_hud.setContext(g); // Inject the graphics context into the Hud

		for(Hud.Painter painter : _painters) {
			painter.paint(_hud, getTime());
		}

		_hud.setContext(null); // Clear the injected graphics context
	}

	/**
	 * Process all the events in the queue.
	 */
	private void handleEvents() {
		onBeforeEventsProcessed();
		_listenerDelegate.processEvents(getAllEvents());
		clearAllEvents();
	}

	// Since we have our own event manager, we want to prevent overrides of the Robocode event
	// methods, so we'll make them final.

	@Override
	public final void onCustomEvent(CustomEvent event) {
	}

	@Override
	public final void onDeath(DeathEvent event) {
	}

	@Override
	public final void onSkippedTurn(SkippedTurnEvent event) {
	}

	@Override
	public final void onBulletHit(BulletHitEvent event) {
	}

	@Override
	public final void onBulletHitBullet(BulletHitBulletEvent event) {
	}

	@Override
	public final void onBulletMissed(BulletMissedEvent event) {
	}

	@Override
	public final void onHitByBullet(HitByBulletEvent event) {
	}

	@Override
	public final void onHitRobot(HitRobotEvent event) {
	}

	@Override
	public final void onHitWall(HitWallEvent event) {
	}

	@Override
	public final void onRobotDeath(RobotDeathEvent event) {
	}

	@Override
	public final void onScannedRobot(ScannedRobotEvent event) {
	}

	@Override
	public final void onWin(WinEvent event) {
	}
}

Robo Home | PluggableRobot | Changes | Preferences | AllPages
Edit text of this page | View other revisions
Last edited November 3, 2007 0:49 EST by RobertWalker (diff)
Search: