前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >随机飘动的泡泡

随机飘动的泡泡

原创
作者头像
用户6167008
修改2019-09-24 17:40:54
1K0
修改2019-09-24 17:40:54
举报
文章被收录于专栏:javafx框架tornadofx
代码语言:txt
复制
import javafx.geometry.Pos
import javafx.scene.canvas.Canvas
import javafx.scene.canvas.GraphicsContext
import javafx.scene.paint.Color
import javafx.scene.paint.Paint
import javafx.scene.shape.Circle
import javafx.scene.text.FontWeight
import tornadofx.*
import java.util.*
import kotlin.system.exitProcess

class AlgoApp : App(AlgoFrame::class, Styles::class) {
    override fun stop() {
        super.stop()
        // 退出进程,runAsync也一并退出
        exitProcess(0)
    }
}

class AlgoFrame : View("随机飘动的泡泡") {
    lateinit var cv: Canvas
    val R = 50.0
    var circles = mutableListOf<MyCircle>()
    override val root = borderpane {
        center = canvas(700.0, 300.0) {
            cv = this
            with(cv.graphicsContext2D) {
                strokeRect(0.0,0.0,cv.width,cv.height)
            }
        }
    }

    private fun runn(){
     runAsync {
            while (true) {
                render()
                AlgoVisHelper.pause(20)
                circles.forEach {
                    it.move(0,0,cv.width.toInt(),cv.height.toInt())
                }
            }
        }
    }

    private fun render() {
        repaint()
    }

    private fun repaint() {
        cv.graphicsContext2D.clearRect(0.0, 0.0, cv.width, cv.height)
        cv.graphicsContext2D.strokeRect(0.0,0.0,cv.width,cv.height)
        paintComponent(cv.graphicsContext2D)
    }

    private fun paintComponent(g: GraphicsContext) {
        g.fill = Color.RED
        g.stroke= Paint.valueOf("red")
        circles.forEach {
            g.strokeOval(it.centerX, it.centerY, it.radius, it.radius)
        }
    }

    init {
        circles = genCircles()
        paintComponent(cv.graphicsContext2D)
        runn()
    }

    private fun genCircles(): MutableList<MyCircle> {
        return (0..10).map {
            val x = Random().nextDouble() * (700 - 2 * R) + R
            val y = Random().nextDouble() * (300 - 2 * R) + R
            val vx = Random().nextDouble() * 11 - 5
            val vy = Random().nextDouble() * 11 - 5
            MyCircle(x, y, R, vx, vy)
        }.toMutableList()
    }

}

class MyCircle(var x: Double, var y: Double, var r: Double, var vx: Double, var vy: Double) : Circle(x, y, r) {
    fun move(minx: Int, miny: Int, maxx: Int, maxy: Int) {
        this.centerX += vx
        this.centerY += vy
        this.x += vx
        this.y += vy
        checkCollision(minx,miny,maxx,maxy)
    }

    private fun checkCollision(minx: Int, miny: Int, maxx: Int, maxy: Int) {
        if (x - r < minx) {
            x = r
            vx = -vx
        }
        if (x + r >= maxx) {
            x = maxx - r
            vx = -vx
        }
        if (y - r < miny) {
            y = r
            vy = -vy
        }
        if (y + r >= maxy) {
            y = maxy - r
            vy = -vy
        }
    }
}

class Styles : Stylesheet() {
    init {
        button {
            padding = box(10.px)
            alignment = Pos.CENTER
            backgroundColor += c("#DD7549")
            fontWeight = FontWeight.EXTRA_BOLD
            fontSize = 14.px

            and(hover) {
                backgroundColor += c("#A05434")
                textFill = Color.WHITE
            }
        }
        label {
            fontSize = 14.px
            textFill = Color.RED
        }
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档