Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.mygdx.mygame.states;
- import com.badlogic.gdx.graphics.OrthographicCamera;
- import com.badlogic.gdx.graphics.g2d.SpriteBatch;
- import com.badlogic.gdx.math.Vector3;
- // класс состояния игры
- public abstract class State {
- protected OrthographicCamera camera;
- protected Vector3 mouse; // используется для OrthographicCamera, координата z=0 не будет задействована
- protected GameStateManager gsm; // управляет окнами и их состоянием
- public State(GameStateManager gsm) {
- // инициализация
- this.gsm = gsm;
- camera = new OrthographicCamera();
- mouse = new Vector3();
- }
- // опрашивает, были ли нажаты определенные клавиши. Если да, камера будет изменяться соответствующим образом
- protected abstract void handleInput();
- // обновляет картинку через определенные промежутки времени
- public abstract void update(float dt);
- // метод рисует экран предоставляет текстуру и предоставляет координаты
- public abstract void render(SpriteBatch sb);
- // освобождает ресурсы , уничтожает экземпляр класса, когда он становится не нужным
- public abstract void dispose();
- }
- package com.mygdx.mygame.states;
- import com.badlogic.gdx.Gdx;
- import com.badlogic.gdx.Preferences;
- import com.badlogic.gdx.graphics.Texture;
- import com.badlogic.gdx.graphics.g2d.BitmapFont;
- import com.badlogic.gdx.graphics.g2d.SpriteBatch;
- import com.badlogic.gdx.math.Vector2;
- import com.badlogic.gdx.utils.Array;
- import com.mygdx.mygame.MyGdxGame;
- import com.mygdx.mygame.sprites.Bird;
- import com.mygdx.mygame.sprites.Tube;
- // игровой экран
- public class PlayState extends State {
- public static final int TUBE_SPACING = 125; // расстояние между появляющимися трубами по ширине
- public static final int TUBE_COUNT = 4; // 4 комплекта труб, будут появляться последовательно
- public static final int GROUND_Y_OFFSET = -30; // опускаем землю ниже
- private Texture bg; // текстура фона
- private Bird bird;// текстура птицы
- private Texture ground; // текстура земли
- private Vector2 groundPos1, groundPos2; // создаем вектор, тк земля будет двигаться в кадре. Вектор2 - две текстуры будут двигаться друг за другом
- int score = 0;
- private BitmapFont font;
- private Preferences prefs;
- // создаем массив, тк труб больше, чем 1
- private Array<Tube> tubes;
- public PlayState(GameStateManager gsm) {
- super(gsm);
- prefs = Gdx.app.getPreferences("My Preferences");
- font = new BitmapFont();
- bird = new Bird(50, 300);
- // по разрешению экрана (увеличели птичку)
- camera.setToOrtho(false, MyGdxGame.WIDTH / 2, MyGdxGame.HEIGHT / 2);
- bg = new Texture("bg.png");
- ground = new Texture("ground.png");
- groundPos1 = new Vector2(camera.position.x - camera.viewportWidth / 2, GROUND_Y_OFFSET);
- groundPos2 = new Vector2((camera.position.x - camera.viewportWidth / 2) + ground.getWidth(), GROUND_Y_OFFSET);
- tubes = new Array<Tube>();
- // цикл будет создавать трубы, пока его значение не будет равно TUBE_COUNT
- for (int i = 0; i < TUBE_COUNT; i++) {
- tubes.add(new Tube(i * (TUBE_SPACING + Tube.TUBE_WIDTH)));
- }
- }
- // вызов метода jump по клику на экране
- @Override
- protected void handleInput() {
- if (Gdx.input.justTouched()){
- bird.jump();
- }
- }
- @Override
- public void update(float dt) {
- // инициализация
- handleInput();
- updateGround();
- bird.update(dt); // вызов метода
- // чтобы птица не вылетала за экран и камера двигалась вместе с ней
- camera.position.x = bird.getPosition().x + 80;
- // движение труб (вызывается в зависимости от положения камеры). Трубы просто создаются, не двигаются
- for (int i = 0; i < tubes.size; i++) {
- Tube tube = tubes.get(i);
- if (camera.position.x - (camera.viewportWidth / 2) > tube.getPosTopTube().x + tube.getTopTube().getWidth()) {
- tube.reposition(tube.getPosTopTube().x + ((Tube.TUBE_WIDTH + TUBE_SPACING) * TUBE_COUNT));
- }
- // при столкновении перезапускает игру
- if (tube.collades(bird.getBounds())) {
- int oldScore = prefs.getInteger("BestScore") ;
- if (score > oldScore) {
- prefs.putInteger("BestScore", score);
- prefs.flush();
- }
- // класс GameOver
- gsm.set(new GameOver((gsm)));
- // лучший счет
- } else {
- score ++;
- }
- }
- // обновляем камеру
- camera.update();
- }
- @Override
- // отрисовка текстур
- public void render(SpriteBatch sb) {
- // матрица проекций для камеры
- sb.setProjectionMatrix(camera.combined);
- sb.begin();
- // фон, по центру экрана
- sb.draw(bg, camera.position.x - (camera.viewportWidth / 2), 0 );
- // для отрисовки позиции птицы из класса Bird
- sb.draw(bird.getBird(), bird.getPosition().x, bird.getPosition().y);
- // отрисовка труб
- for (Tube tube : tubes) {
- sb.draw(tube.getTopTube(), tube.getPosBotTube().x, tube.getPosTopTube().y);
- sb.draw(tube.getBottomTube(), tube.getPosBotTube().x, tube.getPosBotTube().y);
- }
- // отрисовываем текстуры земли
- sb.draw(ground, groundPos1.x, groundPos1.y);
- sb.draw(ground, groundPos2.x, groundPos2.y);
- font.draw(sb, Integer.toString(score), camera.position.x - (camera.viewportWidth / 2),200);
- sb.end();
- }
- @Override
- public void dispose() {
- bg.dispose();
- bird.dispose();
- ground.dispose();
- // уничножение текстур труб для каждого элемента (поэтому цикл)
- for (Tube tube : tubes) {
- tube.dispose();
- }
- }
- // для непрерывности текстуры земли
- private void updateGround() {
- if (camera.position.x - (camera.viewportWidth / 2) > groundPos1.x + ground.getWidth()) {
- groundPos1.add(ground.getWidth() * 2, 0);
- }
- if (camera.position.x - (camera.viewportWidth / 2) > groundPos2.x + ground.getWidth()) {
- groundPos2.add(ground.getWidth() * 2, 0);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement