ブロック崩しを作っています。
ボールが描画できたので、バーを描画したいです。
表示させること自体はできたのですが、位置がおかしいです。
座標でいうと、(0,0)の位置に表示されてしまいます。
bar = new Bar( view_w/2 , view_h - 100 );
canvas.drawRect(bar.x, bar.y, 180, 10, paint);
bar = new Bar(500,500);
と引数を数字にするとバーも移動するのですが、画面サイズの違うスマホでも同じような位置に表示させたいので、画面サイズを取得して、変数に入れ、それをdrawRectの引数に使いたいです。
ちなみに、こちらを参考にしました。
リンク内容
リンク先ではOverrideされたsurfaceChangedの中に
view_w = width;
view_h = height;
があります。
Changedの中にあるのがいけないのかな?
と思い
surfaceCreatedの中に移動させても変わりませんでした。
Main
package com.example.blockbreak; ----中略---- 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 { //スレッドクラス Thread mainLoop = null; // 描画用 Paint paint = null; Paint paint2 = null; Paint paint3 = null; // 円の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; Bar bar; //バー private float touch_x; // タッチされたx座標 int view_w, view_h; // SurfaveViewの幅と高さ //コンストラクタ public CustomView(Context context) { super(context); // SurfaceView描画に用いるコールバックを登録する。 getHolder().addCallback(this); // 描画用の準備 paint = new Paint(); paint2 = new Paint(); paint3 = new Paint(); paint.setColor(Color.RED); paint2.setColor(Color.CYAN); paint3.setColor(Color.GREEN); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO 今回は何もしない。 view_w = width; view_h = 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(); touch_x = view_w/2; //バーを生成 bar = new Bar( view_w/2 , view_h - 100 ); } ----中略---- @Override public void run(){ while (true) { Canvas canvas = getHolder().lockCanvas(); if (canvas != null) { canvas.drawColor(Color.BLACK); // 円1を描画する canvas.drawCircle(circleX, circleY, 20, paint); //円2を描画する canvas.drawCircle(circle2X,circle2Y,20,paint2); //長方形を描画する canvas.drawRect(bar.x, bar.y, 180, 10, paint); getHolder().unlockCanvasAndPost(canvas); ----中略---- } } } } }
Barクラス
package com.example.blockbreak; public class Bar { //表示座標 public float x; public float y; //バーのサイズ public final float half_size = 100; //コンストラクタ public Bar( int _x, int _y ){ //初期座標をセット x = (float)_x; y = (float)_y; } // 右移動 public void right(float touch_x){ x = touch_x - half_size; } // 左移動 public void left(float touch_x){ x = touch_x - half_size; } }
追記
surfaceCreated の中で
view_w = canvas.getWidth();
view_h = canvas.getHeight();
しても値が0だった。
runの中で行っても値が0だった。
barのインスタンス化をrunの中に移し、
view_w = canvas.getWidth();
view_h = canvas.getHeight();
したら値取得できた。
@Override public void run(){ while (true) { Canvas canvas = getHolder().lockCanvas(); if (canvas != null) { view_w = canvas.getWidth(); view_h = canvas.getHeight(); // バーを生成 bar = new Bar( view_w/2 , view_h - 100 ); //長方形を描画する canvas.drawRect( bar.x, bar.y , bar.x + 200 , bar.y + 20 , paint3);
回答3件
あなたの回答
tips
プレビュー