ブロック崩しを作っています。
クラス
Main
Ball
Bar
Block
Ballの移動スピード
vx =15
vy=15
Barクラスののインスタンスを利用してdrawrect()して短形を作成
onTouchでdrawrectされた短形を移動させたい。
タッチしたx座標にdrawrectされたバーが遷移するようにしたい。
(Ballの移動スピードと同じにしたい)
※
bar.x //drawrectしたバーのx座標
touchX// (onTouchを利用)タップされた際のx座標
現時点で bar.x = touchX しているため
drawrectされたバーが、瞬間移動している。
※バーが消えないようにしたい。
https://www.youtube.com/watch?v=bMGebET8hHs
参考
http://2byteresearch.blogspot.jp/2011/04/android_16.html
瞬間移動しているので、上の動画のように瞬間移動しないで移動するようにしたい
Main.java ontouch
@Override public boolean onTouchEvent(MotionEvent event) { int x =(int)event.getRawX();//タッチした座標 int y=(int)event.getRawY(); touchAction=event.getAction(); switch (touchAction) { case MotionEvent.ACTION_DOWN: int screenX = x; int screenY = y; break; case MotionEvent.ACTION_MOVE: int diffX = bar.x - screenX;//差分 int diffY = bar.y - screenY; diffX/2; diffY/2; break; case MotionEvent.ACTION_UP: break; } return super.onTouchEvent(event); }
Ball.java
Ball.java
1public Ball(int _x, int _y, int width, int height) { 2 //初期座標をセット 3 x = (float) _x; 4 y = (float) _y; 5 //ビューの幅と高さをセット 6 view_w = width; 7 view_h = height; 8 vx = 15;//ボールの移動速度 9 vy = 15; 10 }
Main.javaほぼ全文
package com.example.blockbreak; import android.content.Context; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //カスタムビュークラスのインスタンスをコンテントにセット setContentView(new CustomView(this)); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); } class CustomView extends SurfaceView implements SurfaceHolder.Callback, Runnable { Block[] block,block2,block3,block4,block5,block6,block7,block8,block9,block10; Bar bar; //バー int view_w, view_h; // SurfaceViewの幅と高さ Ball ball; int num; //カウンターiの最大値変数 画面サイズによって表示個数を変えるため //Blockの情報 int blockWidth = 40;//ブロックの半分の横の長さ int blockHeight = 10;//ブロックの半分の高さ int margin =5; float touchX,touchY; int touchAction;//x座標、y座標,アクション種別の取得 //コンストラクタ public CustomView(Context context) { super(context); // SurfaceView描画に用いるコールバックを登録する。 getHolder().addCallback(this); // 描画用の準備 // ViewGroup root = (ViewGroup)getWindow().getDecorView().findViewById(android.R.id.content); // view_h = root.getHeight(); // view_w = root.getWidth(); // Log.d("width", "view_w:" +view_w); // Log.d("height", "view_h:" +view_h); WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE); // ディスプレイのインスタンス生成 Display disp = wm.getDefaultDisplay(); Point size = new Point(); disp.getSize(size); view_w =size.x; view_h =size.y; //ボールを生成 ball = new Ball(view_w/2, view_h/3 , view_w, view_h ); // バーを生成 view_w/2画面の半分 bar = new Bar( view_w/2 , view_h - 150 ); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } // 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) { } @Override public boolean onTouchEvent(MotionEvent event) { // Canvas canvas = getHolder().lockCanvas(); touchX =event.getRawX(); touchY=event.getRawY(); touchAction=event.getAction(); // float diffX = bar.x - touchX; switch (touchAction) { case MotionEvent.ACTION_DOWN: bar.x = touchX; bar.y = touchY; break; case MotionEvent.ACTION_MOVE: bar.x = touchX; bar.y = touchY; // canvas.drawRect(touchX-bar.halfBar,bar.y +10, touchX + bar.halfBar, bar.y +10,paint3); break; case MotionEvent.ACTION_UP: break; } // if(flag) { // bar.x =touchX -bar.halfBar; // } return super.onTouchEvent(event); } @Override public void run(){ while (true) { Canvas canvas = getHolder().lockCanvas(); if (canvas != null) { //背景 canvas.drawColor(Color.BLACK); //max720 1280 画面サイズ num =(view_w - 32 + margin)/(blockWidth*2);//横ブロックの個数. //---中略---- //バーを描画する left top right bottom canvas.drawRect(bar.x - bar.halfBar , bar.y +bar.height , bar.x + bar.halfBar , bar.y - bar.height , paint3); //Ballクラスからボールを描画 canvas.drawCircle( ball.x, ball.y, ball.size , paint5); //Ballクラスのボールを移動 ball.x += ball.vx; ball.y += ball.vy; //TODO:ボールの中心で判定されてるので、ボールの幅で判定するようにする(Option) //壁に衝突 if (ball.x < 0 || getWidth() < ball.x) ball.vx *= -1; if (ball.y < 0 || getHeight() < ball.y) ball.vy *= -1; //バーに衝突 if (ball.x + ball.size >=bar.x) ball.vx *= -1; if (ball.x <= bar.x + bar.halfBar) ball.vx *= -1; if (ball.y >= bar.y) ball.vx *= -1; getHolder().unlockCanvasAndPost(canvas); } } } } }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。