#java #android
#java #Android
Вопрос:
У меня есть несколько проблем, из-за которых мне трудно найти хорошую информацию о том, как исправить. Во-первых, у меня есть экран завершения игры, который отображается, когда он должен. Я пытался использовать установку для запущенных потоков значения false, чтобы они прекращали работу, а затем при касании экрана возвращали ему значение true, но это не возвращает экран к его запуску. Также мне понадобится возможность фактически очищать все моменты времени, чтобы он сбрасывал его (какой хороший способ сделать это). Это аналогично мне понадобится, я предполагаю, для приостановки и возобновления. Если для параметра running не установлено значение false, кажется, что он продолжает работать даже с sleep(), только с более медленными приращениями. Вот моя тема, чтобы посмотреть, заметили ли вы, что я могу сделать.
public class GameLoopThread extends Thread {
private GameView view;
public static boolean running = false;
static final long FPS = 10;
public GameLoopThread(GameView view) {
this.view = view;
}
public void setRunning(boolean run) {
running = run;
}
@Override
public void run() {
long ticksPS = 1000 / FPS;
long startTime;
long sleepTime;
while (running) {
Canvas c = null;
startTime = System.currentTimeMillis();
try {
c = view.getHolder().lockCanvas();
synchronized (view.getHolder()) {
view.onDraw(c);
}
} finally {
if (c != null) {
view.getHolder().unlockCanvasAndPost(c);
}
}
sleepTime = ticksPS-(System.currentTimeMillis() - startTime);
try {
if (sleepTime > 0)
sleep(sleepTime);
else
sleep(10);
} catch (Exception e) {}
}
}
}
Теперь эта часть вызывает большую проблему с приостановкой / возобновлением. У меня есть handler.postDelayed, обрабатывающий создание моих спрайтов. В основном, когда экран кажется приостановленным (потому что это выглядит так, если я использую режим ожидания), проблема в том, что обработчику (который находится в режиме просмотра игры) кажется, что время для него все еще истекает. Есть ли способ сбросить его обратно на ноль … предпочтительно в обоих классах для завершения игры, а также приостановить обработчик во время паузы? Спасибо
РЕДАКТИРОВАТЬ: На данный момент я пытаюсь использовать меню опций для создания новой игры, заставляя его повторно открывать действие, которое запускает игру. Кажется, что он сбрасывает его, но он замораживает его в процессе. Кто-нибудь знает, как я могу это исправить?
@Override
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.newgame:
GameView.gameState=0;
GameLoopThread.running=true;
Intent game = new Intent(PlayGame.this, PlayGame.class);
startActivity(game);
break;
case R.id.pause: Toast.makeText(this, "You pressed Pause", Toast.LENGTH_LONG).show();
break;
case R.id.quit: Toast.makeText(this, "You pressed Quit", Toast.LENGTH_LONG).show();
break;
}
return true;
}
Это мое меню опций.
Ответ №1:
Может показаться, что это не тот ответ, который вы ищете, но если вы хотите создать код, который легко расширяется (и изучить новый шаблон разработки!), то это правильный путь.
Большинство игр используют конечный автомат для такого рода вещей.
Например
interface GameState{
public void render(long elapsedTime);
}
Теперь вы можете создавать различные состояния, такие как MenuState, GameState, PauseState, OptionState, GameOverState и т.д.
Некоторый псевдокод для передачи идеи:
State currentState = null;
public void run(){
while(true){
// Do your loop here
currentState.render(time);
}
}
public void setState(State state){
currentState = state;
}
Указывает пример:
public class MenuState implements GameState{
public void render(long elapsedTime){
//Render menu here
}
}
Или
public class GameState implements GameState{
public void render(long elapsedTime){
//Render gameplay here
}
}
currentState указывает на текущее состояние и решает, какое из них будет отображено / обновлено. Просто измените его ссылку, и отобразится ваше меню паузы.
Это очень распространенный шаблон проектирования в играх, поищите вокруг!
Удачи!