前提・実現したいこと
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー