Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 7.46 KB | None | 0 0
  1. package com.mygdx.mygame.states;
  2.  
  3. import com.badlogic.gdx.graphics.OrthographicCamera;
  4. import com.badlogic.gdx.graphics.g2d.SpriteBatch;
  5. import com.badlogic.gdx.math.Vector3;
  6.  
  7. // класс состояния игры
  8. public abstract class State {
  9.  
  10.     protected OrthographicCamera camera;
  11.     protected Vector3 mouse; // используется для OrthographicCamera, координата z=0 не будет задействована
  12.     protected  GameStateManager gsm; // управляет окнами и их состоянием
  13.  
  14.     public State(GameStateManager gsm) {
  15.         // инициализация
  16.         this.gsm = gsm;
  17.         camera = new OrthographicCamera();
  18.         mouse = new Vector3();
  19.     }
  20.  
  21.     // опрашивает, были ли нажаты определенные клавиши. Если да, камера будет изменяться соответствующим образом
  22.     protected abstract void handleInput();
  23.     // обновляет картинку через определенные промежутки времени
  24.     public abstract  void update(float dt);
  25.     // метод рисует экран предоставляет текстуру и предоставляет координаты
  26.     public abstract  void render(SpriteBatch sb);
  27.     // освобождает ресурсы , уничтожает экземпляр класса, когда он становится не нужным
  28.     public abstract void dispose();
  29.  
  30. }
  31.  
  32.  
  33.  
  34.  
  35.  
  36. package com.mygdx.mygame.states;
  37.  
  38. import com.badlogic.gdx.Gdx;
  39. import com.badlogic.gdx.Preferences;
  40. import com.badlogic.gdx.graphics.Texture;
  41. import com.badlogic.gdx.graphics.g2d.BitmapFont;
  42. import com.badlogic.gdx.graphics.g2d.SpriteBatch;
  43. import com.badlogic.gdx.math.Vector2;
  44. import com.badlogic.gdx.utils.Array;
  45. import com.mygdx.mygame.MyGdxGame;
  46. import com.mygdx.mygame.sprites.Bird;
  47. import com.mygdx.mygame.sprites.Tube;
  48.  
  49. // игровой экран
  50. public class PlayState extends State {
  51.  
  52.     public static final int TUBE_SPACING = 125; // расстояние между появляющимися трубами по ширине
  53.     public static final int TUBE_COUNT = 4; // 4 комплекта труб, будут появляться последовательно
  54.     public static final int GROUND_Y_OFFSET = -30; // опускаем землю ниже
  55.  
  56.     private Texture bg; // текстура фона
  57.     private Bird bird;// текстура птицы
  58.     private Texture ground; // текстура земли
  59.     private Vector2 groundPos1, groundPos2; // создаем вектор, тк земля будет двигаться в кадре. Вектор2 - две текстуры будут двигаться друг за другом
  60.  
  61.     int score = 0;
  62.     private BitmapFont font;
  63.     private Preferences prefs;
  64.  
  65.     // создаем массив, тк труб больше, чем 1
  66.     private Array<Tube> tubes;
  67.  
  68.     public PlayState(GameStateManager gsm) {
  69.         super(gsm);
  70.         prefs = Gdx.app.getPreferences("My Preferences");
  71.         font = new BitmapFont();
  72.         bird = new Bird(50, 300);
  73.         // по разрешению экрана (увеличели птичку)
  74.         camera.setToOrtho(false, MyGdxGame.WIDTH / 2, MyGdxGame.HEIGHT / 2);
  75.         bg = new Texture("bg.png");
  76.         ground = new Texture("ground.png");
  77.         groundPos1 = new Vector2(camera.position.x - camera.viewportWidth / 2, GROUND_Y_OFFSET);
  78.         groundPos2 = new Vector2((camera.position.x - camera.viewportWidth / 2) + ground.getWidth(), GROUND_Y_OFFSET);
  79.  
  80.         tubes = new Array<Tube>();
  81.  
  82.         // цикл будет создавать трубы, пока его значение не будет равно TUBE_COUNT
  83.         for (int i = 0; i < TUBE_COUNT; i++) {
  84.             tubes.add(new Tube(i * (TUBE_SPACING + Tube.TUBE_WIDTH)));
  85.         }
  86.     }
  87.  
  88.     // вызов метода jump по клику на экране
  89.     @Override
  90.     protected void handleInput() {
  91.         if (Gdx.input.justTouched()){
  92.             bird.jump();
  93.         }
  94.     }
  95.  
  96.     @Override
  97.     public void update(float dt) {
  98.         // инициализация
  99.         handleInput();
  100.         updateGround();
  101.         bird.update(dt); // вызов метода
  102.         // чтобы птица не вылетала за экран и камера двигалась вместе с ней
  103.         camera.position.x = bird.getPosition().x + 80;
  104.         // движение труб (вызывается в зависимости от положения камеры). Трубы просто создаются, не двигаются
  105.         for (int i = 0; i < tubes.size; i++) {
  106.             Tube tube = tubes.get(i);
  107.             if (camera.position.x - (camera.viewportWidth / 2) > tube.getPosTopTube().x + tube.getTopTube().getWidth()) {
  108.                 tube.reposition(tube.getPosTopTube().x + ((Tube.TUBE_WIDTH + TUBE_SPACING) * TUBE_COUNT));
  109.             }
  110.  
  111.             // при столкновении перезапускает игру
  112.             if (tube.collades(bird.getBounds())) {
  113.                 int oldScore = prefs.getInteger("BestScore") ;
  114.                 if (score > oldScore) {
  115.                     prefs.putInteger("BestScore", score);
  116.                     prefs.flush();
  117.                 }
  118.                 // класс GameOver
  119.                 gsm.set(new GameOver((gsm)));
  120.                 // лучший счет
  121.             } else {
  122.                 score ++;
  123.             }
  124.         }
  125.         // обновляем камеру
  126.         camera.update();
  127.     }
  128.  
  129.     @Override
  130.     // отрисовка текстур
  131.     public void render(SpriteBatch sb) {
  132.         // матрица проекций для камеры
  133.         sb.setProjectionMatrix(camera.combined);
  134.         sb.begin();
  135.         // фон, по центру экрана
  136.         sb.draw(bg, camera.position.x - (camera.viewportWidth / 2), 0 );
  137.         // для отрисовки позиции птицы из класса Bird
  138.         sb.draw(bird.getBird(), bird.getPosition().x, bird.getPosition().y);
  139.         // отрисовка труб
  140.         for (Tube tube : tubes) {
  141.             sb.draw(tube.getTopTube(), tube.getPosBotTube().x, tube.getPosTopTube().y);
  142.             sb.draw(tube.getBottomTube(), tube.getPosBotTube().x, tube.getPosBotTube().y);
  143.         }
  144.         // отрисовываем текстуры земли
  145.         sb.draw(ground, groundPos1.x, groundPos1.y);
  146.         sb.draw(ground, groundPos2.x, groundPos2.y);
  147.         font.draw(sb, Integer.toString(score), camera.position.x - (camera.viewportWidth / 2),200);
  148.         sb.end();
  149.  
  150.     }
  151.  
  152.     @Override
  153.     public void dispose() {
  154.         bg.dispose();
  155.         bird.dispose();
  156.         ground.dispose();
  157.         // уничножение текстур труб для каждого элемента (поэтому цикл)
  158.         for (Tube tube : tubes) {
  159.             tube.dispose();
  160.         }
  161.  
  162.     }
  163.  
  164.     // для непрерывности текстуры земли
  165.     private void  updateGround() {
  166.         if (camera.position.x - (camera.viewportWidth / 2) > groundPos1.x + ground.getWidth()) {
  167.             groundPos1.add(ground.getWidth() * 2, 0);
  168.         }
  169.         if (camera.position.x - (camera.viewportWidth / 2) > groundPos2.x + ground.getWidth()) {
  170.             groundPos2.add(ground.getWidth() * 2, 0);
  171.         }
  172.     }
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement