2014-02-03 4 views
4

У меня проблема при использовании TextField от Slick2D.Slick TextField не работает

При использовании Slick's BasicGame TextField отлично работает - я могу щелкнуть по нему, ввести слова и System.out.println содержимое текстовых полей.

Однако при использовании того же кода в «BasicGameState» TextField не требует кликов и не отвечает на любой ввод.

Итак: Рабочий код:

package Help; 
import java.awt.Font; 
import org.newdawn.slick.AppGameContainer; 
import org.newdawn.slick.BasicGame; 
import org.newdawn.slick.GameContainer; 
import org.newdawn.slick.Graphics; 
import org.newdawn.slick.SlickException; 
import org.newdawn.slick.UnicodeFont; 
import org.newdawn.slick.font.effects.ColorEffect; 
import org.newdawn.slick.gui.AbstractComponent; 
import org.newdawn.slick.gui.ComponentListener; 
import org.newdawn.slick.gui.TextField; 

public class TextFieldWorking extends BasicGame{ 
    private TextField text1; 
    private UnicodeFont font = getNewFont("Arial" , 16); 


    public TextFieldWorking() { 
     super("Test"); 
    } 
    @Override 
    public void init(GameContainer container) throws SlickException { 
     font.loadGlyphs(); 
     text1 = new TextField(container, font, 50,50,100,25); 
    } 
    @Override 
    public void update(GameContainer gc, int delta) throws SlickException { 
     System.out.println(text1.getText()); 
    } 
    @Override 
    public void render(GameContainer gc, Graphics g) throws SlickException { 
     text1.render(gc, g); 
    } 
    public UnicodeFont getNewFont(String fontName , int fontSize){ 
     UnicodeFont returnFont = new UnicodeFont(new Font(fontName , Font.PLAIN , fontSize)); 
     returnFont.addAsciiGlyphs(); 
     returnFont.getEffects().add(new ColorEffect(java.awt.Color.white)); 
     return (returnFont); 
    } 
    public static void main(String[] args) throws SlickException { 
     TextFieldWorking g = new TextFieldWorking(); 
     AppGameContainer gc = new AppGameContainer(g); 
     gc.setDisplayMode(500, 500, false); 
     gc.start(); 
    } 
} 

Non-Рабочий код:

package Help; 
import java.awt.Font; 
import org.newdawn.slick.AppGameContainer; 
import org.newdawn.slick.BasicGame; 
import org.newdawn.slick.GameContainer; 
import org.newdawn.slick.Graphics; 
import org.newdawn.slick.SlickException; 
import org.newdawn.slick.UnicodeFont; 
import org.newdawn.slick.font.effects.ColorEffect; 
import org.newdawn.slick.gui.AbstractComponent; 
import org.newdawn.slick.gui.ComponentListener; 
import org.newdawn.slick.gui.TextField; 

import org.newdawn.slick.state.BasicGameState; 
import org.newdawn.slick.state.StateBasedGame; 


public class TextFieldTest extends BasicGameState{ 

    int WindowWidth, WindowHeight; 
    TextField text1; 
    private UnicodeFont font = getNewFont("Arial" , 16); 
    private int stateId = 0; 

    public TextFieldTest(int State) { 
     this.stateId = State; 
    } 

    public void init(GameContainer gc, StateBasedGame sbg) throws SlickException{ 

     WindowWidth = gc.getWidth(); 
     WindowHeight = gc.getHeight(); 
     font.loadGlyphs(); 
     text1 = new TextField(gc, font, 50,50,100,25); 
    } 

    public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException{ 
     text1.render(gc, g); 
    } 

    public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException{ 
     System.out.println(text1.getText()); 
    } 

    public UnicodeFont getNewFont(String fontName , int fontSize){ 
     UnicodeFont returnFont = new UnicodeFont(new Font(fontName , Font.PLAIN , fontSize)); 
     returnFont.addAsciiGlyphs(); 
     returnFont.getEffects().add(new ColorEffect(java.awt.Color.white)); 
     return (returnFont); 
    } 

    public int getID(){ 
     return this.stateId; //Returns the Id of this state (menu is 0) 
    } 
} 

Для удобства:

Это идет с BasicGameState - Это как работает Slick2D - вы можете просто скопировать - вставить код: P

package Help; 
import org.newdawn.slick.AppGameContainer; 
import org.newdawn.slick.GameContainer; 
import org.newdawn.slick.SlickException; 
import org.newdawn.slick.state.StateBasedGame; 

public class Game extends StateBasedGame{ 

    public static final String gamename = "Problem!"; 
    public static final int TextFieldTestNum = 1; 

    public Game(String gamename){ 
     super(gamename); 
     this.addState(new TextFieldTest(TextFieldTestNum)); 

    } 
    public void initStatesList(GameContainer gc) throws SlickException{ 
     this.getState(TextFieldTestNum).init(gc, this); 
     this.enterState(TextFieldTestNum); //The First state to enter 
    } 

    @Override 
    public boolean closeRequested(){ 
     System.exit(0); 
     return false; 
    } 

    public static void main(String[] args) { 
     AppGameContainer appgc; 
     try{ 
      Game g = new Game(gamename); 
      appgc = new AppGameContainer(g); 
      appgc.setDisplayMode(500, 500, false); 
      appgc.start(); 
     }catch(SlickException e){ 
      e.printStackTrace(); 
     } 
    } 
} 

Любые идеи оценены!

ответ

2

Ваша проблема в том, как вы собираетесь использовать StateBasedGames в slick. Если вы ссылаетесь на мою запись в вики здесь: http://slick.ninjacave.com/wiki/index.php?title=Game_States

Вы заметите, что в методе initStatesList() я использую this.addState (new StateName()). Это связано с тем, что делает метод addState(). Он вызывает метод init для вас, поэтому нет необходимости делать getState() или enterState() в классе приложений верхнего уровня (Game.java в вашем случае).

Чтобы обобщить, как исправить вашу проблему, удалите все в вашем методе initStatesList(), , затем переместите this.addState (новый TextFieldTest (TextFieldTestNum)); от вашего основного конструктора до метода initStatesList().

Как только я исправил это в вашей программе, все прошло отлично.

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