рдореИрдВ рдлрд┐рд░ рд╕реЗ рдЖрд░рдХреНрд╖рдг рдХрд░рд╛рдКрдВрдЧрд╛ред рдореИрдВ рдЬрд╛рд╡рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЬрд╛рдирдХрд╛рд░ рдирд╣реАрдВ рд╣реВрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрдИ рдХреЗ рд▓рд┐рдП рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдПрдХ рд╕рдкреНрддрд╛рд╣ рд╕реЗ рднреА рдХрдо рд╕рдордп рдореЗрдВ рдЦреЗрд▓ рд▓рд┐рдЦрд╛ рдФрд░ рдХреЛрдб рдХреА рд╕реБрдВрджрд░рддрд╛ рдФрд░ рд╢рд╛рд▓реАрдирддрд╛ рдХреЗ рдмрдЬрд╛рдп рдкрд░рд┐рдгрд╛рдо рдкрд░ рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдХреЛрдИ рдРрд╕рд╛ рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдХреЛрдб рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рддреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЕрдЪреНрдЫреЗ рд░реВрдк рдореЗрдВ рдиреЗрддреГрддреНрд╡ рдХрд░реЗрдВ рдФрд░ рдореБрдЭреЗ рдФрд░ рдмрд╛рдХреА рдХреЛ рдмреЗрд╣рддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдмрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред рдареАрдХ рд╣реИ, рдкрд░реНрдпрд╛рдкреНрдд рдЧреАрдд, рдЪрд▓реЛ рд╣рдорд╛рд░реЗ "рдХрдЯреНрдЯрд░" рдЬрд╛рд░реА рд░рдЦреЗрдВред
рдПрдХ рдирдпрд╛ рдкреИрдХреЗрдЬ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдирд╛рдо рджреЗрдВред рд╣рдо рдЗрд╕рдореЗрдВ рдПрдХ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВрдЧреЗ, рдФрд░ рдЗрд╕рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВрдЧреЗ:
BackgroundActor.java рдлрд╝рд╛рдЗрд▓
package ru.habrahabr.songs_of_the_space.objects; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.scenes.scene2d.Actor; public class BackgroundActor extends Actor { private Texture backgroundTexture; private Sprite backgroundSprite; public BackgroundActor() { backgroundTexture = new Texture("images/sky.jpg"); backgroundSprite = new Sprite(backgroundTexture); backgroundSprite.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); } @Override public void draw(Batch batch, float alpha) { backgroundSprite.draw(batch); } }
рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдПрдХ "рдЕрднрд┐рдиреЗрддрд╛" рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕реНрдХреНрд░реАрди рдХреЛ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдЦреЗрд▓ рдХреЛ рдПрдХ рддрд╛рд░реЛрдВ рд╡рд╛рд▓реЗ рдЖрдХрд╛рд╢ рдХреА рддрд░рд╣ рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
рдЦреЗрд▓ рд╣реЛрдо рд╕реНрдХреНрд░реАрди
рдЕрдм рдЗрд╕реЗ MyGame.java рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рдмрд╛рд╣рд░ рд╕реЗ рд╕реБрд▓рдн рдмрдирд╛рдПрдВ, рддрд╛рдХрд┐ рдЗрд╕реЗ рд╣рд░ рдЕрдЧрд▓реА рд╕реНрдХреНрд░реАрди рдкрд░ рди рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рдпрд╣ рд╣рдореЗрдВ рдЪрдВрдЪрд▓рддрд╛ рд╕реЗ рдмрдЪрд╛рдПрдЧрд╛ред
рдлрд╝рд╛рдЗрд▓ MyGame.java
// create() public BackgroundActor background; @Override public void create() { ... background = new BackgroundActor(); background.setPosition(0, 0); ... }
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдирдИ рд╕реНрдХреНрд░реАрди рдореЗрдВ рджреГрд╢реНрдп рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
stage.addActor(game.background);
рдЕрдм, рдСрдмреНрдЬреЗрдХреНрдЯ рдкреИрдХреЗрдЬ рдореЗрдВ рднреА, рдПрдХ рдиреЛрдЯ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВред рд╡рд╣ рд╣рдорд╛рд░реЗ рд╕рднреА рдиреЛрдЯреЛрдВ рдХреЛ рдЙрд╕ рдХреНрд░рдо рдореЗрдВ рд╕рдВрдЪрд┐рдд рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдлрд╛рдЗрд▓ рдиреЛрдЯ.рдЬрд╛рд╡рд╛
package ru.habrahabr.songs_of_the_space.objects; public class Note { private String note; private float delay; private Star star; // . xml . public void setNote(String note) { this.note = note; } public String getNote() { return this.note; } // , public void setDelay(String delay) { this.delay = Float.parseFloat(delay); } public float getDelay() { return this.delay; } // -- public void setStar(Star star) { this.star = star; } public Star getStar() { return this.star; } }
рдЕрдм рдЬрдм рд╣рдордиреЗ рдиреЛрдЯ рдмрдирд╛рдпрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХ рд╕реНрдЯрд╛рд░ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдЕрдВрддрд░рд┐рдХреНрд╖ рджреГрд╢реНрдп рдореЗрдВ рд╣рдорд╛рд░рд╛ рдореБрдЦреНрдп рдЕрднрд┐рдиреЗрддрд╛ рд╣реЛрдЧрд╛ред рд╡рд╣ рдЭрд┐рд▓рдорд┐рд▓рд╛рд╣рдЯ рдХрд░реЗрдЧрд╛ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрд╕рдХреА рдЕрджреНрднреБрдд рдзреБрди рдЧрд╛рдПрдЧрд╛ред
рдЬрд╛рд░реА рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдереЛрдбрд╝рд╛ рд╕рдордЭрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдиреЛрдЯреНрд╕ рдФрд░ рд╕рд┐рддрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред рдПрдХ рдореЗрд▓реЛрдбреА рдЕрдкрдиреЗ рдиреЛрдЯреНрд╕ рдХреЛ рджреЛрд╣рд░рд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯрд╛рд░ рдХреЛ рдПрдХ рд╣реА рдХреЙрдкреА рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдм рдореИрдВ рд╕рд┐рд░реНрдл рдЦреЗрд▓ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рддреЛ рдореИрдВрдиреЗ рд╣рд░ рдиреЛрдЯ рдХреЛ рд╕реНрдЯрд╛рд░ рдХреЗ рдЕрдВрджрд░ рд░рдЦрд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрд╛ рддреЛ рдорд╛рдзреБрд░реНрдп рдмрд╣реБрдд рд╕рд░рд▓ рдерд╛, рдпрд╛ рдЖрдХрд╛рд╢ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рддрд╛рд░реЗ рдереЗ рдФрд░ рдЖрда рдмрд╛рд░ рдХреЗ рдиреЛрдЯреЛрдВ рдХреЗ рд╕рд╛рде рднреА рд╕реНрддрд░ рдХреЛ рдкрд╛рд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдерд╛ред
рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╕реНрдЯрд╛рд░ рдмрдирд╛рдПрдВред
Star.java рдлрд╝рд╛рдЗрд▓
package ru.habrahabr.songs_of_the_space.objects; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.Texture.TextureFilter; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.Touchable; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; public class Star extends Actor { // , private Sound sound, wrong; // private String note; // private Sprite img; private Texture img_texture; // . , private Level level; public Star(String str_img, String str_sound) { img_texture = new Texture("images/stars/" + str_img + ".png"); img_texture.setFilter(TextureFilter.Linear, TextureFilter.Linear); img = new Sprite(img_texture); // , img.setSize(Gdx.graphics.getHeight() * 15 / 100, Gdx.graphics.getHeight() * 15 / 100); this.note = str_sound; this.sound = Gdx.audio.newSound(Gdx.files.internal("sounds/bells/" + str_sound + ".mp3")); this.wrong = Gdx.audio.newSound(Gdx.files.internal("sounds/bells/wrong.mp3")); // , addListener(new ClickListener() { @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { img.setScale(1.2f); if (note.equals(level.getCurrentNoteStr())) { level.setCurrentNote(); Gdx.input.vibrate(25); // , getSound().play(); } else { // , . . , . level.setCurrentNote(0); level.setEndNote(true); level.setPlayMusic(); getWrongSound().play(); Gdx.input.vibrate(80); } return true; } @Override public void touchUp(InputEvent event, float x, float y, int pointer, int button) { img.setScale(1.0f); // , , } }); setTouchable(Touchable.enabled); // } public void setLevel(Level level) { this.level = level; } // , @Override public void setBounds(float x, float y, float width, float height) { super.setBounds(x, y, this.img.getWidth(), this.img.getHeight()); this.img.setPosition(x, y); } // , . . @Override public void act(float delta) { img.rotate(0.05f); } // @Override public void draw(Batch batch, float alpha) { this.img.draw(batch); } public Sound getSound() { return this.sound; } public Sound getWrongSound() { return this.wrong; } public String getNote() { return this.note; } public Sprite getImg() { return this.img; } }
рдЕрдм рд╣рдорд╛рд░реЗ рд╕реНрддрд░ рдХреА рдХрдХреНрд╖рд╛ рдмрдирд╛рдПрдБред рд╡рд╣ рд╕рднреА рдЕрднрд┐рдиреЗрддреНрд░рд┐рдпреЛрдВ рдФрд░ рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛, рд╕рд╛рде рд╣реА рдПрдХ рдзреБрди рдмрдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдЕрдкрдиреА рдЬреАрдд рдкрд░ рдмрдзрд╛рдИ рджреЗрдЧрд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреИрдХреЗрдЬ рдореЗрдВ рдЬреЛрдбрд╝рд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд╡рд╣рд╛рдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Level.java рдлрд╝рд╛рдЗрд▓
package ru.habrahabr.songs_of_the_space.objects; import java.util.HashMap; import java.util.Map; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.scenes.scene2d.Touchable; import com.badlogic.gdx.utils.Array; public class Level { private XMLparse xml_parse; private Array<Note> notes = new Array<Note>(); private Array<Star> stars = new Array<Star>(); private Map<String, Array<String>> starsPos = new HashMap<String, Array<String>>(); private int currentNote; private int endNote; private float delay; private boolean playMusic; private boolean win; private final Sound winner = Gdx.audio.newSound(Gdx.files.internal("sounds/win.mp3")); // public Level(String level) { xml_parse = new XMLparse(); Array<Star> xml_stars = xml_parse.XMLparseStars(); // notes = xml_parse.XMLparseNotes(level); // starsPos = xml_parse.getPos(level); // endNote = 3; delay = 0; this.win = false; setPlayMusic(); for (Note n : this.notes) { for (Star s : xml_stars) { if (n.getNote().equals(s.getNote()) && !this.stars.contains(s, true)) { // xml , this.stars.add(s); } if (n.getNote().equals(s.getNote())) n.setStar(s); // } } for (Star s : this.stars) { s.setLevel(this); s.setBounds( // , ( ) Gdx.graphics.getWidth() * Float.parseFloat(starsPos.get(s.getNote()).get(0)) / 100, Gdx.graphics.getHeight() * Float.parseFloat(starsPos.get(s.getNote()).get(1)) / 100 - s.getImg().getHeight() / 2, s.getImg().getWidth(), s.getImg().getHeight() ); } } public boolean isWin() { return this.win; } // public void setEndNote() { if (this.endNote < this.notes.size - 1) { this.endNote += 4; } } // , , , . // , . ! ! public void setEndNote(boolean begin) { if (begin) { this.endNote = 3; } } public void setCurrentNote(int note) { this.currentNote = note; } // public void setCurrentNote() { if (this.currentNote < this.notes.size - 1) { this.currentNote++; if (currentNote - 1 == endNote) { currentNote = 0; setEndNote(); // 4 setPlayMusic(); // } } else { // , this.endNote = notes.size - 1; this.currentNote = 0; this.win = true; this.winner.play(); } } public int getCurrentNote() { return this.currentNote; } public String getCurrentNoteStr() { return this.notes.get(this.currentNote).getNote(); } public Array<Note> getNotes() { return this.notes; } public Array<Star> getStars() { return this.stars; } public void setPlayMusic() { if (playMusic) { playMusic = false; } else { playMusic = true; } } // public void playStars() { if (playMusic) { for (Star s : stars) { s.setTouchable(Touchable.disabled); // , } if (getCurrentNote() < notes.size) { if (getCurrentNote() <= endNote) { Note note = notes.get(getCurrentNote()); delay += note.getDelay(); // delay if (delay >= 0.9f) note.getStar().getImg().setScale(1.2f); // , if (delay >= 1.0f) { delay = 0; setCurrentNote(currentNote + 1); note.getStar().getSound().play(); note.getStar().getImg().setScale(1f); } } else { setPlayMusic(); setCurrentNote(0); } } else { delay = 0; setCurrentNote(0); setPlayMusic(); } } else { for (Star s : stars) { s.setTouchable(Touchable.enabled); // } } } }
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдореИрдВрдиреЗ рдпрдерд╛рд╕рдВрднрд╡ рдХреЛрдб рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рд╕рд╡рд╛рд▓реЛрдВ рдХрд╛ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддреА рд╣реИ рджреЗрд░реА рд╣реИ ред рдореИрдВ рдереЛрдбрд╝рд╛ рд╕рдордЭрд╛рдКрдВрдЧрд╛ред PlayScreen.java рд╡рд░реНрдЧ рдХреЗ рд░реЗрдВрдбрд░ () рдкрджреНрдзрддрд┐ рдореЗрдВ playStars () рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪреВрдВрдХрд┐ рдЗрд╕реЗ рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд░ рдмрд╛рд░ рдЬрдм рд╕рднреА рд╢рд░реНрддреЗрдВ рдкреВрд░реА рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рддреЛ рд╡рд┐рд▓рдВрдм рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд░рд╛рд╢рд┐ рд╕реЗ рдмрдврд╝ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдиреЛрдЯ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рджреЗрд░реА рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдХреЛрдб рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪрд▓реЛ рдЕрдВрдд рдореЗрдВ рд╣рдорд╛рд░реЗ PlayScreen.java рд╡рд░реНрдЧ рдХреЛ рдЖрдмрд╛рдж рдХрд░реЗрдВред рдЪреВрдВрдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд╣реИрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рдиреАрдЪреЗ рдЫрд┐рдкрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдлрд╝рд╛рдЗрд▓ PlayScreen.java
package ru.habrahabr.songs_of_the_space.managers; import ru.habrahabr.songs_of_the_space.MyGame; import ru.habrahabr.songs_of_the_space.objects.GamePreferences; import ru.habrahabr.songs_of_the_space.objects.Level; import ru.habrahabr.songs_of_the_space.objects.PlayStage; import ru.habrahabr.songs_of_the_space.objects.PlayStage.OnHardKeyListener; import ru.habrahabr.songs_of_the_space.objects.Star; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.Screen; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.Touchable; import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle; import com.badlogic.gdx.scenes.scene2d.ui.Skin; import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.scenes.scene2d.ui.TextButton; import com.badlogic.gdx.scenes.scene2d.ui.TextButton.TextButtonStyle; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.viewport.ScreenViewport; public class PlayScreen implements Screen { final MyGame game; private GamePreferences pref; private Level level; private String sL, nL; private Array<Star> stars; private PlayStage stage; private Table table, table2; public PlayScreen(final MyGame gam, String strLevel, String strNextLevel) { game = gam; this.sL = strLevel; this.nL = strNextLevel; stage = new PlayStage(new ScreenViewport()); stage.addActor(game.background); // pref = new GamePreferences(); level = new Level(strLevel); stars = level.getStars(); level.setCurrentNote(0); for (final Star s : stars) { stage.addActor(s); // () } LabelStyle labelStyle = new LabelStyle(); labelStyle.font = game.font; // Skin , Skin skin = new Skin(); TextureAtlas buttonAtlas = new TextureAtlas(Gdx.files.internal("images/game/images.pack")); skin.addRegions(buttonAtlas); TextButtonStyle textButtonStyle = new TextButtonStyle(); textButtonStyle.font = game.font; textButtonStyle.up = skin.getDrawable("button-up"); textButtonStyle.down = skin.getDrawable("button-down"); textButtonStyle.checked = skin.getDrawable("button-up"); // , table = new Table(); table.padTop(20); table.center().top(); table.setFillParent(true); // label Label label = new Label(game.langStr.get("Constellation"), labelStyle); table.add(label); table.row().padBottom(30); label = new Label(game.langStr.get("level_" + strLevel), labelStyle); table.add(label); table.setVisible(false); stage.addActor(table); table2 = new Table(); table2.center().bottom(); table2.setFillParent(true); table2.row().colspan(2).padBottom(30); label = new Label(game.langStr.get("YouWin"), labelStyle); table2.add(label).bottom(); table2.row().padBottom(20); TextButton button = new TextButton(game.langStr.get("Again"), textButtonStyle); // () // , , button.addListener(new ClickListener() { @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { Gdx.input.vibrate(20); return true; }; @Override public void touchUp(InputEvent event, float x, float y, int pointer, int button) { game.setScreen(new PlayScreen(game, sL, nL)); dispose(); }; }); table2.add(button); // button = new TextButton(game.langStr.get("Levels"), textButtonStyle); button.addListener(new ClickListener() { @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { Gdx.input.vibrate(20); return true; }; @Override public void touchUp(InputEvent event, float x, float y, int pointer, int button) { game.setScreen(new LevelScreen(game)); dispose(); }; }); table2.add(button); table2.setVisible(false); stage.addActor(table2); Gdx.input.setInputProcessor(stage); Gdx.input.setCatchBackKey(true); stage.setHardKeyListener(new OnHardKeyListener() { @Override public void onHardKey(int keyCode, int state) { if (keyCode == Keys.BACK && state == 1){ game.setScreen(new LevelScreen(game)); } } }); } @Override public void render(float delta) { // Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // act() , ( , ) stage.act(delta); stage.draw(); level.playStars(); // , , label' if (level.isWin()) { table.setVisible(true); table2.setVisible(true); pref.setLevel(nL); // . . for (Star s : stars) { s.setTouchable(Touchable.disabled); // } } } @Override public void resize(int width, int height) {} @Override public void show() {} @Override public void hide() {} @Override public void pause() {} @Override public void resume() {} // MyGame @Override public void dispose() { stage.dispose(); game.dispose(); } }
рдХреЛрдб рдиреЗ рд╢рд╛рдпрдж рдХреБрдЫ рд╕рд╡рд╛рд▓ рдЙрдард╛рдП рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕рдореЗрдВ рдирдП GamePreferences.java рд╡рд░реНрдЧ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд░реНрдЧ рд╣рдореЗрдВ рд╕рднреА рдЧреЗрдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдПрдВрдбреНрд░реЙрдЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рддрдерд╛рдХрдерд┐рдд "рд╢реЗрдпрд░реНрдбрдкреНрд░реЗрдлреЗрд░реЗрдВрд╕" рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдБ ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдореЗрдВ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рд╕реНрддрд░реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред
рд╡реИрд╕реЗ рдХреНрдпрд╛? рдЕрдм рд╣рдо рдЗрд╕реЗ рдмрдирд╛рддреЗ рдФрд░ рднрд░рддреЗ рд╣реИрдВред
GamePreferences.java рдлрд╝рд╛рдЗрд▓
package ru.habrahabr.songs_of_the_space.objects; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Preferences; public class GamePreferences { private Preferences pref; private static final String PREFS_NAME = "SONGS_OF_THE_SPACE"; private static final String PREF_LEVEL = "LEVEL_"; public GamePreferences() { pref = Gdx.app.getPreferences(PREFS_NAME); } public boolean getLevel(String level) { pref.putBoolean(PREF_LEVEL + 1, true); pref.flush(); return pref.getBoolean(PREF_LEVEL + level, false); } public void setLevel(String level) { pref.putBoolean(PREF_LEVEL + level, true); pref.flush(); } }
рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдореИрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреА рдирдХрд▓ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдореИрдВрдиреЗ рдиреАрдЪреЗ рдПрдХ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ред рдЕрдм рд╣рдореЗрдВ рдЕрдкрдиреЗ XMLparse.java рдХреНрд▓рд╛рд╕ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдЕрднреА рддрдХ рдЕрдкрдиреЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╕рд┐рддрд╛рд░реЛрдВ рдФрд░ рдиреЛрдЯреНрд╕ рдХреЛ рдирд╣реАрдВ рд╕рд┐рдЦрд╛рдпрд╛ рд╣реИред рдЪрд▓реЛ рдХрд░рддреЗ рд╣реИрдВред
XMLparse.java рдлрд╝рд╛рдЗрд▓
package ru.habrahabr.songs_of_the_space.objects; import java.io.IOException; import java.util.HashMap; import java.util.Map; import com.badlogic.gdx.Application.ApplicationType; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.XmlReader; import com.badlogic.gdx.utils.XmlReader.Element; public class XMLparse { private Array<Star> stars = new Array<Star>(); private Array<Note> notes = new Array<Note>(); private Map<String, Array<String>> starsPos = new HashMap<String, Array<String>>(); // . ? ! public HashMap<String, String> XMLparseLangs(String lang) { HashMap<String, String> langs = new HashMap<String, String>(); try { Element root = new XmlReader().parse(Gdx.files.internal("xml/langs.xml")); Array<Element> xml_langs = root.getChildrenByName("lang"); for (Element el : xml_langs) { if (el.getAttribute("key").equals(lang)) { Array<Element> xml_strings = el.getChildrenByName("string"); for (Element e : xml_strings) { langs.put(e.getAttribute("key"), e.getText()); } } else if (el.getAttribute("key").equals("en")) { Array<Element> xml_strings = el.getChildrenByName("string"); for (Element e : xml_strings) { langs.put(e.getAttribute("key"), e.getText()); } } } } catch (IOException e) { e.printStackTrace(); } return langs; } // public Array<Star> XMLparseStars() { try { Element root = new XmlReader().parse(Gdx.files.internal("xml/stars.xml")); Array<Element> xml_stars = root.getChildrenByName("star"); for (Element el : xml_stars) { Star star = new Star( el.getAttribute("files"), el.getAttribute("files") ); stars.add(star); } } catch (IOException e) { e.printStackTrace(); } return this.stars; } // public Array<String> XMLparseLevels() { Array<String> levels = new Array<String>(); Array<Integer> int_levels = new Array<Integer>(); FileHandle dirHandle; if (Gdx.app.getType() == ApplicationType.Android) { dirHandle = Gdx.files.internal("xml/levels"); } else { // , libGDX - Desktop dirHandle = Gdx.files.internal(System.getProperty("user.dir") + "/assets/xml/levels"); } for (FileHandle entry : dirHandle.list()) { levels.add(entry.name().split(".xml")[0]); } for (int i = 0; i < levels.size; i++) { int_levels.add(Integer.parseInt(levels.get(i))); } int_levels.sort(); levels.clear(); for (int i = 0; i < int_levels.size; i++) { levels.add(String.valueOf(int_levels.get(i))); } return levels; } // public Array<Note> XMLparseNotes(String strLevel) { try { Element root = new XmlReader().parse(Gdx.files.internal("xml/levels/" + strLevel + ".xml")).getChildByName("notes"); Array<Element> xml_notes = root.getChildrenByName("note"); for (Element el : xml_notes) { Note note = new Note(); note.setNote(el.getText()); note.setDelay(el.getAttribute("delay")); this.notes.add(note); } } catch (IOException e) { e.printStackTrace(); } return this.notes; } // . , , , public Map<String, Array<String>> getPos(String strLevel) { try { Element root = new XmlReader().parse(Gdx.files.internal("xml/levels/" + strLevel + ".xml")).getChildByName("positions"); Array<Element> xml_pos = root.getChildrenByName("position"); for (Element el : xml_pos) { Array<String> xy = new Array<String>(); xy.add(el.getAttribute("x")); xy.add(el.getAttribute("y")); this.starsPos.put(el.getAttribute("note"), xy); } } catch (IOException e) { e.printStackTrace(); } return this.starsPos; } }
рдмрд╣реБрдд рдХрдо рдмрдЪрд╛ рд╣реИред рд╕рдЪ рддреЛ рдпрд╣ рд╣реИред рдЕрдм, рдЬрдм рд╕реЗ рдореИрдВрдиреЗ рдмрд╣реБрднрд╛рд╖реА рд╕рдорд░реНрдерди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рд╣реИ, рддреЛ рдЖрдЗрдП рдмрдирд╛рддреЗ рд╣реИрдВред рдореИрдВ рдереЛрдбрд╝рд╛ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдпрд╣ рдкреНрд░рддреАрдХ рдЖрд░рдпреВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЕрдВрдЧреНрд░реЗрдЬреА рдХреЗ рд▓рд┐рдП рдПрди рдХреЗ рд╕рд╛рде , рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдореИрдВрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рджреЛ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧреА (рдФрд░ рдЗрд╕рд▓рд┐рдП XMLparseLangs рд╡рд┐рдзрд┐ рдХреЛрдб рдореЗрдВ рдереЛрдбрд╝реА рдЕрдЬреАрдм рд╕реНрдерд┐рддрд┐ рд╣реИ):
Langs.xml рдлрд╝рд╛рдЗрд▓
<?xml version="1.0"?> <langs> <lang key="en"> <string key="Play">Play</string> <string key="Exit">Exit</string> <string key="Again">Again</string> <string key="Levels">Levels</string> <string key="YouWin">You win!</string> <string key="Constellation">Constellation</string> <!-- Levels --> <string key="level_1">Canes Venatici</string> <string key="level_2">Triangulum</string> <string key="level_3">Equuleus</string> <string key="level_4">Apus</string> <string key="level_5">Sagitta</string> <string key="level_6">Musca</string> <string key="level_7">Ursa Minor</string> <string key="level_8">Orion</string> <string key="level_9">Ursa Major</string> <string key="level_10">Eridanus</string> <string key="level_11">Lacerta</string> </lang> <lang key="ru"> <string key="Play"></string> <string key="Exit"></string> <string key="Again"></string> <string key="Levels"></string> <string key="YouWin"> !</string> <string key="Constellation"></string> <!-- Levels --> <string key="level_1"> </string> <string key="level_2"></string> <string key="level_3"> </string> <string key="level_4"> </string> <string key="level_5"></string> <string key="level_6"></string> <string key="level_7"> </string> <string key="level_8"></string> <string key="level_9"> </string> <string key="level_10"></string> <string key="level_11"></string> </lang> </langs>
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рд╡рд┐рд╢реЗрд╖рддрд╛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рдкрд░ рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреНрдпрд╛ рджреЗрдирд╛ рд╣реИред рдЕрдм рд╣рдореЗрдВ рдХреБрдЫ рдФрд░ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╕рд┐рддрд╛рд░реЛрдВ, рдиреЛрдЯреНрд╕, рд╕реНрддрд░реЛрдВ рдХреА XML рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдВред рдЪрд▓реЛ рдХрд░рддреЗ рд╣реИрдВред
Stars.xml рдлрд╝рд╛рдЗрд▓
<?xml version="1.0"?> <stars> <star files="c5" /> <star files="c#5" /> <star files="d5" /> <star files="d#5" /> <star files="e5" /> <star files="f5" /> <star files="f#5" /> <star files="g5" /> <star files="g#5" /> <star files="a5" /> <star files="a#5" /> <star files="b5" /> <star files="c6" /> <star files="c#6" /> <star files="d6" /> <star files="d#6" /> <star files="e6" /> <star files="f6" /> <star files="f#6" /> <star files="g6" /> <star files="g#6" /> <star files="a6" /> <star files="a#6" /> <star files="b6" /> </stars>
рдпрджрд┐ рдЖрдк рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рдереЛрдбрд╝рд╛ рдЪрд╛рд▓рд╛рдХ рдерд╛ рдЬрдм рдЙрд╕рдиреЗ рдХрд╣рд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯрд╛рд░ рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рдХреБрдВрдЬрд┐рдпреЛрдВ рдореЗрдВ рд╕рд┐рддрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ред рдХреНрдпреЛрдВ? рдзреНрд╡рдирд┐ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪреВрдВрдХрд┐ рдЖрдк рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рджрд┐рд▓рдЪрд╕реНрдк рддрд╛рд░рд╛рдордВрдбрд▓ рд▓реЗрддреЗ рд╣реИрдВ, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдореЗрдВ рдХрдо рд╕реЗ рдХрдо 8-9 рд╕рд┐рддрд╛рд░реЗ рд╣реИрдВ, рдФрд░ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 8-9 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдиреЛрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╛рдЧ рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдПрдХ рдФрд░ рд╕рдкреНрддрдХ рдЬреЛрдбрд╝рдХрд░ рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдПрдВред
рдЕрдм рдореИрдВ рд╕реНрддрд░ рдХреА рдПрдХ рдлрд╝рд╛рдЗрд▓ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рджреВрдВрдЧрд╛ред
1.xml рдлрд╝рд╛рдЗрд▓
<?xml version="1.0"?> <level> <notes> <note delay="0.02f">d5</note> <note delay="0.05f">a6</note> <note delay="0.05f">d6</note> <note delay="0.05f">f#6</note> <note delay="0.02f">e5</note> <note delay="0.05f">a6</note> <note delay="0.05f">c#6</note> <note delay="0.05f">e6</note> <note delay="0.02f">d6</note> <note delay="0.05f">f#6</note> <note delay="0.05f">a6</note> <note delay="0.05f">d5</note> </notes> <positions> <position note="d5" x="5" y="35" /> <position note="a6" x="20" y="43" /> <position note="d6" x="40" y="50" /> <position note="f#6" x="55" y="45" /> <position note="e5" x="67" y="37" /> <position note="c#6" x="77" y="47" /> <position note="e6" x="90" y="50" /> </positions> </level>
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рд╣рдо рдиреЛрдЯреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдФрд░ рдЙрдирдХреА рджреЗрд░реА рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╣рдо рдкреНрд░рддрд┐рд╢рдд рд╢рдмреНрджреЛрдВ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЕрджреНрд╡рд┐рддреАрдп рдиреЛрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╡рд╣ рд╕рдм рдорд╛рд▓реВрдо рд╣реЛрддрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдХреБрдЫ рднреВрд▓ рдЧрдпрд╛, рддреЛ рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЖрд▓реЛрдЪрдирд╛ рдФрд░ рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдП рддрддреНрдкрд░ рд╣реВрдВред рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдореИрдВ AdMob рдХреЛ рд╣рдорд╛рд░реЗ рдЧреЗрдо рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЧреЗрдо рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдФрд░ рдХрд╣рд╛рдВ рдзреНрд╡рдирд┐рдпрд╛рдВ рдорд┐рд▓реАрдВ, рдФрд░ рдпрд╣ рднреА рдмрд╛рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ Google Play рдкрд░ рдЧреЗрдо рдХреЛ рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╛рдЗрд▓реЗрдВ рдФрд░ рдПрдХ рддреИрдпрд╛рд░ рдЦреЗрд▓ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгред
рдЕрджреНрдпрддрдиред рдореИрдВрдиреЗ рдПрдХ рдирдИ рдкреЛрд╕реНрдЯ рдирд╣реАрдВ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреВрд░реА рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВ рдереА, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣рд╛рдВ рдХреБрдЫ рд╕реБрдзрд╛рд░ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред
рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдФрд░ рд╕реБрдзрд╛рд░
рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, zig1375 habrayuzer рдиреЗ рд▓рд┐рдЦрд╛ рдХрд┐ AssetManager рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЙрдЪрд┐рдд рдЯрд┐рдкреНрдкрдгреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╕реНрддрд░ рдЪреБрдирдиреЗ рдХреЗ рдмрд╛рдж, рдЦреЗрд▓ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд▓рдЯрдХрд╛ рд╣реБрдЖ рдерд╛ рдпрд╛ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рдерд╛ред рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣рд▓ рдХрд┐рдпрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, MyGame.java рд╡рд░реНрдЧ рдореЗрдВ , AssetManager рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрд░реЗрдВред рдлрд┐рд░, рдПрдХ рдирдИ рд╕реНрдХреНрд░реАрди рдмрдирд╛рдПрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓реЛрдбрд░рд╕реНрдХреНрд░реАрди рдирд╛рдо рджрд┐рдпрд╛ред рдЬрд╛рд╡рд╛ рдФрд░ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦреЗрдВ:
рдЕрдм, MyGame.java рд╡рд░реНрдЧ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ MainMenuScreen.java рд╕реНрдХреНрд░реАрди рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рд╕реНрдХреНрд░реАрди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдЬрд╣рд╛рдБ рднреА рд╣рдо рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
рдЕрдм рдЬрдм рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ, рдЦреЗрд▓ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╕реНрдХреНрд░реАрди рджреЗрдЦреЗрдВрдЧреЗ:
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреАрдореЗрд╢рди рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХреЗ рдХрд┐ рдЧреЗрдо рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдлреНрд░реАрдЬрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред
рдЕрдЧрд▓рд╛ред рдЕрдм 1nt3g3r habrayuzer рд╕реЗ рдПрдХ рдЯрд┐рдкреНрдкрдгреАред рдЙрдиреНрд╣реЛрдВрдиреЗ рд▓рд┐рдЦрд╛ рдХрд┐ рд╕рднреА рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдПрдХ рдлрд╛рдЗрд▓ рдореЗрдВ рдкреИрдХ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдореИрдВрдиреЗ рдмрдЯрди рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рддрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рд╡реНрдпрд░реНрдеред рдЖрдк libGDX рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкреИрдХреЗрдЬрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдХреЗрд╡рд▓ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рдХреБрдЫ рдлрд╛рдпрджреЗ рдмрддрд╛рдКрдВрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рднреА рддрд╛рд░реЛрдВ рдХреЛ рдкреИрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдХрд╛рд░ рдореЗрдВ 300 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдХреА рдХрдореА рдЖрдИ, рдЬреЛ рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рджреВрд╕рд░реЗ, рдореИрдВрдиреЗ рдПрдХ рдПрдЯрд▓рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдФрд░ рдЗрд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛, рдЬреЛ рдХрд┐ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкреНрд░рджрд░реНрд╢рди рдкрд░, рдмреЗрд╣рддрд░ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдкреНрд░рднрд╛рд╡ рдерд╛ред ? . libGDX - :
, region :
, sperson , libGDX json :
, 1nt3g3r , xml, json. , , xml . json .
, AdMob. , , ┬л┬╗ . . , 16 !
, Google Play. . , , , - , , . , , , Google Play. - , . , . , . .
, . FL Studio . , . Sytrus , , . , Audacity , - , , .
FreeSound . , , , .
, . ? . - , . , .
рдлрд╝рд╛рдЗрд▓ рд▓реЛрдбрд░рд╕реНрдХреНрд░реАрдиред Java
package ru.habrahabr.songs_of_the_space.managers; import ru.habrahabr.songs_of_the_space.MyGame; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Screen; import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle; import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.utils.viewport.ScreenViewport; public class LoaderScreen implements Screen { private MyGame game; private Stage stage; private Table table; private LabelStyle labelStyle; private Label label; public LoaderScreen(MyGame gam) { game = gam; // game.manager.load("some/sounds", Sound.class); game.manager.load("some/textureatlas.pack", TextureAtlas.class); stage = new Stage(new ScreenViewport()); stage.addActor(game.background); game.getHandler().showAds(false); labelStyle = new LabelStyle(); labelStyle.font = game.levels; table = new Table(); table.setFillParent(true); label = new Label(game.langStr.get("Loading"), labelStyle); table.add(label); stage.addActor(table); } @Override public void render(float delta) { Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); stage.act(delta); stage.draw(); if (game.manager.update()) { game.setScreen(new MainMenuScreen(game)); dispose(); } }
рдЕрдм, MyGame.java рд╡рд░реНрдЧ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ MainMenuScreen.java рд╕реНрдХреНрд░реАрди рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рд╕реНрдХреНрд░реАрди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдЬрд╣рд╛рдБ рднреА рд╣рдо рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
game.manager.get("some/file.png", TextureAtlas.class); // TextureAtlas .
рдЕрдм рдЬрдм рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ, рдЦреЗрд▓ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╕реНрдХреНрд░реАрди рджреЗрдЦреЗрдВрдЧреЗ:
рдмреВрдЯ рд╕реНрдХреНрд░реАрди
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреАрдореЗрд╢рди рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХреЗ рдХрд┐ рдЧреЗрдо рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдлреНрд░реАрдЬрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред
рдЕрдЧрд▓рд╛ред рдЕрдм 1nt3g3r habrayuzer рд╕реЗ рдПрдХ рдЯрд┐рдкреНрдкрдгреАред рдЙрдиреНрд╣реЛрдВрдиреЗ рд▓рд┐рдЦрд╛ рдХрд┐ рд╕рднреА рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдПрдХ рдлрд╛рдЗрд▓ рдореЗрдВ рдкреИрдХ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдореИрдВрдиреЗ рдмрдЯрди рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рддрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рд╡реНрдпрд░реНрдеред рдЖрдк libGDX рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкреИрдХреЗрдЬрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдХреЗрд╡рд▓ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рдХреБрдЫ рдлрд╛рдпрджреЗ рдмрддрд╛рдКрдВрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рднреА рддрд╛рд░реЛрдВ рдХреЛ рдкреИрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдХрд╛рд░ рдореЗрдВ 300 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдХреА рдХрдореА рдЖрдИ, рдЬреЛ рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рджреВрд╕рд░реЗ, рдореИрдВрдиреЗ рдПрдХ рдПрдЯрд▓рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдФрд░ рдЗрд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛, рдЬреЛ рдХрд┐ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкреНрд░рджрд░реНрд╢рди рдкрд░, рдмреЗрд╣рддрд░ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдкреНрд░рднрд╛рд╡ рдерд╛ред ? . libGDX - :
java -cp gdx.jar:extensions/gdx-tools/gdx-tools.jar com.badlogic.gdx.tools.texturepacker.TexturePacker inputDir [outputDir] [packFileName]
, region :
starsAtlas = manager.get("images/stars/stars.pack", TextureAtlas.class); // starsAtlas.findRegion("star1"),
, sperson , libGDX json :
Skin.get(String, Class<?>);
, 1nt3g3r , xml, json. , , xml . json .
, AdMob. , , ┬л┬╗ . . , 16 !
, Google Play. . , , , - , , . , , , Google Play. - , . , . , . .
, . FL Studio . , . Sytrus , ,
FreeSound . , , , .
, . ? . - , . , .