Android ブロック崩し BallクラスでdrawCircleした円を動かすには?
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 2,629
ブロック崩しを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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
Ballクラスを毎回newしてインスタンス化しているから位置が変わらないのではないでしょうか。
試しにdrawCircleの直前にログ出力を追加してBallの位置を出力して見たらどうでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
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は画面サイズ
画面の上から三分の一ほど、横は真ん中あたりから動きません。