DJGL-キー入力

キーボードでの入力


キーボードでの入力を取得する方法を解説します。これと画像の描画を学べばかんたんなゲームは作成可能です。

ソースコード


まずは下記のソースコードを打ち込んでください。
DJGL-画像の描画できちんと画像描画ができていないと何も表示されません。
※2016年10月6日更新:今回からupdateメソッドを使う&処理の順番をわかりやすくするためdrawメソッドとupdateメソッドの場所を入れ替えました。(処理はupdate→drawの順番)


  1. //------------
  2. //変更点開始
  3. /////////////////
  4. import densan.s.game.input.KeyInput;
  5. import java.awt.event.KeyEvent;
  6. /////////////////
  7. //変更点終了
  8. //------------
  9.  
  10. import java.awt.Image;
  11.  
  12. import densan.s.game.image.ImageLoader;
  13. import java.awt.Color;
  14.  
  15. import densan.s.game.drawing.Drawer;
  16. import densan.s.game.manager.GameManager;
  17. import densan.s.game.manager.Updatable;
  18.  
  19.  
  20. public class TestGame implements Updatable {
  21.  
  22. private Image playerImage;
  23. //------------
  24. //変更点開始
  25. /////////////////
  26. private int x, y;
  27. /////////////////
  28. //変更点終了
  29. //------------
  30. //初期化
  31. public TestGame() {
  32. playerImage = ImageLoader.load("resources/player01.png");
  33. //------------
  34. //変更点開始
  35. /////////////////
  36. x = 100;
  37. y = 100;
  38. /////////////////
  39. //変更点終了
  40. //------------
  41. }
  42. //更新
  43. @Override
  44. public void update() {
  45. //------------
  46. //変更点開始
  47. /////////////////
  48.  
  49. //キー入力に応じて移動
  50. if (KeyInput.isPressing(KeyEvent.VK_RIGHT)) {//右アローキー
  51. x+=3;
  52. }
  53. if (KeyInput.isPress(KeyEvent.VK_LEFT)) {//左アローキー
  54. x-=3;
  55. }
  56. if (KeyInput.isPress(KeyEvent.VK_UP, KeyEvent.VK_B)) {//上アローキーとBキー
  57. y-=3;
  58. }
  59.  
  60. if (KeyInput.isPressing(KeyEvent.VK_DOWN, KeyEvent.VK_SPACE)) {//下アローキーとスペースキー
  61. y+=3;
  62. }
  63. /////////////////
  64. //変更点終了
  65. //------------
  66.  
  67. }
  68. //描画
  69. @Override
  70. public void draw(Drawer d) {
  71. //------------
  72. //変更点開始
  73. /////////////////
  74. //画像を描画
  75. d.drawImage(playerImage, x, y);
  76.  
  77.  
  78. /////////////////
  79. //変更点終了
  80. //------------
  81.  
  82. }
  83.  
  84. //初期化
  85. public static void main(String[] args) {
  86. //ゲームを管理するクラスを取得
  87. GameManager gm = GameManager.getInstance();
  88. //このメソッドでウインドウを表示する
  89. //引数はそれぞれ(幅, 高さ, タイトルバーに表示する文字)
  90. gm.createFrame(800, 600, "テストゲーム");
  91. //更新と描画を担うオブジェクトを設定
  92. gm.setUpdatable(new TestGame());
  93. }
  94.  
  95. }
  96.  
  97.  

このコード実行すると以下のようになります。見た目は画像描画のときと変わりありません。
(画像を自分で用意してる場合は表示される画像が違います)
この状態で矢印キー(アローキー)を押すと画像が上下左右に動きます。上と左は1回押すごとに動き、下と右は長押しでも動きます。この違いは使っているメソッドの違いです。スペースキーで下、Bキーで上にも動きます。

解説


変更点が全体に散らばっています。ひとつひとつ見ていきます。
  • 4~5行目のimport文
    • そのまま書けばいいですが、標準ライブラリのKeyEventクラスは複数あるのでパッケージ名に気をつけてください。

  • 26行目はx,yという変数を定義しています。
    • この変数は画像が描画される位置を示します。これを変化させることで、画像が描画される位置を変更し、画像が動いているように表示します。

  • 36〜37行目は変数の初期化です。とりあえずの値です。

  • 50~62行目のupdateメソッドでキーの入力に応じてx,yの値を変化させています。
    • キーボードの入力を取得するにはKeyInputクラスのstaticメソッドを使います
      • staticなのでnewする必要はありません。
    • キーの入力を取得するメソッドは2種類あります
      • 65,75行目のisPressingメソッドは「押されている間ずっと」trueを返します。
      • キャラの移動などの押しっぱなしでも可能にしたいことに使います
      • 68,71行目のisPressメソッドは「押された瞬間だけ」trueを返します。
      • 決定キーなどの1度だけ押されたのを検出したいときに使います。
    • キー入力を受け取るメソッドの引数にはKeyEvent(Java標準ライブラリ)の定数を使います。
      • 基本的に引数にはKeyEvent.VK_[キー]で指定します。
        • アルファベット・数字ならそのまま、名前ついてるキーならその名前を入れればいいです。
        • KeyEvent.VK_AならAキー、KeyEvent.VK_1なら1キー、KeyEvent.VK_SPACEならスペースキー
        • 矢印キーはUP、DOWN、RIGHT、LEFTとなっています。
      • KeyEventについて詳しくはhttps://docs.oracle.com/javase/jp/8/docs/api/java/awt/event/KeyEvent.html
        • フィールドの先頭がVKのやつみるだけで十分です。
      • 引数が2つ以上のものは、どれかのキーが押されていればtureになります。(OR)
        • 可変長引数なので、KeyEventの定数ならいくつでも引数に追加できます。
          • KeyInput.isPress(KeyEvent.VK_A, KeyEvent.VK_B, KeyEvent.VK_C, KeyEvent.VK_D)みたいに。
    • KeyInputについて詳しくはhttp://kiki33.bitbucket.org/densan/s/game/input/KeyInput.html

  • 75行目は引数の中身が定数からx,yに変わっています。updateでx,yを変更することで描画される位置を変更出来るようにしています。
    • ゲームを作るときは基本的にプレイヤーや敵が居る位置を変数に保存して、その位置に画像を描画することでゲーム画面を描画します。

まとめ


今回はキー入力について解説しました。これでユーザからの入力を受け付けられるようになったのでいろいろできます。

名前:
コメント:

すべてのコメントを見る
最終更新:2016年10月12日 19:48