ゲームは星座が配置されている画面です。 この星座の各星には独自の色があります(注)。 たとえば、メモ「Do」は通常赤で、「Mi」は黄色で表されます。 結果は次のとおりです。
したがって、各レベルは新しい星座と新しいメロディーです。 星は最初の4つの音を演奏し、同じ順序で繰り返す必要があります。 次に、レベルが完了するまで、最初の4つのノートにさらに4つが追加されます。
libGDXフレームワークを使用して記述します。 私はこの問題の初心者として、何よりも彼が好きでした。 そして、私はそれに関するより多くの情報を見つけました。 それでは始めましょう。
必要なもの:
- 日食
- グラドル
- Android SDK
- libGDX最新バージョン
- 頭+手+忍耐
プロジェクトを手動で作成しません。 gdx-setupを使用する方が簡単です。 だから、それを実行します:
java -jar gdx-setup.jar
次に入力します:
- 名前: 「宇宙の歌」
- パッケージ: "en.yoursite.songs_of_the_space"
- ゲームクラス: 「MyGame」
- 宛先: パス/ to / your / workspace / songs_of_the_space
- Android SDK: パス/ to / your / sdk
- libGDXバージョン:Nightlies
- サブプロジェクト: デスクトップ、Android
- 拡張機能: Freetype
[ 生成]をクリックし、プロセスの終了後にEclipseに移動します。
Eclipseで、[ インポート]-> [Gradle]-> [Gradle Project]を選択します。 次に参照します..プロジェクトを探し、 ビルドします。 完了したら、すべてのプロジェクトを選択して、 Finishを作成します。 完了後、プロジェクトのリストにプロジェクトが表示されます。 すぐにメインプロジェクト( コア )-> MyGame.javaに移動します。 gdxが作成したすべてをクリアし、 ApplicationAdapterではなくGameからも継承します。 その結果、クラスは次の形式を取得する必要があります。
public class MyGame extends Game { @Override public void create() { } @Override public void render() { super.render(); } }
次。 新しいパッケージを作成し、 screensと呼びます 。 そして、3つのクラスがあります。
- MainMenuScreen-アプリケーションの初期画面を担当します
- LevelScreen-レベル選択画面を担当します
- PlayScreen-ゲーム画面を担当します
それらはすべて、 Screenインターフェースから継承する必要があります。 継承に必要なすべてのメソッドを追加し、MainMenuScreenを除くすべてを閉じます。 次のように記述します。
public class MainMenuScreen implements Screen { // final MyGame game; // private Stage stage; private TextButton play, exit; private Table table; private LabelStyle labelStyle; // ( ) public MainMenuScreen(final MyGame gam) { game = gam; // -- stage = new Stage(new ScreenViewport()); // . 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"); labelStyle = new LabelStyle(); labelStyle.font = game.font; table = new Table(); table.setFillParent(true); // . listener, . , , play = new TextButton("", textButtonStyle); play.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(); }; }); // . . , . exit = new TextButton("", textButtonStyle); exit.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) { Gdx.app.exit(); dispose(); }; }); table.add(play); table.row(); table.add(exit); stage.addActor(table); Gdx.input.setInputProcessor(stage); // (, , etc.) Gdx.input.setCatchBackKey(true); // , , } @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(); } @Override public void resize(int width, int height) {} @Override public void show() {} @Override public void hide() {} @Override public void pause() {} @Override public void resume() {} @Override public void dispose() { // game. stage.dispose(); game.dispose(); } }
次。 依存関係のインポートを行います(Shift + Ctrl + O)。 メインクラスMyGame.javaに移動します。 以下を追加します。
public class MyGame extends Game { // ( ) public BitmapFont font, levels; private static final String FONT_CHARACTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789][_!$%#@|\\/?-+=()*&.;,{}\"´`'<>"; @Override public void create() { // RussoOne Google Fonts. TTF. ( , ttf ) FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/russoone.ttf")); FreeTypeFontParameter param = new FreeTypeFontParameter(); param.size = Gdx.graphics.getHeight() / 18; // . . , , . param.characters = FONT_CHARACTERS; // font = generator.generateFont(param); // param.size = Gdx.graphics.getHeight() / 20; levels = generator.generateFont(param); font.setColor(Color.WHITE); // levels.setColor(Color.WHITE); generator.dispose(); // . @Override public void render() { super.render(); } }
- '`' <>「\\ / + =()*&;, {} \。"; public class MyGame extends Game { // ( ) public BitmapFont font, levels; private static final String FONT_CHARACTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789][_!$%#@|\\/?-+=()*&.;,{}\"´`'<>"; @Override public void create() { // RussoOne Google Fonts. TTF. ( , ttf ) FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/russoone.ttf")); FreeTypeFontParameter param = new FreeTypeFontParameter(); param.size = Gdx.graphics.getHeight() / 18; // . . , , . param.characters = FONT_CHARACTERS; // font = generator.generateFont(param); // param.size = Gdx.graphics.getHeight() / 20; levels = generator.generateFont(param); font.setColor(Color.WHITE); // levels.setColor(Color.WHITE); generator.dispose(); // . @Override public void render() { super.render(); } }
インポートを行い、 managers (たとえば)と呼ばれる新しいパッケージを作成します。 XMLparse.javaクラスがあります。 なぜこれが必要なのですか? 次に、XMLファイルから取得するレベルなどを確認します。 ところで、 assetフォルダーにxmlフォルダーを作成します( android project-> asset )。 その中のフォルダー:
- 画像
- フォント
- 音
- xml
フォントをfontsフォルダーに入れます。 そして、 xmlフォルダーで、 levelsフォルダーを作成します。 デスクトッププロジェクト(F5)を更新して、すべてが選択されるようにします。 それでは 、 XMLparse.javaクラスにデータを入力しましょう。 私たちはそれに以下を書きます:
public class XMLparse { 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 { dirHandle = Gdx.files.internal(System.getProperty("user.dir") + "/assets/xml/levels"); // desktop , - . assets desktop- assets android- } for (FileHandle entry : dirHandle.list()) { levels.add(entry.name().split(".xml")[0]); } // . . Java . :) 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; } }
まあ何? 最後に、LevelScreen.javaクラスにデータを入力しましょう。 ただし、その前に、 アセット-> xml- > levelsフォルダーに1.xml、2.xmlなどの名前でいくつかのxmlファイルを作成します。 そして、クラスでは次のように書きます:
public class LevelScreen implements Screen { final MyGame game; private Stage stage; private Table table; private LabelStyle labelStyle; private TextButton level; private Array<String> levels; public LevelScreen(MyGame gam) { game = gam; stage = new Stage(new ScreenViewport()); 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.levels; textButtonStyle.up = skin.getDrawable("level-up"); textButtonStyle.down = skin.getDrawable("level-down"); textButtonStyle.checked = skin.getDrawable("level-up"); // XMLparse parseLevels = new XMLparse(); levels = parseLevels.XMLparseLevels(); labelStyle = new LabelStyle(); labelStyle.font = game.levels; // MyGame table = new Table(); table.row().pad(20); // + table.center(); table.setFillParent(true); for (int i = 0; i < levels.size; i++) { final String cur_level = levels.get(i); level = new TextButton(cur_level, textButtonStyle); level.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, cur_level)); // PlayScreen dispose(); }; }); table.add(level); // , float indexLevel = Float.parseFloat(String.valueOf(i)) + 1; if (indexLevel % 5.0f == 0) table.row().padLeft(20).padRight(20).padBottom(20); } stage.addActor(table); // 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 MainMenuScreen(game)); } } }); } @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(); } @Override public void resize(int width, int height) {} @Override public void show() {} @Override public void hide() {} @Override public void pause() {} @Override public void resume() {} @Override public void dispose() { stage.dispose(); game.dispose(); } }
うわー、私はすでにたくさん書いた。 次の部分では(これが公開のすべての段階を通過する場合)、次のことを行います。
- PlayScreenクラスを埋める
- スターオブジェクト、メモなどを追加します。
レッスンファイル
ご清聴ありがとうございました!
更新
私は記事を急いでいたので、1つの重要なポイントを説明するのを忘れていました。そのため、プロジェクトは開始されません。 ごめんなさい したがって、 libGDX Stageの子孫となる独自のステージクラス( Stage )も作成する必要があります。 パッケージ マネージャーに移動して、 PlayStage.javaというクラスを作成します。 彼のコードは:
public class PlayStage extends Stage { public PlayStage(ScreenViewport screenViewport) { super(screenViewport); } // @Override public boolean keyDown(int keyCode) { if (keyCode == Keys.BACK) { if (getHardKeyListener() != null) getHardKeyListener().onHardKey(keyCode, 1); } return super.keyDown(keyCode); } @Override public boolean keyUp(int keyCode) { if (keyCode == Keys.BACK){ if (getHardKeyListener() != null) getHardKeyListener().onHardKey(keyCode, 0); } return super.keyUp(keyCode); } public interface OnHardKeyListener { // , , ( ) public abstract void onHardKey(int keyCode, int state); } private OnHardKeyListener _HardKeyListener = null; public void setHardKeyListener(OnHardKeyListener HardKeyListener) { _HardKeyListener = HardKeyListener; } public OnHardKeyListener getHardKeyListener() { return _HardKeyListener; } }
現在、LevelScreenでは、ステージではなくPlayStageクラスのオブジェクトを作成しているため、エラーは発生しません。 そしてもう一つ追加。 パラメーターを使用してコンストラクターを指定する必要があるため、 PlayScreenクラスを準備しましょう 。 コンパイラが誓うことがないように、それを書いて他のメソッドを生成します。 コード:
public class PlayScreen implements Screen { final MyGame game; // , . . public PlayScreen(final MyGame gam, String strLevel) { game = gam; } @Override public void render(float delta) { Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); } @Override public void resize(int width, int height) {} @Override public void show() {} @Override public void hide() {} @Override public void pause() {} @Override public void resume() {} @Override public void dispose() { game.dispose(); } }