Event listener/ Scanner in Gridworld

508 Views Asked by At

I'm trying to control Bugs in GridWorld. I have tried two ways of doing this, neither of which have actually moved or turned the bug. They both compile but nothing happens.

Here is the Bug that will be controlled:

package info.gridworld.actor;

import info.gridworld.grid.*;
import info.gridworld.grid.Location;

import java.awt.Color;

public class MazeBug extends Bug {

public MazeBug() {
    super(Color.blue);
}
public void forward(){

    Grid<Actor> gr = getGrid();
    if (gr == null)
        return;
    Location loc = getLocation();
    Location next = loc.getAdjacentLocation(getDirection());
    if (gr.isValid(next))
        moveTo(next);
    else
        removeSelfFromGrid();
}

public void turnRight(){
    setDirection(getDirection() + Location.RIGHT);
}

public void turnLeft(){
    setDirection(getDirection() + Location.LEFT);
}
}

Here is the first way that I tried controlling the bugs with the keys W,A, and D using Scanner (not sure if I used scanner correctly)

package info.gridworld.actor;

import java.util.Scanner;
import info.gridworld.grid.*;

public class KeyTests extends Actor
{
   public static ActorWorld world = new ActorWorld(new BoundedGrid<Actor>(20, 20));
   public static MazeBug currentBug;

   public static void main(String[] args) {
       world.show();
       world.add(new Location(1,11),new MazeBug());
       while(true){
           Scanner k = new Scanner(System.in);
           String buttonpress = k.nextLine();
           if (buttonpress.equals("w"))
               currentBug.forward();
           if (buttonpress.equals("d"))
               currentBug.turnRight();
           if (buttonpress.equals("a"))
               currentBug.turnLeft();
        }       
    }
}

Here is the 2nd way I tried to control the bug

package info.gridworld.actor;

import info.gridworld.grid.*;

public class KeyTests extends Actor
{
    public static ActorWorld world = new ActorWorld(new BoundedGrid<Actor>(20, 20));
    public static MazeBug currentBug;    

    public static void main(String[] args) {

        world.add(new Location(1,11),new MazeBug());    

        java.awt.KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new     java.awt.KeyEventDispatcher() {
            public boolean dispatchKeyEvent(java.awt.event.KeyEvent event) {
                String key = javax.swing.KeyStroke.getKeyStrokeForEvent(event).toString();
                if (key.equals("w"))
                   currentBug.forward();
                if (key.equals("d"))
                   currentBug.turnRight();
                if (key.equals("a"))
                   currentBug.turnLeft();
                world.show();
                return true;
            }
        });
        world.show();
    }
}

Thanks for any help in advanced

1

There are 1 best solutions below

0
On

I am almost positive that your problem is that you put your controlling code in the Runner instead of your Bug's act method.

When GridWorld steps all it does is call each Actor's act method, so if your Actor has an unpopulated method it will just call the parent, or do nothing. Your runner, since it is not an 'Actor' has no act method, and after the first run is never looked at again.

Try this in your MazeBug:

public void act()
{
    java.awt.KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new     java.awt.KeyEventDispatcher() {
        public boolean dispatchKeyEvent(java.awt.event.KeyEvent event) {
            String key = javax.swing.KeyStroke.getKeyStrokeForEvent(event).toString();
            if (key.equals("w"))
               forward();
            if (key.equals("d"))
               turnRight();
            if (key.equals("a"))
               turnLeft();
            return true;
        }
    });
}

Note: I have never used EventListeners so can't help with that code.