編輯器功能擴展
今天,我想讓編輯器能夠處理一個數組,這是編輯器將要編輯的東西,它只編輯數組。這些區域在后續的不同版本的編輯器中會有不同的含義,但現在我想創建一個模板,能夠加載一個二維數組,并將二維數組寫回文件。
好吧,讓我們馬上開始。首先,我想把一個數組放到我們的東西里面,就像這樣:0, 1, 2, 3,這些只是一些數字。這里有個小問題,這是一個字符串,里面包含了一些數字,我們將使用split
函數將它拆分成一個數組。我覺得這樣更好,盡管我們也可以直接放一個數組在這里,但這是不可行的。
關于導入功能,有一個重要的事情我沒有提到,那就是這并不能繞過令牌限制。當你把這個文本文件的內容粘貼到你的 PICO-8 卡上時,你會失去那些令牌。如果現在選擇這個,它顯示是0個令牌,但一旦執行并且測試內容等于某些東西,你就會支付那些令牌。如果代碼超過了令牌限制(比如8100個令牌),那么你的卡就不會運行。
所以,我不能把所有的令牌密集型的東西都放到一個文本文件中然后導入,那樣是行不通的。有其他方法可以做到這一點,但不是這種方法。
實現細節與優化
無論如何,我們在這個文本文件里的東西最好已經是令牌優化過的,尤其是因為這里有很多數據。所以,我們想保存一個字符串,然后把它拆分成一個數組。但如果我們這樣做,我們需要對導入的數據運行split
函數,為什么不直接把這個split
寫在我們的文本文件里呢?
好吧,我來保存這個并看看會發生什么。現在,我們不能再把這個數據打印到屏幕上了,因為現在這個數據在我們的文本文件里是一個數組,我們不能直接打印它。現在我們需要做的是遍歷這些數據,我們可以通過一個循環來實現,比如for i = 1, #data do
,然后使用bgprint(datai])
來打印每個數據。
但是,問題是我們把所有的數字都畫在了同一個地方,所以我們需要讓它們稍微下移一點。我們可以這樣做:y = 2 + 7 * i
,這樣隨著我們在屏幕上繪制下一個項目,y值就會增加。現在我們有了一個像表格一樣的項目列表,很好。
接下來,我們在PICO-8(或Lua)中有一個技巧,如果你運行一個函數,而這個函數只接受一個字符串作為參數,你可以省略引號和括號。這也會執行,我們將利用這一點。
導出功能實現
現在,我想實現導出功能。稍后我們將為多維數組實現導出功能,但現在我想先寫一個簡化版的,為一維數組實現導出功能。為此,我想做一些小的改動。比如,我們想要編輯器能夠處理不同的變量名,但內部的變量名應該始終保持不變。
所以,我想創建一個地方,你可以自定義編輯器來編輯不同類型的數據。我想在文本文件中保存要寫入的文件名,以及從哪個文件名寫入。但是,include
語句不接受變量,你必須拼寫出文件名,比如include "text.txt"
,我們不能這樣做。所以,我們需要在文本文件中保存要寫入的文件名,這樣我們的導出函數就可以使用它。
我們還想有一個叫data
的變量,我們將把這個變量設置為test
,在這個例子中,test
是我們從文件中獲取的變量。每次在編輯器中工作時,我們都會使用這個data
變量。
現在,讓我們去實現導出功能。我們肯定要保留這個print()
語句,我們只是想編輯這個局部變量s
。我們想把所有的數據格式化成字符串,然后把它寫入s
,再把s
寫出來。
哦,對了,我們還需要在字符串中包含數組的名字,因為導出時需要知道應該把哪個數組寫入導出文件。
接下來,我們要遍歷所有的數據,并把它們寫入字符串。我們可以使用與在屏幕上打印數據相同的邏輯。但是,我們還需要在數字之間添加逗號,而且最后一個數字后面不應該有逗號。我們可以通過在添加數字之前檢查是否是第一個數字來解決這個問題。
現在,我們保存并運行它,看看是否有效。我們需要找一種方法把調試代碼從我們的主程序中引入到這里,這樣我們就可以調試導出功能是否工作正常。但現在,我們先看看記事本是否有任何變化。看起來沒有變化,這實際上是件好事,因為如果我們沒有對底層數據進行任何更改,我們希望代碼導出的是相同的東西。
現在,這個導出功能已經可以使用一維數組了。接下來,我想讓它能夠處理二維數組。為此,我們需要添加一些東西,我想復制粘貼我們的split2d
函數到這里。這個函數很重要,因為它將把一個字符串拆分成二維數組,就像我們在主程序中做的那樣。
我們要使用split2d
函數,并用管道符|
來分隔數據。現在,我們要把數據繪制到屏幕上,所以我們需要一個嵌套的循環。但是,我們之前遇到的問題是所有的數字都重疊在一起,所以我們需要添加一些偏移量來讓它們分開顯示。
現在,我們需要實現二維數組的導出功能。這基本上與一維數組的導出相同,但我們需要在數組之間插入管道符|
,在數組內的元素之間插入逗號。而且,我們需要確保第一個數組和每個數組的第一個元素前面沒有額外的分隔符。
現在,我們保存并導出數據,看看是否一切正常。看起來一切正常,數據已經成功導出。現在,我想看看這是否能與我們實際的數據一起工作,所以我把之前的一些數組數據復制粘貼到這里,并進行了一些小的調整。現在,我們可以運行它,看看是否能成功導入和導出這些數據。
看起來一切正常,數據已經成功導入和導出。現在,我們可以把這個編輯器集成到我們的工作流程中。我們有一個完整的導入導出循環,現在我想開始著手編輯器的UI設計。
pico-8 cartridge // http://www.pico-8.com
version 41
__lua__function _init()--- customize here ---#include shmup_myspr.txtfile="shmup_myspr.txt"arrname="myspr"data=myspr----------------------debug={}_drw=draw_table_upd=update_tablemenuitem(1,"export",export)reload(0x0,0x0,0x2000,"cowshmup.p8")
endfunction _draw()_drw()-- debug --cursor(4,4)color(8)for txt in all(debug) doprint(txt)end
endfunction _update60()_upd()
end
-->8
--drawfunction draw_table()cls(2)--spr(0,0,0,16,16)for i=1,#data dofor j=1,#data[i] dobgprint(data[i][j],2+18*j,2+8*i,7)endend
end
-->8
--updatefunction update_table()end
-->8
--toolsfunction bgprint(txt,x,y,c)print("\#0"..txt,x,y,c)
endfunction split2d(s)local arr=split(s,"|",false)for k, v in pairs(arr) doarr[k] = split(v)endreturn arr
end
-->8
--i/o
function export()local s=arrname.."=split2d\""for i=1,#data doif i>1 thens..="|"endfor j=1,#data[i] doif j>1 thens..=","ends..=data[i][j]endends..="\""printh(s,"test.txt",true)debug[1]="exported!"
end
__gfx__
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000