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

制作一款打飞机游戏36:调度编辑器

我们正在创建一个调度编辑器。嗯,这个名字听起来可能有点奇怪,对吧?但如果你了解射击游戏中的“调度”,那就是敌人出现的时间表。

你可能已经看到了,我们有一个可以滚动的关卡。现在,我想增加一些交互性,希望能够实际编辑这个调度。

创建新的UI模式

首先,我想为地图视图创建一个全新的UI模式。因为现在我们像是在这张表后面画图,但我们不想显示这张表,只想在地图上显示敌人。所以,我将引入一个新的UI模式。

我们将创建一个名为“draw map”的函数,这是地图模式。我想这将是游戏中唯一的模式。然后,我们将把整段代码复制过来放到这里。

接下来,我们需要一个更新函数来刷新地图。我们将在UI标签下创建一个新的函数,叫做“refresh map”,把之前复制的代码放进去,但这次是用来刷新地图的。

现在,我们设置默认的更新和绘制函数为“draw map”和“update map”,然后保存并运行。瞧,这就是编辑器,我们现在可以看到一切,没有额外的UI,这很好。

添加鼠标交互

现在,我想添加更多的元素。首先,我想在编辑器中实现基本的交互,比如点击某个地方创建一个敌人。所以,我想看到鼠标光标。

我们可以使用“stat”函数来检测鼠标的X和Y位置以及哪个按钮被按下了。在Pico-8的wiki上,你可以找到关于鼠标和键盘的详细信息。

我创建了一个名为“do mouse”的函数,用来处理鼠标事件。现在,我可以看到鼠标的位置了,这已经很酷了。

接下来,我想处理鼠标点击事件。我设置了一个变量“CLKL”来表示左键是否被按下,同样地,还有“CLKR”表示右键。我使用“btnp”来检测按钮是否在当前帧被按下,这样我们就可以实现点击效果了。

绘制鼠标光标

现在,我想在屏幕上看到一个鼠标光标。但因为我们正在使用整个精灵表来绘制地图,所以不能直接绘制光标。不过,我可以绘制一个简单的光标。

我画了一个白色的十字作为光标,并且让它可以根据鼠标位置移动。为了让光标更引人注目,我还让它随机闪烁红色和白色。

实现X轴滚动

接下来,我想实现X轴的滚动。这样,当我们移动鼠标时,地图也会跟着滚动。我复制了之前的滚动代码,并做了一些调整,使其基于鼠标位置进行滚动。

现在,当你移动鼠标时,地图会跟着左右滚动,这感觉很棒!

绘制敌人调度

现在,我想在地图上绘制敌人的调度点。我遍历了所有的调度,并在地图上绘制了它们。但因为没有导入精灵,所以我只能用红色矩形来表示。

我发现,这些矩形并没有随着地图的滚动而移动。所以,我调整了代码,将滚动值加到它们的Y位置上。现在,这些矩形会随着地图的滚动而移动了。

精确控制滚动值

为了更精确地控制滚动值,我添加了使用光标键来控制滚动的功能。这样,我们就可以更准确地滚动到想要的位置了。

调整调度显示

最后,我发现之前的调度显示没有考虑到敌人出现的时机。所以,我做了一些调整,使调度点能够正确地显示在地图上,反映敌人出现的时刻和位置。

pico-8 cartridge // http://www.pico-8.com
version 41
__lua__
--show cursor
--move the cursor
--backspacefunction _init()--- customize here ---#include shmup_sched.txtfile="shmup_sched.txt"arrname="sched"data=sched#include shmup_mapsegs.txt----------------------debug={}msg={}_drw=draw_map_upd=update_mapmenuitem(1,"export",export)reload(0x0,0x0,0x2000,"cowshmup.p8")reload(0x1000, 0x1000, 0x2000, "cowshmup.p8")curx=1cury=1scrolly=0scrollx=0scroll=0xscroll=0poke(0x5f2d, 1)endfunction _draw()_drw()if #msg>0 thenbgprint(msg[1].txt,64-#msg[1].txt*2,80,14)msg[1].t-=1if msg[1].t<=0 thendeli(msg,1)end  end-- debug --cursor(4,4)color(8)for txt in all(debug) doprint(txt)end
endfunction _update60()dokeys()domouse()mscroll=stat(36)_upd()
endfunction dokeys()if stat(30) thenkey=stat(31)if key=="p" thenpoke(0x5f30,1)endelsekey=nilendendfunction domouse()mousex=stat(32)mousey=stat(33)if stat(34)==0 thenclkwait=falseendclkl=falseclkr=falseif not clkwait thenif stat(34)==1 thenclkl=trueclkwait=trueelseif stat(34)==2 thenclkl=trueclkwait=true  endendend
-->8
--drawfunction draw_map()cls(2)for i=1,#mapsegs dolocal segnum=mapsegs[i]local sx=segnum\4*18local sy=segnum%4*8map(sx,sy,xscroll,scroll-((i-2)*64),18,8)enddrawcur(mousex,mousey)camera(-xscroll,0)for sch in all(sched) dolocal schx=sch[3]local schy=sch[4]+scroll-sch[1]rectfill(schx,schy,schx+16,schy+16,8)endcamera()debug[1]=scrollendfunction draw_table()cls(2)--spr(0,0,0,16,16)if menu thenfor i=1,#menu dofor j=1,#menu[i] dolocal mymnu=menu[i][j]local c=mymnu.c or 13if i==cury and j==curx thenc=7if _upd==upd_type thenc=0endendbgprint(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 drawcur(cx,cy)local col=rnd({6,7})line(cx,cy-1,cx,cy-2,col)line(cx,cy+1,cx,cy+2,col)line(cx-1,cy,cx-2,cy,col)line(cx+1,cy,cx+2,cy,col)end
-->8
--updatefunction update_map()refresh_map()scroll+=mscroll*8xscroll=mid(0,(mousex-10)/108,1)\-0.0625if btnp(⬇️) thenscroll-=1endif btnp(⬆️) thenscroll+=1 endendfunction update_table()refresh_table()if btnp(⬆️) thencury-=1endif btnp(⬇️) thencury+=1endcury=(cury-1)%#menu+1cury-=mscrollcury=mid(1,cury,#menu)if btnp(⬅️) thencurx-=1endif btnp(➡️) thencurx+=1endif cury<#menu thencurx=(curx-2)%(#menu[cury]-1)+2elsecurx=1endlocal mymnu=menu[cury][curx]if mymnu.y+scrolly>110 thenscrolly-=4endif mymnu.y+scrolly<10 thenscrolly+=4endscrolly=min(0,scrolly)if mymnu.x+scrollx>110 thenscrollx-=2endif mymnu.x+scrollx<20 thenscrollx+=2endscrollx=min(0,scrollx)if btnp(❎) thenlocal mymnu=menu[cury][curx]if mymnu.cmd=="edit" then_upd=upd_typetypetxt=tostr(mymnu.txt)typecur=#typetxt+1elseif mymnu.cmd=="newline" thenadd(data,{0})  elseif mymnu.cmd=="newcell" thenadd(data[mymnu.cmdy],0)endend
endfunction upd_type()if key thenif key=="\r" then-- enterlocal mymnu=menu[cury][curx]poke(0x5f30,1)local typeval=tonum(typetxt)if typeval==nil thenif mymnu.cmdx==#data[mymnu.cmdy] and typetxt=="" then--delete celldeli(data[mymnu.cmdy],mymnu.cmdx)if mymnu.cmdx==1 thendeli(data,mymnu.cmdy)end_upd=update_tablereturnend  typeval=0enddata[mymnu.cmdy][mymnu.cmdx]=typeval_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)add(msg,{txt="exported!",t=120})--debug[1]="exported!"
end
-->8
--uifunction refresh_map()menu={}
endfunction refresh_table()menu={}for i=1,#data dolocal lne={}local linemax=#data[i]if i==cury thenlinemax+=1  endadd(lne,{txt=i,w="   ",cmd="",x=4,y=-4+8*i,c=2  })for j=1,linemax doif j==#data[i]+1 thenadd(lne,{txt="+",w=" ",cmd="newcell",cmdy=i,x=-10+14*(j+1),y=-4+8*i, })elseadd(lne,{txt=data[i][j],cmd="edit",cmdx=j,cmdy=i,x=-10+14*(j+1),y=-4+8*i,w="   "})endendadd(menu,lne)endadd(menu,{{txt=" + ",w="   ",cmd="newline",x=4,y=-4+8*(#data+1), }})
end
__gfx__
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
__map__
0000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

http://www.xdnf.cn/news/3259.html

相关文章:

  • K8S - 命名空间实战 - 从资源隔离到多环境管理
  • 系统升级姿势解锁:绞杀、并行与隐藏开关
  • 拥抱 Kotlin Flow
  • 虚幻商城 Quixel 免费资产自动化入库(2025年版)
  • ArcGIS Pro几个小知识点分享
  • WebRtc09:网络基础P2P/STUN/TURN/ICE
  • 「动态规划::背包」01背包 / AcWing 2(C++)
  • OpenCV 图形API(75)图像与通道拼接函数-----将 4 个单通道图像矩阵 (GMat) 合并为一个 4 通道的多通道图像矩阵函数merge4()
  • 章越科技赋能消防训练体征监测与安全保障,从传统模式到智能跃迁的实践探索
  • Hbuilder 开发鸿蒙应用,打包成 hap 格式(并没有上架应用商店,只安装调试用)
  • 【Vue2】4-开发者工具安装
  • HOW - 经典详情页表单内容数据填充(基于 Antd 组件库)
  • 数据库服务器备份,数据库服备份到另一台服务器的方法有哪些?
  • 普通IT的股票交易成长史--20250430晚
  • python爬虫基础:requests库详解与案例
  • ESP32开发-作为TCP客户端发送数据到网络调试助手
  • 记录idea可以运行但是maven install打包却找不到问题
  • 【网络原理】从零开始深入理解HTTP的报文格式(二)
  • 第四节:权限管理
  • Vue3 Echarts 3D圆柱体柱状图实现教程以及封装一个可复用的组件
  • 仿腾信会议——密码MD5
  • 软件设计师-软考知识复习(1)
  • Deepseek应用技巧-批量生成读书金句
  • SAP 归档 自定义字段目录及归档信息结构
  • 〇 开篇序言
  • 写一个 Java 程序,用于将字符串中的指定子串替换为另一个子串
  • 倒排索引(Inverted Index)详解
  • Git常用指令速查
  • MySQL数据库全面详解:从基础到高级应用
  • 如何设计一个会员码表!唯一索引的使用,字段区分度不高如何处理