Когда в Android я должен поместить основной игровой цикл в начальный класс активности?

Я пытаюсь создать игровой цикл, используя это руководство.

Я попытался реализовать это в начальном классе активности, как показано ниже, но столкнулся с несколькими проблемами. Я запросил полный экран и отсутствие функций заголовка, как показано, но я их не получаю, и requestRender не работает.

Когда для «running» установлено значение «false», игровой цикл пропускается, и рендерер визуализирует один кадр (режим рендеринга установлен на «грязный»)

Это не то, что происходит при запуске = true.

import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;



public class Practice extends Activity {

private Input input;
private GLSurfaceRenderer glSurfaceRenderer;
private final static int maxFPS = 30;
private final static int maxFrameSkips = 5;
private final static int framePeriod = 1000 / maxFPS;
public final static String TAG = "input";

public boolean running = true;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    input = new Input(this);
    setContentView(input);

    long beginTime;
    long timeDiff;
    int sleepTime;
    int framesSkipped;

    sleepTime = 0;
    while (running) {
        Log.d(TAG, "gameRunning");
        beginTime = System.currentTimeMillis();
        framesSkipped = 0;
        this.input.update();
        this.input.requestRender();
        timeDiff = System.currentTimeMillis() - beginTime;
        sleepTime = (int)(framePeriod - timeDiff);

        if (sleepTime > 0) {
            try{
                Thread.sleep(sleepTime);
            }catch(InterruptedException e){}
        }

        while(sleepTime < 0 && framesSkipped < maxFrameSkips){
            this.input.update();
            sleepTime += framePeriod;
            framesSkipped++;
            Log.d(TAG, "Frames Skipped");
        }

    }
}
}

На данный момент игровая логика обновляется нормально, но рендерер вообще не рендерит (просто черный экран)

Я почти уверен, что это просто перетасовка кода, но есть ли у кого-нибудь предложения?


person Jack    schedule 15.09.2011    source источник


Ответы (1)


Основная причина вашей проблемы заключается в том, что onCreate() не возвращается. Это необходимо для того, чтобы приложение работало, это поток, который обрабатывает все входные данные и изменения пользовательского интерфейса. Я вижу здесь много энергии, которая не сфокусирована. Ознакомьтесь с руководствами, базовыми руководствами по пользовательскому интерфейсу, прочитайте жизненный цикл Android и обратите внимание на ANR. Они дадут вам лучшее понимание того, как все работает и как совместить вашу деятельность со вторым потоком.

person Dan S    schedule 15.09.2011
comment
Эй, я немного переделал свой код, так что мой игровой цикл теперь находится в отдельном методе (когда этот метод не вызывается, рендерер визуализирует только один кадр), но по какой-то причине, если я попытаюсь вызвать этот метод из моего onCreate или onResume, то я получаю тот же старый не полноэкранный и не отображаемый сценарий. Как мне вызвать мой игровой цикл, чтобы избежать этого =/ - person Jack; 17.09.2011
comment
Вроде... Я знаю, что это такое, но я не уверен в реализации. Я предполагаю, что поток — это класс, который расширяет поток, и есть какой-то особый способ запуска потока. В настоящее время я немного просматриваю oracle.com информации, я думаю, мне нужно запустить поток из onResume =/ - person Jack; 17.09.2011