Возникли проблемы при попытке сделать круг движущимся на элементе canvas во время программирования с использованием JS, скомпилированного Kotlin - PullRequest
1 голос
/ 26 июня 2019

Я создаю очень простой веб-прорыв, и у меня возникли проблемы при попытке заставить шар двигаться на элементе canvas.У меня есть игра и работает в javascript.Дело в том, что я сейчас пытаюсь перенести его на Kotlin (скомпилированный javascript).Даже после выполнения адаптаций, которые я считаю необходимыми, мяч не будет двигаться.

У меня также возникают проблемы с типами (поэтому вы увидите, что эти "* 1.0" лежат без дела), так как я не смог преобразовать из int в double, но я бы не сказал, что этовыпуск здесь.Кроме того, IDE показывает замечание, с которым я не знаком.Я говорю об этом в разделе о сообщениях об ошибках, но сообщение выглядит следующим образом: «Обернутый в эталонный объект, который будет изменен при захвате в замыкании».

Я не уверен, в чем именно заключается проблема,но до сих пор я пробовал: -Другие подписи для моего вызова setInterval -Переформатирование программы, чтобы мой код находился в main (), чтобы избавиться от возврата и вызова val canvas = initializeCanvas ().

import org.w3c.dom.*
import kotlin.browser.*
import kotlin.math.*


val canvas = initializeCanvas()
fun initializeCanvas(): HTMLCanvasElement {
    val canvas = document.createElement("canvas") as HTMLCanvasElement
    val ctx = canvas.getContext("2d") as CanvasRenderingContext2D
    ctx.canvas.width = 480
    ctx.canvas.height = 320
    document.body!!.appendChild(canvas)
    var x = canvas.width/2
    var y = canvas.height-30
    val dx = 2
    val dy = -2
    fun drawBall(){
        ctx.beginPath()
        ctx.arc(x*1.0, y*1.0, 10.0, 0.0, PI*2)
        ctx.fillStyle = "#000000"
        ctx.fill()
        ctx.closePath()
    }
    fun draw(){
        ctx.clearRect(0.0, 0.0, canvas.width*1.0, canvas.height*1.0)
        drawBall()
        x += dx
        y += dy
    }
    window.setInterval(draw(),10)
    return canvas
}

Ожидаемым результатом будет то, что шар сместится к верхнему правому краю холста, а затем исчезнет в стене, поскольку я еще не реализовал столкновения.

Текущий выводКак я уже говорил, имеет статический шар.

Что касается сообщений об ошибках, то их нет.Но "Примечание IDE" беспокоило меня.в предоставленном мною коде внутри функции draw я увеличиваю x и y.Когда я наводю на них курсор, intellij говорит, что они «обернуты в эталонный объект, который будет изменен при захвате в замыкании».Я никогда не видел такого предупреждения раньше, и поиск в Интернете не был плодотворным.

1 Ответ

1 голос
/ 27 июня 2019

Обернут в эталонный объект, который будет изменен при захвате в закрытие

Это просто означает, что вам нужно обернуть метод, который вы хотите выполнить - draw - внутри замыкания. Без этого просто будет вызван один раз.

Так просто поменяйте

window.setInterval(draw(), 10)

до

window.setInterval( { draw() }, 10)
...