当前位置: 首页 > news >正文

制作一款打飞机游戏24:键盘输入

编辑单元格

我们现在有了一个小编辑器,可以移动光标到不同的单元格之间。现在,我们想创建一个系统,可以编辑单个单元格。我们已经有了一个系统,但那个系统并不完善,因为它只允许你增加或减少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

相关文章:

  • OpenAI最新的4o图像生成模型 gpt-image-1 深度解析:API KEY 获取、开发代码示例
  • 待办事项日历组件实现
  • JAVA设计模式——(七)代理模式
  • 深度探索多模态数据:从声音到图像的奇妙世界
  • C++:继承机制详解
  • 「Java EE开发指南」如何使用MyEclipse的可视化JSF编辑器设计JSP?(一)
  • 【C++基础知识】C++ 模板元编程(Template Metaprogramming, TMP)技术详解
  • 欧拉安装宝塔等,报错Errors during downloading metadata for repository ‘OS‘
  • kaggle配置
  • 基于物联网的智能家居安全防护系统设计
  • WebUI可视化:第5章:WebUI高级功能开发
  • react 常用钩子 hooks 总结
  • WordPress AI 原创文章自动生成插件 24小时全自动生成SEO原创文章 | 多语言支持 | 智能配图与排版
  • Docker安装(Ubuntu22版)
  • 【Java学习日记26】:方法的重载
  • yum包管理器
  • 面试中被问到mybatis与jdbc有什么区别怎么办
  • aws(学习笔记第三十九课) iot-msk-pipeline
  • 设备接入与APP(应用程序)接入华为云iotDA平台的路径元素有哪些不同?
  • ThreadLocal详解与实战指南
  • 商务部:入境消费增长潜力巨大,离境退税有助降低境外旅客购物成本
  • 别让心脏“饿肚子”,心肌缺血全解析
  • 涨价应对关税变化是短期之策,跨境电商塑造新品牌开辟“新蓝海”
  • 习近平在中共中央政治局第二十次集体学习时强调,坚持自立自强,突出应用导向,推动人工智能健康有序发展
  • 农贸美学、业态再构、智能管理,今天的菜市场不止有菜
  • 政治局会议:持续稳定和活跃资本市场