Kotlin編寫Processing程式(使用函數語言程式設計思維和麵向介面方式)

EYE發表於2021-04-13

寫一例Kotlin編寫的Processing程式,充分呼叫函數語言程式設計思維和麵向介面的程式設計思維,供自己和讀者參考學習。

初衷

想要實現一行行的文字排版功能,每一行作為一個單位,可制定顯示的位置、大小、文字內容,而且具體資訊在主程式中定義(不在類中寫死)我把此類命名為BillBoard

程式碼

import processing.core.PApplet

class BillBoard (_app : PApplet, _name:String,_posx: Int, _posy:Int) : IDraw{
    var infomation : String = ""    //預設的文字資訊
    set(value) {
        field = value
    }
    var app : PApplet? = null
    var posx : Int = 0
    var posy : Int = 0
    var name : String = ""
        get() {
        return field
    }
    init {
        app = _app
        posx = _posx
        posy = _posy
        name = _name
    }

    var sum = { -> Unit}
    lateinit var sum2 : () -> Int
/*
    fun setDrawFunc(block: () -> Unit )
    {
        sum = block
    }
*/
    override fun draw() {
        app!!.push()
        app!!.translate(posx.toFloat(),posy.toFloat())
        if (sum2() == 0)
            app!!.text(infomation,0f,0f)

        app!!.pop()
    }
}

interface IDraw{

     fun draw()
}

BillBoard類從IDraw介面繼承出來,實現了draw()方法。類中設定了一個sumsum2,都表示一個函式,具體指繪製的過程,前者沒有返回值(返回值為Unit),後者為了回頭做一個判斷依據設返回值為Int。draw()中做了一次判斷,判斷sum2()值是否是0,如果是代表使用預設的文字資訊,如果不是則使用外界的資訊。


接下來是ShowSystem類:

class ShowSystem (app: PApplet){
    var drawlists: MutableList<IDraw> = ArrayList()
    var billBoards: MutableList<BillBoard> = ArrayList()
    init
    {
	//例項BillBoard,引數為id、橫向座標、縱向座標
        val bb1 : BillBoard = BillBoard(app,"b1",20,50)
        val bb2 : BillBoard = BillBoard(app,"b2",100,300)
        val bb3 : BillBoard = BillBoard(app,"b3",400,250)

        drawlists.add(bb1)
        drawlists.add(bb2)
        drawlists.add(bb3)
        billBoards.add(bb1)
        billBoards.add(bb2)
        billBoards.add(bb3)

    }
	//定義預設的文字資訊的方法
    fun setBoardInfo(name:String, infomation:String){
        billBoards.filter { it.name.equals(name) }.forEach { it.infomation = infomation }
    }
	//定義具體繪製方法的方法1 - sum沒有返回值
    fun setBoardType(name:String, func :() -> Unit){
        billBoards.filter { it.name.equals(name) }.forEach { it.sum = func}
    }
	//定義具體繪製方法的方法2 - sum2有返回值的
    fun setBoardType2(name:String, func :() -> Int){
        billBoards.filter { it.name.equals(name) }.forEach { it.sum2 = func}
    }
	//遍歷繪製
    fun run(){
        for(drawunit in drawlists){
            drawunit.draw()
        }

    }
}

其中使用了kotlin的函數語言程式設計技術和思想,如容器中的filterforEach等方法,讓程式碼看的很清爽簡潔


最後是主程式:

import processing.core.PApplet
import processing.core.PConstants
import processing.core.PFont

class BoardShowApp : PApplet(){
    var showSystem :ShowSystem = ShowSystem(this)

    override fun settings() {
        size(800,400)
        smooth(4)
    }

    override fun setup() {
        val simheifont : PFont = createFont("C:\\Windows\\Fonts\\simhei.ttf",32.0f)
        val simkaifont : PFont = createFont("C:\\Windows\\Fonts\\simkai.ttf",60.0f)

        showSystem.setBoardInfo("b1","你好,我的朋友!")
        showSystem.setBoardInfo("b2","gfdgdg")
        showSystem.setBoardInfo("b3","aasanbcvbncbcsad")

        showSystem.setBoardType2("b1") {
            textSize(60f)
            textFont(simheifont)
            return@setBoardType2 0
        }
        showSystem.setBoardType2("b2") {
            textSize(30f)
            textFont(simheifont)

            text("今天是多麼美好",0f,0f)
            return@setBoardType2 1
        }

        showSystem.setBoardType2("b3") {
            textSize(30f)
            textFont(simkaifont)

            text("明天要去憧憬",0f,0f)
            return@setBoardType2 1
        }
    }

    override fun draw() {
        background(60)

        showSystem.run()
    }
}

fun main(args: Array<String>) {
    var bsapp = BoardShowApp()
    PApplet.runSketch(arrayOf("BoardShow1"),bsapp)
}

創立一個showsystem,setup()中初始化引數,最重要的是定義類中具體的繪製方法,並返回進相應的值,返回1代表使用外界的文字資訊,返回0代表使用物件中的文字資訊。
【本來是想著直接在外頭使用物件中的成員變數,或是定義或是使用物件中的具體值,經過一番嘗試,並沒有碼出正確的程式碼,因此退一步求其次,求了上述的一種方法】

結尾

最後執行的畫面如下:
image


這樣的設計無疑是更靈活易擴充套件的,但是筆者的功底並不能很好的駕馭它,後續還得加倍學習更深的內容和更多的練習,共勉。

相關文章