Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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.mygdx.mygame.MyGdxGame;
- public class MenuState extends State {
- private Texture background;
- private Texture playBtn;
- private BitmapFont font;
- private int bestScore;
- public MenuState(GameStateManager gsm) {
- super(gsm);
- font = new BitmapFont();
- Preferences prefs = Gdx.app.getPreferences("My Preferences");
- bestScore = prefs.getInteger("BestScore");
- // инициализируем камеру (чтобы в эмуляторе были необхидимые размеры)
- camera.setToOrtho(false, MyGdxGame.WIDTH / 2, MyGdxGame.HEIGHT / 2);
- background = new Texture("bg.png");
- playBtn = new Texture("playbtn.png");
- }
- @Override
- // вызов игрового экрана по клику
- protected void handleInput() {
- // проверяем был ли клик
- if (Gdx.input.justTouched()) {
- // убираем из стека текущий экран
- gsm.set(new PlayState(gsm));
- }
- }
- // обновление метода handleInput (вызов метода jump по клику на экране)
- @Override
- public void update(float dt) {
- handleInput();
- }
- @Override
- public void render(SpriteBatch sb) {
- // устанавливаем матрицу проекции
- sb.setProjectionMatrix(camera.combined);
- // начало рисования
- sb.begin();
- // рисуем фон (текстура, координаты начала ее отрисовки)
- sb.draw(background, 0, 0);
- // рисует кнопку (разница половины ширины экрана)
- sb.draw(playBtn, camera.position.x - playBtn.getWidth() / 2, camera.position.y );
- font.draw(sb, "Best Score:" + bestScore, 100, 100);
- sb.end(); // конец рисования
- }
- // освобождаем ресурсы, уничтожение текстур
- @Override
- public void dispose() {
- background.dispose();
- playBtn.dispose();
- }
- }
- package com.mygdx.mygame.states;
- import com.badlogic.gdx.graphics.g2d.BitmapFont;
- import com.badlogic.gdx.graphics.g2d.SpriteBatch;
- import java.util.Stack;
- // управляет игровыми состояниями (2 состояния: игра и пауза)
- public class GameStateManager {
- // массив состояний. Подкласс класса вектор
- private Stack<State> states;
- public BitmapFont font;
- // конструктор создает пустой стэк
- public GameStateManager() {
- states = new Stack<State>();
- }
- // методы для управления
- public void push(State state) {
- states.push(state); // метод пуш помещает элемент в вершину стэка. Извлекает верхний элемент, удаляя из стэка
- }
- // освобождаем ресурсы
- public void pop() {
- states.pop().dispose();
- }
- // удаляет из стэка верхний экран, очищает его ресурсы (удаляет его объект) и помещает следующий экран в вершину стэка
- public void set(State state) {
- states.pop().dispose();
- states.push(state);
- }
- // обновляет игру (обновляет только то игровое состояние, которое находится на вершине стэка)
- public void update(float dt) { // через определенные короткие моменты времени
- states.peek().update(dt); // метод peek возвращает верхний элемент, удаляя его из стэка
- }
- public void render(SpriteBatch sb) {
- states.peek().render(sb); // метод peek принимает состояние из верхней части стэка (оставляет его там и отрисовывает)
- }
- }
- 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.mygdx.mygame.MyGdxGame;
- public class GameOver extends State {
- private Texture background;
- private Texture gameOver;
- private BitmapFont font;
- private int bestScore;
- public GameOver(GameStateManager gsm) {
- super(gsm);
- font = new BitmapFont();
- Preferences prefs = Gdx.app.getPreferences("My Preferences");
- bestScore = prefs.getInteger("BestScore");
- // инициализируем камеру (чтобы в эмуляторе были необхидимые размеры)
- camera.setToOrtho(false, MyGdxGame.WIDTH / 2, MyGdxGame.HEIGHT / 2);
- background = new Texture("bg.png");
- gameOver = new Texture("gameover.png");
- }
- @Override
- protected void handleInput() { // вызов игрового экрана по клику
- if (Gdx.input.justTouched()) { // проверяем был ли клик
- gsm.set(new PlayState(gsm)); // убираем из тека текущий экран
- }
- }
- @Override
- public void update(float dt) {
- handleInput();
- }
- @Override
- public void render(SpriteBatch sb) {
- // устанавливаем матрицу проекции
- sb.setProjectionMatrix(camera.combined);
- // начало рисования
- sb.begin();
- // рисуем фон (текстура, координаты начала ее отрисовки)
- sb.draw(background, 0, 0);
- // выводится текстура надписи GameOver
- sb.draw(gameOver, camera.position.x - gameOver.getWidth() / 2, camera.position.y );
- // выводится лучший счет
- font.draw(sb, "Best Score:" + bestScore, 100, 100);
- sb.end(); // конец рисования
- }
- // освобождаем ресурсы, уничтожение текстур
- @Override
- public void dispose() {
- background.dispose();
- gameOver.dispose();
- }
- }
- package com.mygdx.mygame.sprites;
- import com.badlogic.gdx.graphics.Texture;
- import com.badlogic.gdx.math.Rectangle;
- import com.badlogic.gdx.math.Vector2;
- import java.util.Random;
- // включает две текстуры трубы
- public class Tube {
- public static final int TUBE_WIDTH = 52; // ширина трубы
- public static final int FLUCTUATION = 130; // диапазон отклонений труб по высоте
- public static final int TUBE_GAP = 100; // значение высоты просвета
- public static final int LOWEST_OPENING = 120; // нижняя граница просвета
- private Texture topTube, bottomTube; // текстуры вехней и нижней трубы
- private Vector2 posTopTube, posBotTube; // тк трубы движущиеся
- private Random rand; // трубы на разной высоте
- private Rectangle boundsTop, boundsBot; // невидимые прямоугольники верхней и нижней трубы
- public Tube(float x) {
- topTube = new Texture("toptube.png");
- bottomTube = new Texture("bottomtube.png");
- rand = new Random();
- // создаем верхнюю трубу (рандомное значение колебания по высоте)
- posTopTube = new Vector2(x, rand.nextInt(FLUCTUATION) + TUBE_GAP + LOWEST_OPENING);
- // нижняя труба на фиксированной высоте
- posBotTube = new Vector2(x, posTopTube.y - TUBE_GAP - bottomTube.getHeight());
- boundsTop = new Rectangle(posTopTube.x, posTopTube.y, topTube.getWidth(), topTube.getHeight());
- boundsBot = new Rectangle(posBotTube.x, posBotTube.y, bottomTube.getWidth(), bottomTube.getHeight());
- }
- // движение труб
- public void reposition(float x) {
- posTopTube.set(x, rand.nextInt(FLUCTUATION) + TUBE_GAP + LOWEST_OPENING); // устанавливаем параметры
- posBotTube.set(x, posTopTube.y - TUBE_GAP - bottomTube.getHeight());
- // начальное расположение, совпадающее с расположением труб
- boundsTop.setPosition(posTopTube.x, posTopTube.y);
- boundsBot.setPosition(posBotTube.x, posBotTube.y);
- }
- // определяет столкновение птицы с трубами
- public boolean collades(Rectangle player) {
- return player.overlaps(boundsTop) || player.overlaps(boundsBot);
- }
- // доступ к переменным из других классов
- public Texture getTopTube() {
- return topTube;
- }
- public Texture getBottomTube() {
- return bottomTube;
- }
- public Vector2 getPosTopTube() {
- return posTopTube;
- }
- public Vector2 getPosBotTube() {
- return posBotTube;
- }
- // уничтожение текстур
- public void dispose() {
- topTube.dispose();
- bottomTube.dispose();
- }
- }
- package com.mygdx.mygame.sprites;
- import com.badlogic.gdx.Gdx;
- import com.badlogic.gdx.audio.Sound;
- import com.badlogic.gdx.graphics.Texture;
- import com.badlogic.gdx.graphics.g2d.TextureRegion;
- import com.badlogic.gdx.math.Rectangle;
- import com.badlogic.gdx.math.Vector3;
- // описывает птичку и ее поведение
- public class Bird {
- public static final int MOVEMENT = 100; // для птички
- public static final int GRAVITY = -15; // давление на птичку
- private Vector3 position; // позиция птички
- private Vector3 velosity; // скорость птички
- private Rectangle bounds; // прямоугольник птицы
- private Animation birdAnimation; // анимация птички
- private Sound flap; // звук крыльев
- private Texture texture;
- private Texture bird; // текстура птички
- // создает птичку и задает направление движения и текстуру
- public Bird(int x, int y) {
- position = new Vector3(x, y, 0);
- velosity = new Vector3(0,0,0);
- texture = new Texture("birdanimation.png");
- // (кадров анимации = 3, длительность = 0,5 секунды)
- birdAnimation = new Animation(new TextureRegion(texture), 3, 0.5F);
- bounds = new Rectangle(x, y, texture.getWidth() / 3, texture.getHeight() / 3);
- flap = Gdx.audio.newSound(Gdx.files.internal("sfx_wing.ogg"));
- }
- public Vector3 getPosition() {
- return position;
- }
- // возвращаем текущий кадр анимации
- public TextureRegion getBird() {
- return birdAnimation.getFrame();
- }
- public void update(float dt) {
- birdAnimation.update(dt);
- // чтобы птица не улетала за верхнюю границу экрана
- if (position.y > 0)
- // сила тяжести на птичку
- velosity.add(0, GRAVITY, 0); // add добавляет значение к вектору
- // время скорости умножаем на скаляр
- velosity.scl(dt);
- position.add(MOVEMENT * dt, velosity.y, 0); // add добавляет значение
- // чтобы птица не улетала за нижнюю границу экрана
- if (position.y < 0) {
- position.y = 0;
- }
- // падение птицы будет меняться при падении
- velosity.scl(1 / dt);
- // позиция прямоугольника птицы
- bounds.setPosition(position.x, position.y);
- }
- // чтобы птичка летала (не падала)
- public void jump() {
- // вектор скорости
- velosity.y = 250;
- // воспроизводим звук крыльев
- flap.play();
- }
- // доступ к прямоугольнику из других классов
- public Rectangle getBounds() {
- return bounds;
- }
- // уничтожение текстур
- public void dispose() {
- texture.dispose();
- flap.dispose();
- }
- }
- package com.mygdx.mygame.sprites;
- import com.badlogic.gdx.graphics.g2d.TextureRegion;
- import com.badlogic.gdx.utils.Array;
- // учим птицу махать крыльями в полете
- public class Animation {
- private Array<TextureRegion> frames; // массив текстур, где храняться кадры анимации
- private float maxFrameTime; // длительность отображения одного кадра
- private float currentFrameTime; // время отображения текущего кадра
- private int frameCount; // количество кадров анимации
- private int frame; // отдельный кадр анимации
- // регион текстур, количество кадров анимации и длительность цикла анимации
- public Animation(TextureRegion region, int frameCount, float cycleTime) {
- // инициализируем массив
- frames = new Array<TextureRegion>();
- // определяем ширину кадра = ширине региона текстур / количество кадров
- int frameWidth = region.getRegionWidth() / frameCount;
- // перебираем картинки на текстуре, поочереди используя их для кадров анимации
- for (int i = 0; i < frameCount; i++) {
- frames.add(new TextureRegion(region, i * frameWidth, 0, frameWidth, region.getRegionHeight()));
- }
- this.frameCount = frameCount;
- maxFrameTime = cycleTime / frameCount;
- frame = 0;
- }
- // если длительность одного кадра больше максимальной, увеличиваем номер кадра, пока количество кадров не достигнет установленного
- public void update(float dt) {
- currentFrameTime += dt;
- if (currentFrameTime > maxFrameTime) {
- frame++;
- currentFrameTime = 0;
- }
- if (frame >= frameCount) {
- frame = 0;
- }
- }
- // получение текущего кадра анимации
- public TextureRegion getFrame() {
- return frames.get(frame);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement