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

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

ただいまの
回答率

90.47%

  • Java

    14112questions

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

  • Android

    6632questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3791questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Android onTouchEventでブロック崩しのバーを動かしたい

解決済

回答 1

投稿

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

androidでブロック崩しを作成しています。

Barクラスを作成し、drawRectでバーを作成しました。

バーを移動させるためにonTouchEventをオーバーライド。
タッチした時のx,y座標は無事取得できました。

取得したx,yの値をbarのx座標、y座標に入れバーを移動させたいのですが、バーが描画位置から動きません。
どのように行えばいいでしょうか?


whileループの中でbar = new Bar();
しており、これが原因で移動しないかもしれない

whileの外に出し、CustomViewのコンストラクタ内でBarをnewすると、今度はバー自体が描画されない。
Ballは同じ方法で、CustomViewのコンストラクタ内でnewして描画、移動できている。

Main

package com.example.blockbreak;

//----中略ーーーーー

    class CustomView extends SurfaceView implements SurfaceHolder.Callback, Runnable {

        //スレッドクラス
        Thread mainLoop;
        // 描画用
        Paint paint;
      //----中略ーーーーー

        Block[] block;
        Bar  bar;              //バー
        int view_w, view_h;    // SurfaceViewの幅と高さ
        Ball ball;

        float touchX,touchY;
        int touchAction;//x座標、y座標,アクション種別の取得
        boolean flag;//タッチしてるかどうか




        //コンストラクタ
        public CustomView(Context context) {
            super(context);
            // SurfaceView描画に用いるコールバックを登録する。
            getHolder().addCallback(this);
            // 描画用の準備
            paint = new Paint();

          //----中略ーーーーー

            //ボールを生成
            ball = new Ball(view_w/2, view_h/3 , view_w, view_h );


        }



      //----中略ーーーーー

        // SurfaceView生成時に呼び出されるメソッド。
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // 背景
            Canvas canvas = holder.lockCanvas();
            canvas.drawColor(Color.BLACK);
            holder.unlockCanvasAndPost(canvas);
            // スレッド開始
            mainLoop = new Thread(this);
            mainLoop.start();

        }


  //----中略ーーーーー

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            touchX =event.getX();
            touchY=event.getY();
            touchAction=event.getAction();
            Log.d("Barのx座標","bar.x="+bar.x);
            Log.d("Barのy座標","bar.y="+bar.y);


            switch (touchAction) {
                case MotionEvent.ACTION_DOWN:
                    flag = true;
                    break;
                case MotionEvent.ACTION_UP:
                    flag = true;
                    break;
                case MotionEvent.ACTION_MOVE:
                    flag = false;
                    break;
            }

            return super.onTouchEvent(event);
        }


        @Override
        public void run(){

            while (true) {
                Canvas canvas = getHolder().lockCanvas();
                if (canvas != null)
                {
                    //背景
                    canvas.drawColor(Color.BLACK);

                    view_w = canvas.getWidth();
                    view_h = canvas.getHeight();

                    // バーを生成  view_w/2画面の半分
                    bar  = new Bar( view_w/2 , view_h - 100 );

                    block = new Block[24];
                    block[0]= new Block(view_w/10 , view_h/9);
                    block[1]= new Block(view_w/10 + 40*2 + 5, view_h/9 );
                    block[2]= new Block(view_w/10 + (40*2 + 5)*2, view_h/9);
                    block[3]= new Block(view_w/10 + (40*2 + 5)*3, view_h/9);

                  //----中略ーーーーー


                    //ブロックを描画する
                    for(int i=0; i <24 ;i+=1) {

                        canvas.drawRect(block[i].x -40,block[i].y -10, block[i].x +40, block[i].y +10, paint3);

                    }


                    //バーを描画する   left top right bottom
                    canvas.drawRect(bar.x - bar.halfBar , bar.y , bar.x + bar.halfBar , bar.y + 20 , paint3);
                    //Ballクラスからボールを描画
                    canvas.drawCircle( ball.x, ball.y, ball.size , paint5);


                    //TODO:バーをうごかす
                    if(flag) {

                        bar.x+=touchX;
                        bar.y+=touchY;
                    }

                    //Ballクラスのボールを移動
                    ball.x += ball.vx;
                    ball.y += ball.vy;
                    if (ball.x < 0 || getWidth() < ball.x)  ball.vx *= -1;
                    if (ball.y < 0 || getHeight() < ball.y) ball.vy *= -1;
                    //TODO:玉とブロックの衝突判定 ブロック消失 玉反発 音がなる

                    getHolder().unlockCanvasAndPost(canvas);

                }
            }

        }




    }





}


Bar

public class Bar {
    //表示座標
    public float x;
    public float y;
    //バーのサイズ
    public final float halfBar = 100;


    //コンストラクタ
    public Bar( int _x, int _y ){
        //初期座標をセット
        x = (float)_x;
        y = (float)_y;
    }

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

描画の中で下記の記述がBarを描画した後にあるので意味がないですね。また、while文の中にBarをインスタンス化する記述がなくても、下記の書き方ではBarは爆発的に増加するので目視する前に画面の外に出てしまうと思いますよ。

if(flag) {
bar.x+=touchX;               bar.y+=touchY;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/02 11:42

    なるほど。
    バーが吹っ飛んでどっかにいくとこまでできました!

    爆発的に増加しないようにすればいいんですね。

    キャンセル

  • 2016/05/02 16:29

    そうですね。
    差分にするか、タップ位置に移動させるかはゲームの仕様次第ですね。

    キャンセル

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

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

関連した質問

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

  • Java

    14112questions

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

  • Android

    6632questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3791questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。