编辑单元格
我们现在有了一个小编辑器,可以移动光标到不同的单元格之间。现在,我们想创建一个系统,可以编辑单个单元格。我们已经有了一个系统,但那个系统并不完善,因为它只允许你增加或减少1,这不太好。我们希望能够选中一个单元格,然后直接输入一个数字。这在任何编辑器中都是非常有用的功能。
键盘输入处理
上次我展示了如何从键盘获取按键,并将它们组合成一个字符串来输入内容。但今天,我们要更系统地来做这件事。我打算把这个功能封装在一个自己的函数里,我称之为do_keys
。这样,我们可以在更新函数之前调用do_keys
来处理键盘输入。
处理特殊按键
当我们按下P键时,会弹出一个菜单,这不是我们想要的。同样,按下回车键也会触发菜单。我们需要避免这种情况。我找到了一种方法,通过修改内存地址来暂时阻止菜单弹出。这样,当我们按下P键时,菜单就不会弹出了,但回车键仍然会触发菜单。不过,我们可以保留回车键作为打开菜单的一种方式。
编辑模式
现在,我想进入一种编辑模式,允许我在单元格中输入值。我会把所有的按键输入存储在一个变量中,当用户按下回车键时,再将这个变量的内容输入到数据数组中。这样做是为了避免在用户输入过程中改变单元格的值,直到用户准备好提交数据。
显示输入内容
为了在UI上显示正在输入的内容,我会在绘制整个表格后,在正在编辑的单元格上方绘制一个小的文本框,显示输入的内容。
光标和删除功能
接下来,我需要实现几个功能:显示光标、移动光标和删除字符。光标将是一个闪烁的小方块,可以左右移动。删除功能允许用户删除已经输入的字符。
实现光标闪烁
为了实现光标的闪烁效果,我使用了一个时间函数。通过检查时间的小数部分,我可以在特定的时间间隔内切换光标的显示状态,从而实现闪烁效果。
插入字符
当用户输入字符时,我需要将这些字符插入到光标所在的位置,而不是总是添加到字符串的末尾。这要求我重新组织字符串,将新字符插入到光标之前。
删除字符
删除字符的功能相对复杂一些。如果光标在字符串的末尾,我可以简单地删除最后一个字符。但如果光标在字符串的中间,我需要重新组织字符串,删除光标之前的字符。
pico-8 cartridge // http://www.pico-8.com
version 41
__lua__
--show cursor
--move the cursor
--backspacefunction _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")curx=1cury=1scrolly=0scrollx=0poke(0x5f2d, 1)endfunction _draw()_drw()-- debug --cursor(4,4)color(8)for txt in all(debug) doprint(txt)end
endfunction _update60()dokeys()_upd()
endfunction dokeys()if stat(30) thenkey=stat(31)if key=="p" thenpoke(0x5f30,1)endelsekey=nilendend
-->8
--drawfunction draw_table()cls(2)--spr(0,0,0,16,16)if menu thenfor i=1,#menu dofor j=1,#menu[i] dolocal c=13if i==cury and j==curx thenc=7if _upd==upd_type thenc=0endendlocal mymnu=menu[i][j]bgprint(mymnu.w,mymnu.x+scrollx,mymnu.y+scrolly,13) bgprint(mymnu.txt,mymnu.x+scrollx,mymnu.y+scrolly,c) endendendif _upd==upd_type thenlocal mymnu=menu[cury][curx]local txt_bef=sub(typetxt,1,typecur-1)local txt_cur=sub(typetxt,typecur,typecur)local txt_aft=sub(typetxt,typecur+1)txt_cur=txt_cur=="" and " " or txt_cur if (time()*2)%1<0.5 thentxt_cur="\^i"..txt_cur.."\^-i"endlocal txt=txt_bef..txt_cur..txt_aftbgprint(txt,mymnu.x+scrollx,mymnu.y+scrolly,7)end--[[for i=1,#data dofor j=1,#data[i] dobgprint(data[i][j],2+18*j,2+8*i,7)endend]]
endfunction refresh_table()--[[menu={{{txt="hello",cmd="say hello",x=2,y=2}}}]]--menu={}for i=1,#data dolocal lne={}for j=1,#data[i] doadd(lne,{txt=data[i][j],cmd="edit",cmdx=j,cmdy=i,x=-10+14*j,y=-4+8*i,w=" "})endadd(menu,lne)end
end
-->8
--updatefunction update_table()refresh_table()if btnp(⬆️) thencury-=1endif btnp(⬇️) thencury+=1endcury=mid(1,cury,#menu)if btnp(⬅️) thencurx-=1endif btnp(➡️) thencurx+=1endcurx=mid(1,curx,#menu[cury])local mymnu=menu[cury][curx]if mymnu.y+scrolly>110 thenscrolly-=1endif mymnu.y+scrolly<10 thenscrolly+=1endscrolly=min(0,scrolly)if mymnu.x+scrollx>110 thenscrollx-=1endif mymnu.x+scrollx<10 thenscrollx+=1endscrollx=min(0,scrollx)if btnp(❎) thenlocal mymnu=menu[cury][curx]if mymnu.cmd=="edit" then_upd=upd_typetypetxt=tostr(mymnu.txt)typecur=#typetxt+1endend
endfunction upd_type()if key thenif key=="\r" then-- enterlocal mymnu=menu[cury][curx]poke(0x5f30,1)typetxt=tonum(typetxt)if typetxt==nil thentypetxt=0enddata[mymnu.cmdy][mymnu.cmdx]=typetxt_upd=update_tablereturnelseif key=="\b" then--backspaceif typecur>1 thenif typecur>#typetxt thentypetxt=sub(typetxt,1,#typetxt-1)elselocal txt_bef=sub(typetxt,1,typecur-2)local txt_aft=sub(typetxt,typecur)typetxt=txt_bef..txt_aftendtypecur-=1endelseif typecur>#typetxt thentypetxt..=keyelselocal txt_bef=sub(typetxt,1,typecur-1)local txt_aft=sub(typetxt,typecur)typetxt=txt_bef..key..txt_aftendtypecur+=1endendif btnp(⬅️) thentypecur-=1endif btnp(➡️) thentypecur+=1endtypecur=mid(1,typecur,#typetxt+1)
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,file,true)debug[1]="exported!"
end
__gfx__
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
__map__
0000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000