[libGDX] Android向けの完全なゲームを作成しています。 パート1

こんにちは 私はgame-devの分野で自分自身を試してみると同時に、それがどのようであったかを教えて示すことにしました。 第二部はこちらです。



ゲームは星座が配置されている画面です。 この星座の各星には独自の色があります(注)。 たとえば、メモ「Do」は通常赤で、「Mi」は黄色で表されます。 結果は次のとおりです。



画像



したがって、各レベルは新しい星座と新しいメロディーです。 星は最初の4つの音を演奏し、同じ順序で繰り返す必要があります。 次に、レベルが完了するまで、最初の4つのノートにさらに4つが追加されます。



libGDXフレームワークを使用して記述します。 私はこの問題の初心者として、何よりも彼が好きでした。 そして、私はそれに関するより多くの情報を見つけました。 それでは始めましょう。



必要なもの:







プロジェクトを手動で作成しません。 gdx-setupを使用する方が簡単です。 だから、それを実行します:



java -jar gdx-setup.jar
      
      







次に入力します:







[ 生成]をクリックし、プロセスの終了後に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つのクラスがあります。





それらはすべて、 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 )。 その中のフォルダー:







フォントを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(); } }
      
      







うわー、私はすでにたくさん書いた。 次の部分では(これが公開のすべての段階を通過する場合)、次のことを行います。





レッスンファイル



ご清聴ありがとうございました!



更新



私は記事を急いでいたので、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(); } }
      
      






All Articles