2016-08-24 11 views
0

複数の単語(ランダムに生成される)が画面の上部に表示され、下部に表示されるようにしています。これは、フォントが画面上に複数回描かれていることを意味します。しかし、新しい単語が出現するたびに、その単語を前の単語とは異なるものに変更する必要があります。これはうまくいくが、何らかの理由で最初に出現した言葉も変わる。ここでLibGDX:1つのフォントを別のテキストで複数回描画します。

は私のコードです:

PlayStateクラス:

public class PlayState extends State { 

// TODO: add a background 

private BitmapFont font; 
private Word word; 

public PlayState(GameStateManager gsm) { 
    super(gsm); 

    cam.setToOrtho(false, Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()/2); 

    // TODO: change the font of the random word 

    font = new BitmapFont(); 
    font.setColor(Color.BLACK); 

    word = new Word(); 
} 

@Override 
protected void handleInput() { 

} 

@Override 
public void update(float dt) { 
    handleInput(); 
} 

@Override 
public void render(SpriteBatch batch) { 

    // TODO: make it so it changes the next word that spawns 

    // Check how much time has passed since a new word has been spawned 
    // and create a new one if necessary 
    if (TimeUtils.nanoTime() - word.lastWordTime > 1000000000) { 
     word.spawnWord(); 
    } 

    Iterator<Rectangle> iter = word.words.iterator(); 
    while (iter.hasNext()) { 
     Rectangle word = iter.next(); 
     word.y -= 200 * Gdx.graphics.getDeltaTime(); // move the words at a constant speed of 200 pixels/units per second 

     // If the word reaches the bottom, remove it from the array 
     if (word.y + 64 < 0) { 
      iter.remove(); 
     } 
    } 

    batch.setProjectionMatrix(cam.combined); 

    batch.begin(); 
    for (Rectangle word1 : word.words) { 
     font.draw(batch, word.getWordString(), word1.x, word1.y); 
    } 
    batch.end(); 
} 

@Override 
public void dispose() { 
    font.dispose(); 
} 
} 

単語クラス:

public class Word { 

public Array<Rectangle> words; 
public long lastWordTime; 

private FileHandle file, file2; 
private BufferedReader reader, reader2; 
private List<String> lines, lines2; 
private String line, line2; 
private Random random; 
private String wordString; 

public Word(){ 
    words = new Array<Rectangle>(); 
    spawnWord(); 
} 

// Set the new Rectangle to a random position at the top of the screen 
// and adds it to the words array 
public void spawnWord() { 
    Rectangle word = new Rectangle(); 
    word.x = MathUtils.random(0, Gdx.graphics.getWidth()/2 - 64); 
    word.y = Gdx.graphics.getHeight(); 

    words.add(word); 
    lastWordTime = TimeUtils.nanoTime(); 

    // Read the file and put it into a list of strings 
    file = Gdx.files.internal("words/wordsEn.txt"); 
    file2 = Gdx.files.internal("words/swearWords.txt"); 
    reader = new BufferedReader(file.reader()); 
    reader2 = new BufferedReader(file2.reader()); 
    lines = new ArrayList<String>(); 
    lines2 = new ArrayList<String>(); 

    try { 
     line = reader.readLine(); 
     line2 = reader2.readLine(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    while (line != null && line2 != null){ 
     lines.add(line); 
     lines2.add(line2); 

     try { 
      line = reader.readLine(); 
      line2 = reader.readLine(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    // Choose a random string from the list 
    random = new Random(); 
    wordString = lines.get(random.nextInt(lines.size())); 

    // Filter out bad words 
    if (lines2.contains(wordString)) { 
     wordString = lines.get(random.nextInt(lines.size())); 
    } 
} 

public String getWordString(){ 
    return wordString; 
} 
} 

私はPlayStateクラスのrenderメソッドにそれを絞り込んだと思います

batch.begin(); 
    for (Rectangle word1 : word.words) { 
     font.draw(batch, word.getWordString(), word1.x, word1.y); 
    } 
batch.end(); 

getWordString()メソッドから正しい値を取得しますが、新しく出現した単語だけではなく、画面上のフォントに関係するすべてのものを変更します。

EDIT:スネーの例を実装しようとした後

public void spawnWord() { 
    wordRectangle.word.x = MathUtils.random(0, Gdx.graphics.getWidth()/2 - 64); 
    wordRectangle.word.y = Gdx.graphics.getHeight(); 

    words.add(wordRectangle.word); 
    lastWordTime = TimeUtils.nanoTime(); 

私は "RectangleがWordRectangleに変換することができません" と言うwords.add(wordRectangle.word)上のエラーを取得しています。私は間違ったことを追加していると思う。

+1

word.getWordString()はwordStringへの参照です。 wordStringを1つの場所で変更すると、それは他のすべての場所で反映されます。 – Sneh

答えて

0

これは、描画呼び出しで参照される変数wordStringを更新するためです。ですから、あなたがそれを更新すると、どこにでも反映されます。

この問題を解決するには、矩形と単語を別のクラスに保持することです。

public class WordRectangle { 

    public String word; 

    public Rectangle rectangle; 

} 

は、今すぐあなたの単語クラスで上記のクラスのコレクションを持っていて、新しい単語を起動するとき、コレクションに新しいオブジェクトを追加します。あなたのrenderメソッド

batch.begin(); 
    for (WordRectangle word1 : word.words) { 
     font.draw(batch, word1.word, word1.rectangle.x, word1.rectangle.y); 
    } 
batch.end(); 

で次に

は、私はまた、あなたがあなたのために何か私たちをクリアするthis便利な記事を読むことをお勧めします。

+0

私は記事を読んであなたの解決策を試しましたが、レンダリングメソッドにエラーが発生しました。これは 'WordRectangle'が' Rectangle'であるべきだと言います。私は何が起こっているか完全に理解していません。 – GeeSplit

+0

はい、rectangeを単語矩形に格納しようとしている可能性があります。私が言及したように、あなたはArray を使用して、四角形と単語をWordRectangleの内部とオブジェクトに追加してから、最後にコレクションに追加する必要があります。 – Sneh

+0

私はその部分を意図的に残して、理解して自分で試してみることができます。 – Sneh

関連する問題