Почему мой метод create() не распознает глобальную переменную? - Java LibGDX

У меня есть глобальные переменные, называемые:

private int currentLevel;
private int mapHeight;

У меня есть конструктор для моей игры, где currentLevel = уровень, введенный при вызове метода setScreen():

public ElevatorLevel(Game g, int level)
{  
    super(g, level);  
    currentLevel = level;
}

В моем методе create() я установил для mapHeight значение 750 * currentLevel (которое начинается с единицы), однако, когда я пытаюсь создать лезвия, как показано ниже, они появляются между -200 и 300. Это потому, что программа не распознает currentLevel (я предполагаю), поэтому он ни на что не умножается, в результате получается -200.

public void create() 
{   
    world = new World(new Vector2(0, -9.8f), true);
    timeElapsed = 0;
    mapHeight = 750 * currentLevel;

    blade = new PhysicsActor();
        blade.storeAnimation( "", exTex );
        blade.setOriginCenter();
        blade.circularBoundary();
        blade.setMaxSpeed(50);
        blade.setDeceleration(50);

    bladesList = new ArrayList<PhysicsActor>();
        for (int i = 0; i < 3 ; i++)
        {
            blades = blade.clone();
            float xCoord = randomFloatGenerator(440, 20);
            float yCoord = randomFloatGenerator(mapHeight - 200, 300);
            blades.setPosition(xCoord, yCoord);
            mainStage.addActor(blades);
            bladesList.add(blades);
        }

Почему мой метод create() не распознает глобальную переменную? - Java LibGDX

У меня также есть метка в моем методе обновления (float dt), для которой установлено значение:

timeLabel.setText("Level: " + currentLevel);

Как видно на изображении выше, currentLevel распознается по метке, но не по mapHeight в create(). Как сделать, чтобы currentLevel распознавался методом create()?

Не «принимайте» вещи. Просто отлаживайте свой код. Проверьте, каково значение «mapHeight» и «currentLevel» в методе создания.

RKrum 21.01.2019 17:07

@RhuanKrum mapHeight и currentLevel не имеют значения в качестве глобальных переменных. Как только конструктор класса вызывается на экране главного меню, currentLevel должен равняться 1. Когда я умножаю 750 на currentLevel, чтобы установить значение mapHeight, оно равняется 0. Я не могу понять, почему mapHeight не равно 750, когда конструктор устанавливает int level = 1, следовательно, currentLevel = 1.

ShaheerL 21.01.2019 17:12

Можете ли вы опубликовать полный код этого класса?

Fahim Farook 21.01.2019 17:28

Конструктор ElevatorLevel не будет вызываться, если вы вызываете setScreen(). Конструктор ElevatorLevel будет вызываться только в том случае, если вы создадите экземпляр этого объекта, например: ElevatorLevel el = new ElevatorLevel();. Если вы вызовете setScreen(), будет вызван метод show() на вашем экране, но не конструктор. Попробуйте установить код, в котором вы устанавливаете currentLevel в методе show().

Morchul 22.01.2019 09:15

@Morchul Метод setScreen() использовался следующим образом: game.setScreen(новый ElevatorLevel(game, 1)). Кроме того, оказалось, что я заставил его работать сам. Будет опубликован ответ.

ShaheerL 23.01.2019 00:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
155
1

Ответы 1

Ниже приведен стандартный код портретного приложения, которое я использую почти в каждом проекте libgdx. Я никогда не использую метод create. Вместо этого я использую конструктор, этот код самый безглючный из тех, что я мог найти.

ЭКРАН ИГРЫ ИЛИ МЕНЮ:

public class TutorialScreen implements Screen    {
private OrthographicCamera camera;

public static final float WORLD_HEIGHT = 240;
public static final float WORLD_WIDTH = 135;
private Viewport viewport;
private Stage stage;

private EntryPoint game;
private AdsController adsController;





public TutorialScreen(final EntryPoint game, final AdsController adsController){

    this.adsController = adsController;
    this.game = game;

    adsController.hideBannerAd();

    float aspectRatio = (float) (Gdx.graphics.getHeight() / Gdx.graphics.getWidth());
    camera = new OrthographicCamera(aspectRatio * WORLD_WIDTH, WORLD_HEIGHT);
    camera.setToOrtho(false);
    viewport = new FitViewport(WORLD_WIDTH , WORLD_HEIGHT,camera );
    stage = new Stage(viewport, game.batch);      

}



@Override
public void show() {

}

@Override
public void render(float delta) {

    stage.draw();
    stage.act();




}

@Override
public void resize(int width, int height) {

}

@Override
public void pause() {

}

@Override
public void resume() {

}

@Override
public void hide() {

}

@Override
public void dispose() {

}
}

ТОЧКА ВХОДА, КОТОРУЮ ВАШЕ ПРИЛОЖЕНИЕ ОТКРЫТ ПЕРВЫМ:

package some.package;



public class EntryPoint extends Game {
SpriteBatch batch;
final AdsController adsController;



 public EntryPoint(final AdsController adsController ){

    this.adsController = adsController; //Interface for admob


}

@Override
public void create () {

    batch = new SpriteBatch();

    this.setScreen(new YourScreenClass(this,adsController)); //Above is tutorial so this would be new TutorialScreen(this,adsController)

}

@Override
public void render () {
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    batch.begin();

    batch.end();
    super.render();
}

@Override
public void dispose () {
    batch.dispose();

}
}

Возможно, пропущены фигурные скобки или ";" Но ты получил идею. Таким образом, вы не столкнетесь с какими-либо проблемами со ссылками.

Другие вопросы по теме