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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

1回答

1484閲覧

kotlinのTimerを完全にリセットしたい

momoman1226

総合スコア0

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/08/18 04:16

前提・実現したいこと

kotlinで流れてくるボールを取ったり避けたりするゲームを作っています。
流れとしては、
①メイン画面で画面タップするとゲーム開始
②Timer.scheduleを使いボールが流れてくる
③ゲームオーバーになるとTimerを停止し結果画面へ
④結果画面のボタン押下でメイン画面に遷移
①´メイン画面タップでゲーム開始
②´ボールが流れてくる
です。

①´でゲームを開始した際、②´でのボールの配置が③のゲームオーバー時点の配置となってしまいます。
ゲームを新しく始める度にボールの位置が初期位置(画面外)に戻っていてほしいのですが、どうすればよいのでしょうか。

※上記①´の時点では、ボールは初期位置(画面外)に存在しています。
②´の時点でボールが③のゲームオーバー時の配置に戻ってしまいます。

該当のソースコード

kotlin

1package com.websarva.wings.android.catchtheball 2 3import android.content.Intent 4import android.graphics.Point 5import android.os.Bundle 6import android.os.Handler 7import android.view.MotionEvent 8import android.view.View 9import android.widget.FrameLayout 10import android.widget.ImageView 11import android.widget.TextView 12import androidx.appcompat.app.AppCompatActivity 13import java.util.* 14 15//各種View用 16private var scoreLabel: TextView? = null 17private var startLabel: TextView? = null 18private var box: ImageView? = null 19private var orange: ImageView? = null 20private var pink: ImageView? = null 21private var black: ImageView? = null 22private var frame: FrameLayout? = null 23 24// サイズ 25private var frameHeight = 0f 26private var boxSize = 0f 27private var screenWidth = 0 28private var screenHeight = 0 29 30// 位置 31private var boxY: Float = 0f 32private var orangeX = 0f 33private var orangeY = 0f 34private var pinkX = 0f 35private var pinkY = 0f 36private var blackX = 0f 37private var blackY = 0f 38 39// Score 40private var score = 0 41 42// Handler & Timer 43lateinit var handler: Handler 44private var timer: Timer? = null 45//lateinit var timer: Timer 46 47// Status 48private var action_flg: Boolean = false 49private var start_flg: Boolean = false 50 51class MainActivity : AppCompatActivity() { 52 override fun onCreate(savedInstanceState: Bundle?) { 53 super.onCreate(savedInstanceState) 54 setContentView(R.layout.activity_main) 55 56 scoreLabel = findViewById<TextView>(R.id.scoreLabel) 57 startLabel = findViewById<TextView>(R.id.startLabel) 58 box = findViewById<ImageView>(R.id.box) 59 orange = findViewById<ImageView>(R.id.orange) 60 pink = findViewById<ImageView>(R.id.pink) 61 black = findViewById<ImageView>(R.id.black) 62 start_flg = false 63 64 //ボールを初期位置にセット 65 orange?.setX(-80.0f) 66 orange?.setY(-80.0f) 67 pink?.setX(-80.0f) 68 pink?.setY(-80.0f) 69 black?.setX(-80.0f) 70 black?.setY(-80.0f) 71 scoreLabel?.setText("Score : 0") 72 } 73 74 //Timerで実行する処理 75 fun changePos() { 76 77 hitCheck() 78 79 // Orange 80 orangeX -= 12f 81 if (orangeX < 0) { 82 orangeX = (screenWidth + 20).toFloat() 83 orangeY = Math.floor(Math.random() * (frameHeight - orange!!.height)).toFloat() 84 } 85 orange?.setX(orangeX) 86 orange?.setY(orangeY) 87 // Black 88 blackX -= 16f 89 if (blackX < 0) { 90 blackX = (screenWidth + 10).toFloat() 91 blackY = Math.floor(Math.random() * (frameHeight - black!!.height)).toFloat() 92 } 93 black?.setX(blackX) 94 black!!.setY(blackY) 95 // Pink 96 pinkX -= 20f 97 if (pinkX < 0) { 98 pinkX = (screenWidth + 5000).toFloat() 99 pinkY = Math.floor(Math.random() * (frameHeight - pink!!.height)).toFloat() 100 } 101 pink?.setX(pinkX) 102 pink?.setY(pinkY) 103 // Box 104 if (action_flg) { 105 boxY -= 20 106 } else { 107 boxY += 20 108 } 109 box?.setY(boxY) 110 111 if (boxY < 0) { 112 boxY = 0f 113 } 114 if (boxY > frameHeight - boxSize) { 115 boxY = frameHeight - boxSize 116 } 117 scoreLabel?.setText("Score : " + score) 118 } 119 120 //衝突判定 121 fun hitCheck() { 122 // Orange 123 val orangeCenterX = orangeX + orange!!.width / 2 124 val orangeCenterY = orangeY + orange!!.height / 2 125 if (0 <= orangeCenterX && 126 orangeCenterX <= boxSize && 127 boxY <= orangeCenterY && 128 orangeCenterY <= boxY + boxSize) { 129 orangeX = -10.0f 130 score += 10 131 } 132 // Pink 133 val pinkCenterX = pinkX + pink!!.width / 2 134 val pinkCenterY = pinkY + pink!!.height / 2 135 if (0 <= pinkCenterX && 136 pinkCenterX <= boxSize && 137 boxY <= pinkCenterY && 138 pinkCenterY <= boxY + boxSize) { 139 pinkX = -10.0f 140 score += 30 141 } 142 // Black(当たるとゲームオーバー) 143 val blackCenterX = blackX + black!!.width / 2 144 val blackCenterY = blackY + black!!.height / 2 145 if (0 <= blackCenterX && 146 blackCenterX <= boxSize 147 && boxY <= blackCenterY 148 && blackCenterY <= boxY + boxSize) { 149 150 // timerを止める 151 if (timer != null) { 152 timer?.cancel() 153 timer = null 154 } 155 // 結果画面へ 156 val intent = Intent(applicationContext, ResultActivity::class.java) 157 intent.putExtra("SCORE", score) 158 startActivity(intent) 159 } 160 } 161 162 //画面タップ時の処理 163 override fun onTouchEvent(event: MotionEvent?): Boolean { 164 if (start_flg == false) { 165 start_flg = true 166 frame = findViewById<FrameLayout>(R.id.frame) 167 frameHeight = frame!!.height.toFloat() 168 boxY = box!!.y 169 boxSize = box!!.height.toFloat() 170 171 startLabel?.setVisibility(View.GONE) 172 173 score = 0 174 175 //ゲーム開始と同時にTimer処理が動く 176 timer = Timer() 177 handler = Handler() 178 timer?.schedule(object : TimerTask() { 179 override fun run() { 180 handler.post { changePos() } 181 } 182 }, 0, 20) 183 184 } else { 185 if (event?.getAction() == MotionEvent.ACTION_DOWN) { 186 action_flg = true 187 } else if (event?.getAction() == MotionEvent.ACTION_UP) { 188 action_flg = false 189 } 190 } 191 return true 192 } 193 194 override fun onBackPressed() {} 195}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tshion

2021/08/28 14:38 編集

> ④結果画面のボタン押下でメイン画面に遷移 このときって、どんな感じでメイン画面に遷移させた感じでしょうか? 変数がクラス内になく、トップレベルで定義されているので、 もしかしたら状態を引きずっているかもです
guest

回答1

0

タイマーを止めてもボールの位置が勝手には変りませんから、ゲームをリスタートする前に、 「//ボールを初期位置にセット」のところでやっているバールの位置の初期化を実施する必要があります。

僕なら、ゲームオーバになったところでやりますかね。

また、この処理は複数呼ばれていますから、関数化してもいいですね。

投稿2021/08/18 09:03

TakaiY

総合スコア12753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momoman1226

2021/08/18 13:27

回答ありがとうございます。 ボールを初期位置にセットする処理をtimer = nullの直後に記載してみましたが、特に変化はありませんでした…。
TakaiY

2021/08/18 13:50

基本的にはそれでいいと思うのですが、あとはデバッグで動かして、再スタート時のボールの一がチャント変っているかどうか確認してみるとかでしょうかえ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問