複数の単語(ランダムに生成される)が画面の上部に表示され、下部に表示されるようにしています。これは、フォントが画面上に複数回描かれていることを意味します。しかし、新しい単語が出現するたびに、その単語を前の単語とは異なるものに変更する必要があります。これはうまくいくが、何らかの理由で最初に出現した言葉も変わる。ここで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)
上のエラーを取得しています。私は間違ったことを追加していると思う。
word.getWordString()はwordStringへの参照です。 wordStringを1つの場所で変更すると、それは他のすべての場所で反映されます。 – Sneh