import java.awt.*; import java.awt.image.ImageObserver; public class DogSprite extends Sprite { private int dir = -1; private int wait = 0; public DogSprite( int dir, Image image, int x, int y ) { super( image, x, y ); this.dir = dir; } public void tick( Level level ) { wait--; if ( wait > 0 ) return; super.tick( level ); if ( getState() == REST ) { if ( Math.random() < 0.7 ) { int dir = level.sniff( getX(), getY() ); //wait = 12; if ( dir != -1 ) { if ( this.dir != dir ) wait = 12; this.dir = dir; } } switch( this.dir ) { case UP: goUp(); break; case DOWN: goDown(); break; case LEFT: goLeft(); break; case RIGHT: goRight(); break; } if ( getState() == REST ) // something was in the way turn(); } } private boolean isSpace( int dir ) { int x = getX(); int y = getY(); int s = Level.ELEMENT_SIZE; switch( dir ) { case UP: return level.isSpace( x, y-s ); case DOWN: return level.isSpace( x, y+s ); case LEFT: return level.isSpace( x-s, y ); case RIGHT: return level.isSpace( x+s, y ); } return false; } private void turn() { int l = turnLeft(); if ( isSpace( l ) ) dir = l; else dir = turnRight(); } private int turnLeft() { switch( dir ) { case UP: return LEFT; case DOWN: return RIGHT; case LEFT: return DOWN; case RIGHT: return UP; } return dir; } private int turnRight() { switch( dir ) { case UP: return RIGHT; case DOWN: return LEFT; case LEFT: return UP; case RIGHT: return DOWN; } return dir; } private static final Font f = new Font( "SanSerif", Font.PLAIN, 10 ); private static Rectangle s = new Rectangle( -1, -1 ); public void paint( Graphics g, ImageObserver o ) { super.paint( g, o ); if ( wait > 0 ) { String str = "woof!"; g.setFont( f ); if ( s.width == -1 ) { FontMetrics fm = g.getFontMetrics(); s.width = fm.stringWidth( str ); s.height = fm.getHeight(); s.y = fm.getAscent(); } int x = 4 + getX(); int y = getY(); g.setColor( Color.white ); g.fillRect( x, y -1 - s.y, s.width, s.height+1 ); g.setColor( Color.black ); g.drawString( str, x, y ); } } }