質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

0回答

230閲覧

キーボードでの操作がうまくいかない

hidekiti

総合スコア23

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/06/14 13:52

前提・実現したいこと

java でブロック崩しを制作しているのですが、
そのゲームにおける プレイヤーが操作しボールを打ち返す棒のクラスである Bar クラス
を キーボードの矢印キーをつかって動かしたい。

発生している問題・エラーメッセージ

そのゲームにおける プレイヤーが操作しボールを打ち返す棒のクラスである Bar クラス
にうまく キー入力のイベントが伝わらず、キーを入力しても反応しない。

エラーメッセージ

該当のソースコード

ゲームのコントローラーのクラス
キーイベントをここで受け取ってるつもり。

java

1import objectdraw.*; 2import java.awt.*; 3import java.util.*; 4import java.awt.event.KeyAdapter; 5import java.awt.event.KeyEvent; 6public class BlockBreaks extends WindowController { 7 private final int margin=5; 8 private boolean start=false; 9 private MoveBall ball; 10 public final int size=80; 11 private Bar bar; 12 MyKeyAdapter myKeyAdapter; 13 @Override public void begin(){ 14 ball=new MoveBall(0,0,canvas); 15 ball.hide(); 16 ball.setColor(Color.RED); 17 bar=new Bar(150,300,size,canvas,ball); 18 createBlocks(); 19 createRect(); 20 myKeyAdapter = new MyKeyAdapter(); 21 addKeyListener(myKeyAdapter); 22 } 23 24 @Override public void onMouseClick(Location p){ 25 if(!start){ 26 ball.moveTo(p); 27 ball.showAndStart(); 28 start=true; 29 } 30 } 31 32 public void createBlocks(){ 33 double Block_WIDTH=(canvas.getWidth()-2*margin)/12, 34 Block_HEIGHT=10, 35 WALL_X=margin, 36 WALL_HEIGHT=4, 37 WALL_WIDTH=12, 38 WALL_Y=4*margin+Block_HEIGHT*WALL_HEIGHT; 39 double BlockX = WALL_X; 40 double BlockY = WALL_Y; 41 42 int level = 0; // Number of levels drawn so far 43 int BlocksInLevel = 0; // Number of rects drawn in 44 // the current level 45 46 47 while ( level < WALL_HEIGHT) { 48 BlocksInLevel = 0; 49 BlockX = WALL_X; 50 // Draw one row of rects 51 while ( BlocksInLevel < WALL_WIDTH ) { 52 new Block( BlockX, BlockY, Block_WIDTH,Block_HEIGHT, canvas ,ball); 53 BlockX = BlockX + Block_WIDTH; 54 BlocksInLevel++; 55 56 } 57 BlockY = BlockY - Block_HEIGHT; 58 level++; 59 } 60 61 } 62 63 public void createRect(){ 64 new Line(margin,4*margin,margin,canvas.getHeight()-margin,canvas); 65 66 new Line(canvas.getWidth()-margin,canvas.getHeight()-margin,canvas.getWidth()-margin,4*margin,canvas); 67 new Line(canvas.getWidth()-margin,4*margin,margin,4*margin,canvas); 68 } 69 70} 71class Block extends ActiveObject{ 72 DrawingCanvas canvas; 73 FilledRect rect; 74 FramedRect Rect; 75 MoveBall ball; 76 final int pause_time=6; 77 private boolean removed=false; 78 79 public Block(double x,double y,double width,double height,DrawingCanvas Canvas,MoveBall b){ 80 canvas=Canvas; 81 ball=b; 82 rect=new FilledRect(x,y,width,height,canvas); 83 Rect=new FramedRect(x,y,width,height,canvas); 84 Rect.setColor(Color.YELLOW); 85 start(); 86 87 } 88 89 @Override public void run(){ 90 Location up_ri,up_lef,dow_ri,dow_lef; 91 92 while(!removed){ 93 up_ri=new Location(ball.getX(),ball.getY()); 94 up_lef=new Location(ball.getX()+ball.getSize(),ball.getY()); 95 dow_ri=new Location(ball.getX(),ball.getY()+ball.getSize()); 96 dow_lef=new Location(ball.getX()+ball.getSize(),ball.getY()+ball.getSize()); 97 if(rect.contains(up_ri)&&rect.contains(up_lef)||rect.contains(dow_ri)&&rect.contains(dow_lef)){ 98 ball.turnMoveY(); 99 removeFromCanvas(); 100 removed=true; 101 }else if(rect.contains(up_ri)&&rect.contains(dow_ri)||rect.contains(up_lef)&&rect.contains(dow_lef)){ 102 ball.turnMoveX(); 103 removeFromCanvas(); 104 removed=true; 105 }else if (rect.contains(up_ri)||rect.contains(up_lef)||rect.contains(dow_ri)||rect.contains(dow_lef)){ 106 ball.turnMoveY(); 107 ball.turnMoveX(); 108 removeFromCanvas(); 109 removed=true; 110 } 111 pause(pause_time); 112 } 113 114 115 } 116 117 //public boolean contains(Location p){ 118 //return rect.contains(p); 119 //} 120 121 public void removeFromCanvas(){ 122 rect.removeFromCanvas(); 123 124 Rect.removeFromCanvas(); 125 } 126 127} 128 129class MyKeyAdapter extends KeyAdapter{ 130 131 @Override public void keyPressed(KeyEvent e){ 132 int keycode=e.getKeyCode(); 133 switch(keycode){ 134 case KeyEvent.VK_RIGHT: 135 Bar.ri_key=true; 136 break; 137 case KeyEvent.VK_LEFT: 138 Bar.lef_key=true; 139 break; 140 } 141 } 142 143 @Override public void keyReleased(KeyEvent e){ 144 Bar.ri_key=false; 145 Bar.lef_key=false; 146 } 147}

Bar クラス

java

1import java.applet.Applet; 2import objectdraw.*; 3import java.awt.*; 4import java.awt.event.KeyListener; 5import java.awt.event.KeyEvent; 6public class Bar extends ActiveObject { 7 private DrawingCanvas canvas; 8 private FilledRect bar; 9 MoveBall ball; 10 public static boolean lef_key=false,ri_key=false,gamestart=false; 11 private final int pause_time=6,speed=5,bar_height=5; 12 13 public Bar(double x,double y,int length,DrawingCanvas Canvas,MoveBall Ball){ 14 canvas=Canvas; 15 ball=Ball; 16 gamestart=true; 17 bar=new FilledRect(x,y,length,bar_height,canvas); 18 start(); 19 } 20 21 public Bar(Location point,int length,DrawingCanvas Canvas,MoveBall Ball){ 22 this(point.getX(),point.getY(),length,Canvas,Ball); 23 } 24 @Override public void run(){ 25 Location up_ri,up_lef,dow_ri,dow_lef; 26 while(gamestart){ 27 if(lef_key){ 28 bar.move(-speed,0); 29 } else if(ri_key){ 30 bar.move(speed,0); 31 } 32 up_ri=new Location(ball.getX(),ball.getY()); 33 up_lef=new Location(ball.getX()+ball.getSize(),ball.getY()); 34 dow_ri=new Location(ball.getX(),ball.getY()+ball.getSize()); 35 dow_lef=new Location(ball.getX()+ball.getSize(),ball.getY()+ball.getSize()); 36 if(bar.contains(up_ri)&&bar.contains(up_lef)||bar.contains(dow_ri)&&bar.contains(dow_lef)){ 37 ball.turnMoveY(); 38 }else if(bar.contains(up_ri)&&bar.contains(dow_ri)||bar.contains(up_lef)&&bar.contains(dow_lef)){ 39 ball.turnMoveX(); 40 }else if (bar.contains(up_ri)||bar.contains(up_lef)||bar.contains(dow_ri)||bar.contains(dow_lef)){ 41 ball.turnMoveY(); 42 ball.turnMoveX(); 43 } 44 pause(pause_time); 45 } 46 } 47 public void move(double dx,double dy){ 48 bar.move(dx,dy); 49 } 50} 51

ボールのクラス MoveBall
今回の件には関係なさそう

java

1import objectdraw.*; 2import java.awt.*; 3 4public class MoveBall extends ActiveObject{ 5 private FilledOval ball; 6 public final int pauseTime=33, 7 margin=5; 8 private int size=5, 9 ball_speed=8; 10 DrawingCanvas canvas; 11 boolean move; 12 13 //Line line_1,line_2,line_3,line_4; 14 RandomIntGenerator generator1=new RandomIntGenerator(-5,5); 15 RandomIntGenerator generator2=new RandomIntGenerator(-3,-5); 16 private int move_x=generator1.nextValue(); 17 private int move_y=generator2.nextValue(); 18 public MoveBall(double x,double y,DrawingCanvas Canvas){ 19 canvas=Canvas; 20 ball=new FilledOval(x,y,size,size,Canvas); 21 22 } 23 public MoveBall(Location point,DrawingCanvas Canvas){ 24 this(point.getX(),point.getY(),Canvas); 25 } 26 public void showAndStart(){ 27 ball.show(); 28 start(); 29 } 30 public void moveTo(Location p){ 31 ball.moveTo(p); 32 } 33 public void hide(){ 34 ball.hide(); 35 } 36 @Override public void run(){ 37 move=true; 38 while(move){ 39 ball.move(move_x,move_y); 40 pause(pauseTime); 41 if(margin>ball.getX()||(canvas.getWidth()-2*margin)<ball.getX()){ 42 move_x=-move_x; 43 } else if(4*margin>ball.getY()){ 44 move_y=-move_y; 45 } 46 47 } 48 49 } 50 51 public boolean contains(Location p){ 52 return ball.contains(p); 53 } 54 public void setColor(Color color){ 55 ball.setColor(color); 56 } 57 public double getX(){ 58 return ball.getX(); 59 } 60 public double getY(){ 61 return ball.getY(); 62 } 63 public void turnMoveX(){ 64 move_x=-move_x; 65 } 66 public void turnMoveY(){ 67 move_y=-move_y; 68 } 69 public int getSize(){ 70 return size; 71 } 72} 73

試したこと

Bar クラスの while文の中の Bar に MoveBall があたっときはうまくはねかえせたのでそこは動いてることが確認できた

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問