2014-05-23 2 views
0

Я пытаюсь контролировать Bug s в GridWorld. Я пробовал два способа сделать это, ни один из которых не переместил или не перевернул ошибку. Они компилируются, но ничего не происходит.Слушатель событий/Сканер в Gridworld

Вот Bug, который будет контролироваться:

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); 
} 
} 

Вот первый способ, который я пытался контролировать ошибки с помощью клавиш W, A, и D с помощью сканера (не уверен, если я использовал сканер правильно)

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(); 
     }  
    } 
} 

Вот второй способ, которым я пытался контролировать ошибку

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(); 
    } 
} 

Спасибо за любую помощь в продвинутом

+0

Попробуйте переместить код контроллера в метод действий «Ошибки». – Ferret9

ответ

0

Я почти уверен, что ваша проблема заключается в том, что вы помещаете свой управляющий код в Runner вместо вашего метода действия Bug.

Когда GridWorld шаги все это делает вызывать каждый Actor'sact метод, так что если ваш Actor имеет безлюдный метод будет просто позвонить родителям, или ничего не делать. Ваш бегун, поскольку он не является «Actor», не имеет метода act, и после первого прогона никогда не просматривается снова.

Попробуйте это в 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; 
     } 
    }); 
} 

Примечание: Я никогда не использовал EventListeners поэтому не может помочь с этим кодом.

Смежные вопросы