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

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

ただいまの
回答率

88.23%

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

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 643

hidekiti

score 15

前提・実現したいこと

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

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

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

エラーメッセージ

該当のソースコード

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

import objectdraw.*;
import java.awt.*;
import java.util.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class BlockBreaks extends WindowController {
    private final int margin=5;
    private boolean start=false;
    private MoveBall ball;
    public final int size=80;
    private Bar bar;
    MyKeyAdapter myKeyAdapter;
    @Override public void begin(){
        ball=new MoveBall(0,0,canvas);
        ball.hide();
        ball.setColor(Color.RED);
        bar=new Bar(150,300,size,canvas,ball);
        createBlocks();
        createRect();
        myKeyAdapter = new MyKeyAdapter();
        addKeyListener(myKeyAdapter);
    }

    @Override public void onMouseClick(Location p){
        if(!start){
            ball.moveTo(p);
            ball.showAndStart();
            start=true;
        }
    }

    public void createBlocks(){
        double Block_WIDTH=(canvas.getWidth()-2*margin)/12,
        Block_HEIGHT=10,
        WALL_X=margin,
        WALL_HEIGHT=4,
        WALL_WIDTH=12,
        WALL_Y=4*margin+Block_HEIGHT*WALL_HEIGHT;
        double BlockX = WALL_X;
        double BlockY = WALL_Y;

        int level = 0;         // Number of levels drawn so far
        int BlocksInLevel = 0; // Number of rects drawn in
        // the current level


        while ( level < WALL_HEIGHT) {
            BlocksInLevel = 0;
            BlockX = WALL_X;
            // Draw one row of rects
            while ( BlocksInLevel < WALL_WIDTH ) {
                new Block( BlockX, BlockY, Block_WIDTH,Block_HEIGHT, canvas ,ball);
                BlockX = BlockX + Block_WIDTH;
                BlocksInLevel++;

            }
            BlockY = BlockY - Block_HEIGHT;
            level++;
        }

    }

    public void createRect(){
        new Line(margin,4*margin,margin,canvas.getHeight()-margin,canvas);

        new Line(canvas.getWidth()-margin,canvas.getHeight()-margin,canvas.getWidth()-margin,4*margin,canvas);
        new Line(canvas.getWidth()-margin,4*margin,margin,4*margin,canvas);
    }

}
class Block extends ActiveObject{
    DrawingCanvas canvas;
    FilledRect rect;
    FramedRect Rect;
    MoveBall ball;
    final int pause_time=6;
    private boolean removed=false;

    public Block(double x,double y,double width,double height,DrawingCanvas Canvas,MoveBall b){
        canvas=Canvas;
        ball=b;
        rect=new FilledRect(x,y,width,height,canvas);
        Rect=new FramedRect(x,y,width,height,canvas);
        Rect.setColor(Color.YELLOW);
        start();

    }

    @Override public void run(){
        Location up_ri,up_lef,dow_ri,dow_lef;

        while(!removed){
            up_ri=new Location(ball.getX(),ball.getY());
            up_lef=new Location(ball.getX()+ball.getSize(),ball.getY());
            dow_ri=new Location(ball.getX(),ball.getY()+ball.getSize());
            dow_lef=new Location(ball.getX()+ball.getSize(),ball.getY()+ball.getSize());
            if(rect.contains(up_ri)&&rect.contains(up_lef)||rect.contains(dow_ri)&&rect.contains(dow_lef)){
                ball.turnMoveY();
                removeFromCanvas();
                removed=true;
            }else if(rect.contains(up_ri)&&rect.contains(dow_ri)||rect.contains(up_lef)&&rect.contains(dow_lef)){
                ball.turnMoveX();
                removeFromCanvas();
                removed=true;
            }else if (rect.contains(up_ri)||rect.contains(up_lef)||rect.contains(dow_ri)||rect.contains(dow_lef)){
                ball.turnMoveY();
                ball.turnMoveX();
                removeFromCanvas();
                removed=true;
            }
            pause(pause_time);
        }  


    }

    //public boolean contains(Location p){
        //return rect.contains(p);
    //}

    public void removeFromCanvas(){
        rect.removeFromCanvas();

        Rect.removeFromCanvas();
    }    

}

class MyKeyAdapter extends KeyAdapter{

    @Override public void keyPressed(KeyEvent e){
        int keycode=e.getKeyCode();
        switch(keycode){
          case KeyEvent.VK_RIGHT:
               Bar.ri_key=true;
               break;
          case KeyEvent.VK_LEFT:
               Bar.lef_key=true;
               break;
        }
    }

    @Override public void keyReleased(KeyEvent e){
        Bar.ri_key=false;
        Bar.lef_key=false;
    }
}


Bar クラス

import java.applet.Applet;
import objectdraw.*;
import java.awt.*;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
public class Bar extends ActiveObject {
    private DrawingCanvas canvas;
    private FilledRect bar;
    MoveBall ball;
    public static boolean lef_key=false,ri_key=false,gamestart=false;
    private final int pause_time=6,speed=5,bar_height=5;

    public Bar(double x,double y,int length,DrawingCanvas Canvas,MoveBall Ball){
        canvas=Canvas; 
        ball=Ball;
        gamestart=true;
        bar=new FilledRect(x,y,length,bar_height,canvas);
        start();
    }

    public Bar(Location point,int length,DrawingCanvas Canvas,MoveBall Ball){
        this(point.getX(),point.getY(),length,Canvas,Ball);
    }
    @Override public void run(){
        Location up_ri,up_lef,dow_ri,dow_lef;
        while(gamestart){
            if(lef_key){
                bar.move(-speed,0);
            }  else if(ri_key){
                bar.move(speed,0);
            }  
            up_ri=new Location(ball.getX(),ball.getY());
            up_lef=new Location(ball.getX()+ball.getSize(),ball.getY());
            dow_ri=new Location(ball.getX(),ball.getY()+ball.getSize());
            dow_lef=new Location(ball.getX()+ball.getSize(),ball.getY()+ball.getSize());
            if(bar.contains(up_ri)&&bar.contains(up_lef)||bar.contains(dow_ri)&&bar.contains(dow_lef)){
                ball.turnMoveY();
            }else if(bar.contains(up_ri)&&bar.contains(dow_ri)||bar.contains(up_lef)&&bar.contains(dow_lef)){
                ball.turnMoveX();
            }else if (bar.contains(up_ri)||bar.contains(up_lef)||bar.contains(dow_ri)||bar.contains(dow_lef)){
                ball.turnMoveY();
                ball.turnMoveX();
            }
            pause(pause_time);
        }
    }
    public void move(double dx,double dy){
        bar.move(dx,dy);
    }
}


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

import objectdraw.*;
import java.awt.*;

public class MoveBall extends ActiveObject{
    private FilledOval ball;
    public final int pauseTime=33,
    margin=5;
    private int size=5,
    ball_speed=8;
    DrawingCanvas canvas;
    boolean move;

    //Line line_1,line_2,line_3,line_4;
    RandomIntGenerator generator1=new RandomIntGenerator(-5,5);
    RandomIntGenerator generator2=new RandomIntGenerator(-3,-5);
    private    int move_x=generator1.nextValue();
    private    int move_y=generator2.nextValue();
    public MoveBall(double x,double y,DrawingCanvas Canvas){
        canvas=Canvas;
        ball=new FilledOval(x,y,size,size,Canvas);

    }
    public MoveBall(Location point,DrawingCanvas Canvas){
        this(point.getX(),point.getY(),Canvas);    
    }
    public void showAndStart(){
        ball.show();
        start();
    }
    public void moveTo(Location p){
        ball.moveTo(p);
    }
    public void hide(){
        ball.hide();
    }
    @Override public void run(){
        move=true;
        while(move){
            ball.move(move_x,move_y);
            pause(pauseTime);
            if(margin>ball.getX()||(canvas.getWidth()-2*margin)<ball.getX()){
                move_x=-move_x;
            } else if(4*margin>ball.getY()){
                move_y=-move_y;
            }

      }

    }

    public boolean contains(Location p){
        return ball.contains(p);
    }
    public void setColor(Color color){
        ball.setColor(color);
    }
    public double getX(){
        return ball.getX();
    }
    public double getY(){
        return ball.getY();
    }
    public void turnMoveX(){
        move_x=-move_x;
    }
    public void turnMoveY(){
        move_y=-move_y;
    }
    public int getSize(){
        return size;    
    }
}

試したこと

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 88.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る