Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 15.24 KB | None | 0 0
  1. package com.mygdx.mygame.states;
  2.  
  3. import com.badlogic.gdx.Gdx;
  4. import com.badlogic.gdx.Preferences;
  5. import com.badlogic.gdx.graphics.Texture;
  6. import com.badlogic.gdx.graphics.g2d.BitmapFont;
  7. import com.badlogic.gdx.graphics.g2d.SpriteBatch;
  8. import com.mygdx.mygame.MyGdxGame;
  9.  
  10.  
  11. public class MenuState extends State {
  12.  
  13.     private Texture background;
  14.     private Texture playBtn;
  15.     private BitmapFont font;
  16.     private int bestScore;
  17.  
  18.     public MenuState(GameStateManager gsm) {
  19.         super(gsm);
  20.         font = new BitmapFont();
  21.         Preferences prefs = Gdx.app.getPreferences("My Preferences");
  22.         bestScore = prefs.getInteger("BestScore");
  23.         // инициализируем камеру (чтобы в эмуляторе были необхидимые размеры)
  24.         camera.setToOrtho(false, MyGdxGame.WIDTH / 2, MyGdxGame.HEIGHT / 2);
  25.         background = new Texture("bg.png");
  26.         playBtn = new Texture("playbtn.png");
  27.     }
  28.  
  29.     @Override
  30.     // вызов игрового экрана по клику
  31.     protected void handleInput() {
  32.         // проверяем был ли клик
  33.         if (Gdx.input.justTouched()) {
  34.             // убираем из стека текущий экран
  35.             gsm.set(new PlayState(gsm));
  36.         }
  37.     }
  38.  
  39.     // обновление метода handleInput (вызов метода jump по клику на экране)
  40.     @Override
  41.     public void update(float dt) {
  42.         handleInput();
  43.     }
  44.  
  45.     @Override
  46.     public void render(SpriteBatch sb) {
  47.         // устанавливаем матрицу проекции
  48.         sb.setProjectionMatrix(camera.combined);
  49.         // начало рисования
  50.         sb.begin();
  51.         // рисуем фон (текстура, координаты начала ее отрисовки)
  52.         sb.draw(background, 0, 0);
  53.         // рисует кнопку (разница половины ширины экрана)
  54.         sb.draw(playBtn, camera.position.x - playBtn.getWidth() /  2, camera.position.y );
  55.         font.draw(sb, "Best Score:" + bestScore, 100, 100);
  56.         sb.end(); // конец рисования
  57.     }
  58.  
  59.     // освобождаем ресурсы, уничтожение текстур
  60.     @Override
  61.     public void dispose() {
  62.         background.dispose();
  63.         playBtn.dispose();
  64.     }
  65. }
  66.  
  67.  
  68.  
  69.  
  70.  
  71. package com.mygdx.mygame.states;
  72.  
  73. import com.badlogic.gdx.graphics.g2d.BitmapFont;
  74. import com.badlogic.gdx.graphics.g2d.SpriteBatch;
  75.  
  76. import java.util.Stack;
  77.  
  78. // управляет игровыми состояниями (2 состояния: игра и пауза)
  79. public class GameStateManager {
  80.  
  81.     // массив состояний. Подкласс класса вектор
  82.     private Stack<State> states;
  83.     public BitmapFont font;
  84.  
  85.     // конструктор создает пустой стэк
  86.     public GameStateManager() {
  87.         states = new Stack<State>();
  88.  
  89.     }
  90.     // методы для управления
  91.     public void push(State state) {
  92.         states.push(state); // метод пуш помещает элемент в вершину стэка. Извлекает верхний элемент, удаляя из стэка
  93.     }
  94.     // освобождаем ресурсы
  95.     public  void pop() {
  96.         states.pop().dispose();
  97.     }
  98.  
  99.     // удаляет из стэка верхний экран, очищает его ресурсы (удаляет его объект) и помещает следующий экран в вершину стэка
  100.     public void set(State state) {
  101.         states.pop().dispose();
  102.         states.push(state);
  103.     }
  104.  
  105.     // обновляет игру (обновляет только то игровое состояние, которое находится на вершине стэка)
  106.     public void update(float dt) { // через определенные короткие моменты времени
  107.         states.peek().update(dt); // метод peek возвращает верхний элемент, удаляя его из стэка
  108.     }
  109.  
  110.  
  111.     public  void render(SpriteBatch sb) {
  112.         states.peek().render(sb); // метод peek принимает состояние из верхней части стэка (оставляет его там и отрисовывает)
  113.     }
  114.  
  115. }
  116.  
  117.  
  118.  
  119.  
  120. package com.mygdx.mygame.states;
  121.  
  122. import com.badlogic.gdx.Gdx;
  123. import com.badlogic.gdx.Preferences;
  124. import com.badlogic.gdx.graphics.Texture;
  125. import com.badlogic.gdx.graphics.g2d.BitmapFont;
  126. import com.badlogic.gdx.graphics.g2d.SpriteBatch;
  127. import com.mygdx.mygame.MyGdxGame;
  128.  
  129. public class GameOver extends State {
  130.  
  131.     private Texture background;
  132.     private Texture gameOver;
  133.     private BitmapFont font;
  134.     private int bestScore;
  135.  
  136.     public GameOver(GameStateManager gsm) {
  137.         super(gsm);
  138.         font = new BitmapFont();
  139.         Preferences prefs = Gdx.app.getPreferences("My Preferences");
  140.         bestScore = prefs.getInteger("BestScore");
  141.         // инициализируем камеру (чтобы в эмуляторе были необхидимые размеры)
  142.         camera.setToOrtho(false, MyGdxGame.WIDTH / 2, MyGdxGame.HEIGHT / 2);
  143.         background = new Texture("bg.png");
  144.         gameOver = new Texture("gameover.png");
  145.     }
  146.  
  147.     @Override
  148.     protected void handleInput() { // вызов игрового экрана по клику
  149.         if (Gdx.input.justTouched()) { // проверяем был ли клик
  150.             gsm.set(new PlayState(gsm)); // убираем из тека текущий экран
  151.         }
  152.     }
  153.  
  154.     @Override
  155.     public void update(float dt) {
  156.         handleInput();
  157.     }
  158.  
  159.     @Override
  160.     public void render(SpriteBatch sb) {
  161.         // устанавливаем матрицу проекции
  162.         sb.setProjectionMatrix(camera.combined);
  163.         // начало рисования
  164.         sb.begin();
  165.         // рисуем фон (текстура, координаты начала ее отрисовки)
  166.         sb.draw(background, 0, 0);
  167.         // выводится текстура надписи GameOver
  168.         sb.draw(gameOver, camera.position.x - gameOver.getWidth() /  2, camera.position.y );
  169.         // выводится лучший счет
  170.         font.draw(sb, "Best Score:" + bestScore, 100, 100);
  171.         sb.end(); // конец рисования
  172.     }
  173.  
  174.     // освобождаем ресурсы, уничтожение текстур
  175.     @Override
  176.     public void dispose() {
  177.         background.dispose();
  178.         gameOver.dispose();
  179.     }
  180. }
  181.  
  182.  
  183.  
  184.  
  185.  
  186. package com.mygdx.mygame.sprites;
  187.  
  188. import com.badlogic.gdx.graphics.Texture;
  189. import com.badlogic.gdx.math.Rectangle;
  190. import com.badlogic.gdx.math.Vector2;
  191.  
  192. import java.util.Random;
  193.  
  194. // включает две текстуры трубы
  195. public class Tube {
  196.  
  197.     public static final int TUBE_WIDTH = 52; // ширина трубы
  198.     public static final int FLUCTUATION = 130; // диапазон отклонений труб по высоте
  199.     public static final int TUBE_GAP = 100; // значение высоты просвета
  200.     public static final int LOWEST_OPENING = 120; // нижняя граница просвета
  201.  
  202.     private Texture topTube, bottomTube; // текстуры вехней и нижней трубы
  203.     private Vector2 posTopTube, posBotTube; // тк трубы движущиеся
  204.     private Random rand; // трубы на разной высоте
  205.     private Rectangle boundsTop, boundsBot; // невидимые прямоугольники верхней и нижней трубы
  206.  
  207.     public Tube(float x) {
  208.         topTube = new Texture("toptube.png");
  209.         bottomTube = new Texture("bottomtube.png");
  210.         rand = new Random();
  211.  
  212.         // создаем верхнюю трубу (рандомное значение колебания по высоте)
  213.         posTopTube = new Vector2(x, rand.nextInt(FLUCTUATION) + TUBE_GAP + LOWEST_OPENING);
  214.         // нижняя труба на фиксированной высоте
  215.         posBotTube = new Vector2(x, posTopTube.y - TUBE_GAP - bottomTube.getHeight());
  216.  
  217.         boundsTop = new Rectangle(posTopTube.x, posTopTube.y, topTube.getWidth(), topTube.getHeight());
  218.         boundsBot = new Rectangle(posBotTube.x, posBotTube.y, bottomTube.getWidth(), bottomTube.getHeight());
  219.     }
  220.  
  221.     // движение труб
  222.     public void reposition(float x) {
  223.         posTopTube.set(x, rand.nextInt(FLUCTUATION) + TUBE_GAP + LOWEST_OPENING); // устанавливаем параметры
  224.         posBotTube.set(x, posTopTube.y - TUBE_GAP - bottomTube.getHeight());
  225.         // начальное расположение, совпадающее с расположением труб
  226.         boundsTop.setPosition(posTopTube.x, posTopTube.y);
  227.         boundsBot.setPosition(posBotTube.x, posBotTube.y);
  228.     }
  229.  
  230.     // определяет столкновение птицы с трубами
  231.     public boolean collades(Rectangle player) {
  232.         return player.overlaps(boundsTop) || player.overlaps(boundsBot);
  233.     }
  234.  
  235.     // доступ к переменным из других классов
  236.     public Texture getTopTube() {
  237.         return topTube;
  238.     }
  239.  
  240.     public Texture getBottomTube() {
  241.         return bottomTube;
  242.     }
  243.  
  244.     public Vector2 getPosTopTube() {
  245.         return posTopTube;
  246.     }
  247.  
  248.     public Vector2 getPosBotTube() {
  249.         return posBotTube;
  250.     }
  251.  
  252.     // уничтожение текстур
  253.     public void dispose() {
  254.         topTube.dispose();
  255.         bottomTube.dispose();
  256.     }
  257. }
  258.  
  259.  
  260.  
  261.  
  262.  
  263. package com.mygdx.mygame.sprites;
  264.  
  265. import com.badlogic.gdx.Gdx;
  266. import com.badlogic.gdx.audio.Sound;
  267. import com.badlogic.gdx.graphics.Texture;
  268. import com.badlogic.gdx.graphics.g2d.TextureRegion;
  269. import com.badlogic.gdx.math.Rectangle;
  270. import com.badlogic.gdx.math.Vector3;
  271.  
  272. // описывает птичку и ее поведение
  273. public class Bird {
  274.     public static final int MOVEMENT = 100; // для птички
  275.     public static final  int GRAVITY = -15; // давление на птичку
  276.     private Vector3 position; // позиция птички
  277.     private  Vector3 velosity; // скорость птички
  278.     private Rectangle bounds; // прямоугольник птицы
  279.     private Animation birdAnimation; // анимация птички
  280.     private Sound flap; // звук крыльев
  281.     private Texture texture;
  282.  
  283.     private Texture bird; // текстура птички
  284.  
  285.     // создает птичку и задает направление движения и текстуру
  286.     public  Bird(int x, int y) {
  287.         position = new Vector3(x, y, 0);
  288.         velosity = new Vector3(0,0,0);
  289.         texture = new Texture("birdanimation.png");
  290.         // (кадров анимации = 3, длительность = 0,5 секунды)
  291.         birdAnimation = new Animation(new TextureRegion(texture), 3, 0.5F);
  292.         bounds = new Rectangle(x, y, texture.getWidth() / 3, texture.getHeight() / 3);
  293.         flap = Gdx.audio.newSound(Gdx.files.internal("sfx_wing.ogg"));
  294.     }
  295.  
  296.     public Vector3 getPosition() {
  297.         return position;
  298.     }
  299.     // возвращаем текущий кадр анимации
  300.     public TextureRegion getBird() {
  301.         return birdAnimation.getFrame();
  302.     }
  303.  
  304.     public void update(float dt) {
  305.         birdAnimation.update(dt);
  306.         // чтобы птица не улетала за верхнюю границу экрана
  307.         if (position.y > 0)
  308.             // сила тяжести на птичку
  309.             velosity.add(0, GRAVITY, 0); // add добавляет значение к вектору
  310.         // время скорости умножаем на скаляр
  311.         velosity.scl(dt);
  312.         position.add(MOVEMENT * dt, velosity.y, 0); // add добавляет значение
  313.         // чтобы птица не улетала за нижнюю границу экрана
  314.         if (position.y < 0) {
  315.             position.y = 0;
  316.         }
  317.  
  318.         // падение птицы будет меняться при падении
  319.         velosity.scl(1 / dt);
  320.         // позиция прямоугольника птицы
  321.         bounds.setPosition(position.x, position.y);
  322.     }
  323.  
  324.     // чтобы птичка летала (не падала)
  325.     public void jump() {
  326.         // вектор скорости
  327.         velosity.y = 250;
  328.         // воспроизводим звук крыльев
  329.         flap.play();
  330.     }
  331.  
  332.     // доступ к прямоугольнику из других классов
  333.     public Rectangle getBounds() {
  334.         return bounds;
  335.     }
  336.  
  337.     // уничтожение текстур
  338.     public void dispose() {
  339.          texture.dispose();
  340.          flap.dispose();
  341.     }
  342. }
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349. package com.mygdx.mygame.sprites;
  350.  
  351. import com.badlogic.gdx.graphics.g2d.TextureRegion;
  352.  
  353. import com.badlogic.gdx.utils.Array;
  354.  
  355. // учим птицу махать крыльями в полете
  356. public class Animation {
  357.     private Array<TextureRegion> frames; // массив текстур, где храняться кадры анимации
  358.     private float maxFrameTime; // длительность отображения одного кадра
  359.     private float currentFrameTime; // время отображения текущего кадра
  360.     private int frameCount; // количество кадров анимации
  361.     private int frame; // отдельный кадр анимации
  362.  
  363.     // регион текстур, количество кадров анимации и длительность цикла анимации
  364.     public Animation(TextureRegion region, int frameCount, float cycleTime) {
  365.         // инициализируем массив
  366.         frames = new Array<TextureRegion>();
  367.         // определяем ширину кадра = ширине региона текстур / количество кадров
  368.         int frameWidth = region.getRegionWidth() / frameCount;
  369.         // перебираем картинки на текстуре, поочереди используя их для кадров анимации
  370.         for (int i = 0; i < frameCount; i++) {
  371.             frames.add(new TextureRegion(region, i * frameWidth, 0, frameWidth, region.getRegionHeight()));
  372.         }
  373.         this.frameCount = frameCount;
  374.         maxFrameTime = cycleTime / frameCount;
  375.         frame = 0;
  376.     }
  377.     // если длительность одного кадра больше максимальной, увеличиваем номер кадра, пока количество кадров не достигнет установленного
  378.     public  void update(float dt) {
  379.         currentFrameTime += dt;
  380.         if (currentFrameTime > maxFrameTime) {
  381.              frame++;
  382.              currentFrameTime = 0;
  383.         }
  384.         if (frame >= frameCount) {
  385.             frame = 0;
  386.         }
  387.     }
  388.  
  389.     // получение текущего кадра анимации
  390.     public  TextureRegion getFrame() {
  391.         return  frames.get(frame);
  392.     }
  393.  
  394. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement