寫一例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()
方法。類中設定了一個sum
和sum2
,都表示一個函式,具體指繪製的過程,前者沒有返回值(返回值為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的函數語言程式設計技術和思想,如容器中的filter
、forEach
等方法,讓程式碼看的很清爽簡潔。
最後是主程式:
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代表使用物件中的文字資訊。
【本來是想著直接在外頭使用物件中的成員變數,或是定義或是使用物件中的具體值,經過一番嘗試,並沒有碼出正確的程式碼,因此退一步求其次,求了上述的一種方法】
結尾
最後執行的畫面如下:
這樣的設計無疑是更靈活、易擴充套件的,但是筆者的功底並不能很好的駕馭它,後續還得加倍學習更深的內容和更多的練習,共勉。