A altura dos meus canos está sendo alterada frame a frame após adicionar o incremento com o valor aleatório.
Minha principal dúvida é o porquê isso não ocorre nos vídeos, já que o método que desenha os canos aleatoriza o tamanho e este é realmente chamado frame a frame no game loop.
Seguem trechos do meu código:
Classe Cano
class Pipe(private val screen: Screen, private var position: Int) {
private val pipeHeight = 250
private val pipeWidth = 100
private val bottomPipeTop: Int
get() = (screen.height - pipeHeight).minus(Random.nextInt(150))
private val topPipeBottom: Int
get () = pipeHeight.plus(Random.nextInt(150))
fun drawTopPipeTo(canvas: Canvas) {
canvas.drawRect(position.toFloat(), 0f, position + pipeWidth.toFloat(), topPipeBottom.toFloat()
, GamePaint.pipeColor)
}
fun drawBottomPipeTo(canvas: Canvas) {
canvas.drawRect(position.toFloat(), bottomPipeTop.toFloat(), position + pipeWidth.toFloat(), screen.height.toFloat(), GamePaint.pipeColor)
}
fun move() {
position -= 5
}
}
Classe Canos
package tech.pucci.jumper.elements
import android.graphics.Canvas
import tech.pucci.jumper.graphics.Screen
class Pipes(private val screen: Screen) {
private val pipes: ArrayList<Pipe> = ArrayList()
private val quantity: Int = 5
private val distance: Int = 230
init {
addPipes()
}
private fun addPipes() {
for (x in 1..quantity) {
pipes.add(Pipe(screen, x * distance))
}
}
fun drawTo(canvas: Canvas) {
pipes.forEach {pipe ->
pipe.drawBottomPipeTo(canvas)
pipe.drawTopPipeTo(canvas)
}
}
fun move(){
pipes.forEach { pipe -> pipe.move() }
}
}
Game Loop
override fun run() {
while(isRunning){
if(!holder.surface.isValid) continue
val canvas = holder.lockCanvas()
canvas.drawBitmap(background, 0f, 0f, null)
pipes.drawTo(canvas)
bird.drawTo(canvas)
pipes.move()
bird.fall()
holder.unlockCanvasAndPost(canvas)
}
}