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

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

ただいまの
回答率

90.48%

  • Java

    14152questions

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

  • Android

    6637questions

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

  • Android Studio

    3801questions

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

Android ブロック崩し BallクラスでdrawCircleした円を動かすには?

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,241

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

現在、MainActivityにdrawCircleしてボールらしきものを描いています。
これをBallクラスを使って描画、動作させたいです。

ひとまずBallクラスを使って描画はできたのですが、動作がうまくいきません。

Ballクラスにmoveメソッドを作成し、動きを定義しました。
drawCircleした円にこれを使いたいのですが、どのように書けばいいのでしょうか?

ーーーーー

また、それがわからなかったため、ひとまずmoveメソッドを使わずにMainActivityに下記動作を記述してみましたが、なぜか動作しませんでした。
//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;

他の二つのボールは動いているので、???状態です。

お力貸していただけると幸いです。

参考にしたサイト

Main

package com.example.blockbreak;

---中略---

    class CustomView extends SurfaceView implements SurfaceHolder.Callback, Runnable {

        //スレッドクラス
        Thread mainLoop;
        // 描画用
        Paint paint;
        Paint paint2;
        Paint paint3;
        Paint paint4;
        Paint paint5;
        Paint paint6;

        // 円のX,Y座標
        private int circleX = 50;
        private int circleY = 50;
        private int circle2X = 30;
        private int circle2Y = 30;
        // 円の移動量
        private int circleVx = 15;
        private int circleVy = 15;
        private int circle2Vx = 8;
        private int circle2Vy = 15;

        Block[] block;
        Bar  bar;              //バー
        int view_w, view_h;    // SurfaceViewの幅と高さ
        Ball ball;
        int num; //カウンターiの最大値変数 画面サイズによって表示個数を変えるため
        private float touch_x; // タッチされたx座標




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

            paint.setColor(Color.RED);
            paint2.setColor(Color.CYAN);
            paint3.setColor(Color.GREEN);
            paint4.setColor(Color.RED);
            paint5.setColor(Color.YELLOW);
            paint6.setColor(Color.BLUE);



        }



        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                                   int height) {
            // TODO 今回は何もしない。

        }


        // 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 void surfaceDestroyed(SurfaceHolder holder) {
            // TODO 今回は何もしない。
        }

        @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();
                    touch_x = view_w/2;

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

                    block = new Block[21];

---中略---


                    }
                    //バーを描画する   left top right bottom
                    canvas.drawRect(bar.x - bar.halfBar , bar.y , bar.x + bar.halfBar , bar.y + 20 , paint3);
                    // 円1を描画する
                    canvas.drawCircle(circleX, circleY, 20, paint);
                    //円2を描画する
                    canvas.drawCircle(circle2X,circle2Y,20,paint2);
                    //Ballクラスからボールを描画
                    canvas.drawCircle( ball.x, ball.y, ball.size , paint5);

                    //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;


                    // 円の座標を移動させる
                    circleX += circleVx;
                    circleY += circleVy;
                    circle2X += circle2Vx;
                    circle2Y += circle2Vy;
                    // 画面の領域を超えた?
                    if (circleX < 0 || getWidth() < circleX)  circleVx *= -1;
                    if (circleY < 0 || getHeight() < circleY) circleVy *= -1;
                    if (circle2X < 0 || getWidth() < circle2X)  circle2Vx *= -1;
                    if (circle2Y < 0 || getHeight() < circle2Y) circle2Vy *= -1;



                    getHolder().unlockCanvasAndPost(canvas);

                }
            }





        }
    }





}


Ball

public class Ball {
    //ボールのサイズ
    int size = 20;
    // 表示座標
    float x, y;
    // 速度
    double vx, vy;
    // 画面の幅と高さ
    int view_w, view_h;
    // 弾の生死フラグ
    boolean isLive = true;

    //コンストラクタ
    public Ball( int _x, int _y, int width, int height ){
        //初期座標をセット
        x = (float)_x;
        y = (float)_y;
        //ビューの幅と高さをセット
        view_w = width;
        view_h = height;
        vx = 15;
        vy = 15;
    }
    public void move(){
        // 円の座標を移動させる
        //circleX += circleVxの部分
        x = x + (float)vx;
        y = y + (float)vy;

        // 壁に当たった時の処理、速度を入れ替える
        if(x > view_w - size  ){
            //画面右
            vx = -vx;
            x = ( view_w - size );
        }else if( x < 0 ){
            //画面左
            vx = -vx;
            x = 0;
        }
        if( y < 0 ){
            //画面上
            vy = -vy;
            y = 0;
        }else if( y > view_h ){
            //画面下
            isLive = false;
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • abs123

    2016/04/27 16:19

    「動作がうまくいかない」「動作しない」といった表現をされていますが、これだと正常な動作をしていない(ボールが想定外の動作をしている)のか、動作自体していない(ボールが動かない)のか、どちらか分かりにくいです。具体的な症状をお願いします。

    キャンセル

  • masaakitsuyoshi

    2016/04/27 16:54

    失礼しました。 ボールがnewしたときの位置から動かない、という意味です。 ball = new Ball(view_w/2, view_h/3 , view_w, view_h ); view_w view_hは画面サイズ 画面の上から三分の一ほど、横は真ん中あたりから動きません。

    キャンセル

回答 1

checkベストアンサー

0

Ballクラスを毎回newしてインスタンス化しているから位置が変わらないのではないでしょうか。
試しにdrawCircleの直前にログ出力を追加してBallの位置を出力して見たらどうでしょうか。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/27 17:00

    D/Ball座標: ball.x =360.0
    D/Ball座標: ball.y =410.0
    となっていました。
    newしたときの位置のままです。

    キャンセル

  • 2016/04/27 17:06

    newする場所をコンストラクタに変更してみてください。

    キャンセル

  • 2016/04/27 17:23

    あ、動きました。

    Ballクラスという他クラスを使ってるからなんでしょうか?

    キャンセル

  • 2016/04/27 17:51

    違います。
    あなたのプログラムでは描画の際にBallのインスタンスを新しく作り、参照変数を上書きしています。
    そのため、毎回新しく作ったBallを描画しているので初期位置から動かないだけです。

    キャンセル

  • 2016/04/28 13:55

    @Override runのループの中でnewしているから、ということでしょうか。
    ではBarなどもrunの中でnewしたら横に移動させようとしても移動しないということでしょうか。

    キャンセル

  • 2016/04/28 14:21

    作り方次第です。

    今回のように、前回の描画位置をもとに次の描画位置を決める場合はインスタンスが異なると移動しません。

    キャンセル

  • 2016/04/28 15:52

    大変参考になりました。

    キャンセル

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

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

関連した質問

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

  • Java

    14152questions

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

  • Android

    6637questions

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

  • Android Studio

    3801questions

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