DJGL-マウス入力

マウス入力


マウス入力について解説します。マウスでの入力は直感的なのでわかりやすいですが、作る側としては座標管理(どの位置でクリックされたかとか)をするのがちょっと面倒です。

ソースコード


いつも通り以下のコードを書き写してください。xとyを間違えないように。
  1. //------------
  2. //変更点開始
  3. /////////////////
  4. import densan.s.game.input.MouseInput;
  5. /////////////////
  6. //変更点終了
  7. //------------
  8.  
  9. import densan.s.game.input.KeyInput;
  10.  
  11. import java.awt.event.KeyEvent;
  12. import java.awt.Image;
  13.  
  14. import densan.s.game.image.ImageLoader;
  15.  
  16. import java.awt.Color;
  17.  
  18. import densan.s.game.drawing.Drawer;
  19. import densan.s.game.manager.GameManager;
  20. import densan.s.game.manager.Updatable;
  21.  
  22.  
  23. public class TestGame implements Updatable {
  24.  
  25. //------------
  26. //変更点開始
  27. /////////////////
  28. //マウスの各座標
  29. private int mx, my,cx,cy,rx, ry;
  30. //クリックされているか
  31. private boolean isClick;
  32.  
  33. /////////////////
  34. //変更点終了
  35. //------------
  36. //初期化
  37. public TestGame() {
  38. //------------
  39. //変更点開始
  40. /////////////////
  41. //初期化
  42. mx = 0;
  43. my = 0;
  44. cx = 0;
  45. cy = 0;
  46. rx = 0;
  47. ry = 0;
  48. isClick = false;
  49.  
  50. /////////////////
  51. //変更点終了
  52. //------------
  53. }
  54. //更新
  55. @Override
  56. public void update() {
  57. //------------
  58. //変更点開始
  59. /////////////////
  60. //マウスの座標
  61. mx = MouseInput.getMouseX();
  62. my = MouseInput.getMouseY();
  63. //クリックされた座標
  64. cx = MouseInput.getClickX();
  65. cy = MouseInput.getClickY();
  66. //クリックが離された座標
  67. rx = MouseInput.getReleaseX();
  68. ry = MouseInput.getReleaseY();
  69. //クリックされているか
  70. isClick = MouseInput.isLeftClicking();
  71. //
  72. /////////////////
  73. //変更点終了
  74. //------------
  75.  
  76. }
  77. //描画
  78. @Override
  79. public void draw(Drawer d) {
  80. //------------
  81. //変更点開始
  82. /////////////////
  83. d.setFontSize(30);
  84. //クリックされてるか色変える
  85. if (isClick) {
  86. d.setColor(Color.RED);
  87. }else {
  88. d.setColor(Color.BLACK);
  89. }
  90. d.drawStringCenter("クリックしてね", 400, 300);
  91.  
  92. //マウスがある座標に大きい円
  93. d.setColor(Color.BLUE);
  94. d.fillCircle(mx, my, 50);
  95. //クリックされた座標に中くらいの円
  96. d.setColor(Color.GREEN);
  97. d.fillCircle(cx, cy, 40);
  98. //クリックが離された座標に小さい円
  99. d.setColor(Color.RED);
  100. d.fillCircle(rx, ry, 30);
  101. /////////////////
  102. //変更点終了
  103. //------------
  104.  
  105. }
  106.  
  107. //初期化
  108. public static void main(String[] args) {
  109. //ゲームを管理するクラスを取得
  110. GameManager gm = GameManager.getInstance();
  111. //このメソッドでウインドウを表示する
  112. //引数はそれぞれ(幅, 高さ, タイトルバーに表示する文字)
  113. gm.createFrame(800, 600, "テストゲーム");
  114. //更新と描画を担うオブジェクトを設定
  115. gm.setUpdatable(new TestGame());
  116. }
  117.  
  118. }
  119.  
  120.  
  121.  
  122.  

このコードを実行するとまずは以下のようになります。
まだクリックしていない状態では緑と赤の円は左上(0,0)にあります。どこかをクリックすると以下のようにすべての円が一箇所に集まります。
クリックしている間は以下のように文字が赤くなります。
クリックしたままドラッグして離すと、緑の円がドラッグの始点に、赤の円がドラッグの終点になります。
ドラッグした後クリックせずにマウスを動かすと3つの円がばらばらになります。
いろいろ触ってどのメソッドがどの座標を取得しているかを覚えましょう。

解説


ソースコードの解説です。ちょっと要素が多いです。

  • 4行目はインポート文。DJGLのマウス入力扱うクラスをインポートしてる。

  • 29,31行目はフィールドの宣言。コメントそのまま。

  • 42~48行目はフィールドの初期化。

  • 61〜70行目ではMouseInputクラスから取得したマウスの情報をフィールドに格納してます。
    • 61,62:マウスのx,y座標
    • 64,65:マウスの最後にクリックされたx,y座標
    • 67,68:マウスの最後にクリックが離されたx,y座標
    • 70:左クリックされているか
      • ウインドウの外のカーソルは感知しません。
      • 一度もクリックされていない場合、getClickXなどは0を返します。
    • MouseInputはKeyInputと同じくメソッドがstaticなのでnewする必要がありません。
    • メソッドは大体書いてある通りです。get~~Xではなくget~~PointとするとPointクラスにXとYが纏められて返されます。
    • ざっくりとMouseInputのメソッドを紹介します。MouseInputのメソッドに引数は必要ありません。
      • getClick~:最後にクリックされた座標
      • getMouse~:カーソルの現在の座標
      • getRelease~:最後にクリックが離された座標
      • isClicking:左右どちらかでもクリックされていればtrueを返す。
      • isLeftClicking:左クリックされているならtrueを返す
      • isRightClicking:右クリックされているならtrueを返す
      • isInFrame:カーソルがウインドウ内にあればtrueを返す
      • getWheelRotation:ホイールの回転数を実数(double)で返す
        • 起動してからの合計回転数になるので、使う祭は差分をとって使う
    • MouseInputについて詳しくはhttp://kiki33.bitbucket.org/densan/s/game/input/MouseInput.html

  • 83~100行目はフィールドの値に応じて円や文字を描画しています。
    • 85~89行目は左クリックされているかどうかで文字の色を変えています。

まとめ


今回はマウス入力について解説しました。文字だけではいまいちどういう値を取ってきているかわからないと思うので、きちんと実行して確認しておきましょう。
余談ですが、マウス入力で一番使うのはボタンを押す操作です。が、現在のDJGLにはボタンをかんたんに実装できる機能はありません。(ちょっとややこしいけど出来るには出来る)将来追加されるかも。

名前:
コメント:

すべてのコメントを見る