LoginSignup
1
2

More than 5 years have passed since last update.

kotlinでandroidの入門 ブロック崩し

Posted at

ブロック崩しのボールのみ

動きのある物を作ってみたくなって、ブロック崩しにチャレンジ
まずはボールを動かしてみます

定期的に動かす仕組みは、
前にストップウォッチを作った時に使ったHandlerで

blockBreaking.kt
    // タイマー用
    private val time = 10
    private val handler = Handler() 

    // 起動
    handler.removeCallbacks(runnable)


    val runnable = object : Runnable {
        // 10mS毎の処理
        override fun run() {
            // ボール移動処理
            ball.move()
            if (false == kabe.chkCollision()) {
                // 仮の移動でぶつからなかったので位置確定
                ball.fix()
            }
            // 再表示
            gameArea.invalidate()
            // 次の起動を設定
            handler.postDelayed(this, time.toLong())
        }
    }

ボールはクラスを作って

Ball.kt
class Ball() {
    // 大きさ、座標等
    private val radius : Float = 30F
    private var pointX : Float = 0F
    private var pointY : Float = 0F
    private var vectorX:Float = 0F
    private var vectorY:Float = 0F
    private var tmpX : Float = 0F
    private var tmpY: Float = 0F

    // 描画(円)用
    val size : Float
        get() = radius
    val x  : Float
        get() = pointX
    val y : Float
        get() = pointY
    // 移動前の位置
    val top : Float
        get() = pointY-radius
    val bottom : Float
        get() = pointY+radius
    val left : Float
        get() = pointX-radius
    val right : Float
        get() = pointX+radius
    // 移動後の位置
    val newTop : Float
        get() = tmpY-radius
    val newBottom : Float
        get() = tmpY+radius
    val newLeft : Float
        get() = tmpX-radius
    val newRight : Float
        get() = tmpX+radius

    // 初期位置へ
    fun reset(cx : Float, ytop : Float, vx : Float, vy :Float ) {
        pointX = cx
        pointY = ytop -radius
        vectorX = vx
        vectorY = vy
    }
    // 移動 (暫定値算出)
    fun move( ) {
        tmpX = pointX + vectorX
        tmpY = pointY + vectorY
    }
    // 暫定値を今の位置に (どこにもぶつからなかった時呼ばれる)
    fun fix() {
        pointX = tmpX
        pointY = tmpY
    }
    // Xぶつかった時
    fun resetNewY( p : Float ) {
        pointY = if ( top > p ) {
            p+radius
        } else {
            p-radius
        }
        vectorY *= -1
    }
    // Yぶつかった時
    fun resetNewX( p : Float ) {
        pointX = if ( left < p ) {
            p-radius
        } else {
            p+radius
        }
        vectorX *= -1
    }
    // X軸 加減速 多少のゲーム要素
    fun vectorAcceleX( acc : Float) { vectorX += acc }

}

移動させて座標求め、衝突判定を行ってます
ぶつかったら、ベクトルを反転させる簡単な処理にしてます

ball.png

ソースここ置いてます

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2