У меня есть глобальные переменные, называемые:
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);
}
У меня также есть метка в моем методе обновления (float dt), для которой установлено значение:
timeLabel.setText("Level: " + currentLevel);
Как видно на изображении выше, currentLevel распознается по метке, но не по mapHeight в create(). Как сделать, чтобы currentLevel распознавался методом create()?
@RhuanKrum mapHeight и currentLevel не имеют значения в качестве глобальных переменных. Как только конструктор класса вызывается на экране главного меню, currentLevel должен равняться 1. Когда я умножаю 750 на currentLevel, чтобы установить значение mapHeight, оно равняется 0. Я не могу понять, почему mapHeight не равно 750, когда конструктор устанавливает int level = 1, следовательно, currentLevel = 1.
Можете ли вы опубликовать полный код этого класса?
Конструктор ElevatorLevel не будет вызываться, если вы вызываете setScreen(). Конструктор ElevatorLevel будет вызываться только в том случае, если вы создадите экземпляр этого объекта, например: ElevatorLevel el = new ElevatorLevel();. Если вы вызовете setScreen(), будет вызван метод show() на вашем экране, но не конструктор. Попробуйте установить код, в котором вы устанавливаете currentLevel в методе show().
@Morchul Метод setScreen() использовался следующим образом: game.setScreen(новый ElevatorLevel(game, 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();
}
}
Возможно, пропущены фигурные скобки или ";" Но ты получил идею. Таким образом, вы не столкнетесь с какими-либо проблемами со ссылками.
Не «принимайте» вещи. Просто отлаживайте свой код. Проверьте, каково значение «mapHeight» и «currentLevel» в методе создания.