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

制作一款打飞机游戏35:生成系统

今天我们要做的是实现一个非常重要的系统——生成系统。在很多方面,这个系统其实相对容易实现,但围绕它的工具部分将是最复杂的。让我给你们展示一下。

这个生成函数需要三个值:指定要生成的敌人类型、敌人在x轴上的生成位置,以及敌人在y轴上的生成位置。基本上,我们需要创建一个数据库,一个数组的数组,来存储所有这些值,然后将它们全部倒入生成函数中。但是,这里缺少了一个值,那就是时间。我们需要根据一个计划来生成敌人,比如游戏开始后10秒生成一个敌人。

因此,我们需要四个值:时间、敌人类型、x坐标和y坐标。关于时间值,我们不打算使用帧或实际时间,而是使用滚动值。滚动值通常从0开始,随着游戏的进行而增加。我们可以利用这个滚动值来决定何时生成敌人。

实现计划与生成系统

现在,让我们来建立这个系统。我们将创建一个新的数组,命名为schedule,并设置一个变量schedI(计划索引)来记住我们上次生成了哪个敌人。在游戏的更新函数中,我们将检查sked数组中的下一个敌人是否应该根据当前的滚动值被生成。

通过这种方法,我们可以避免每次都要遍历整个计划来找到下一个应该生成的敌人,从而提高效率。当然,我们还需要确保不会超出计划中的敌人数量。

编辑器的需求

虽然这个计划系统本身相对简单,但创建一个用于编辑这个系统的编辑器却是一个巨大的挑战。我们需要一个舒适的编辑器,让我们可以轻松地点击、移动和查看结果。

此外,编辑器还需要能够预览敌人在地图上的位置,以便我们可以确保敌人和背景之间能够协调一致。例如,有些敌人需要被放置在地图的特定位置,并随着背景一起滚动。

编辑器的初步实现

现在,让我们开始创建这个编辑器。首先,我们需要包含生成计划的文件,并加载地图段。然后,我们需要编写代码来绘制地图段,并允许我们通过鼠标滚轮来滚动地图。

在编辑器的初步实现中,我们已经能够加载地图段并绘制它们,但滚动地图的功能还需要进一步调整。我们的目标是让地图能够上下左右滚动,以便我们可以方便地查看和编辑整个地图。

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_table_upd=update_tablemenuitem(1,"export",export)reload(0x0,0x0,0x2000,"cowshmup.p8")reload(0x1000, 0x1000, 0x2000, "cowshmup.p8")curx=1cury=1scrolly=0scrollx=0scroll=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()mscroll=stat(36)_upd()
endfunction dokeys()if stat(30) thenkey=stat(31)if key=="p" thenpoke(0x5f30,1)endelsekey=nilendend
-->8
--drawfunction draw_table()cls(2)for i=1,#mapsegs dolocal segnum=mapsegs[i]local sx=segnum\4*18local sy=segnum%4*8map(sx,sy,0,scroll-((i-2)*64),18,8)end--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 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
-->8
--updatefunction update_table()refresh_table()scroll+=mscroll*8if 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
__gfx__
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
__map__
0000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

相关文章:

  • YOLO视觉模型可视化训练与推理测试工具
  • 分享高德地图获取矢量面的方法和python脚本
  • BI平台是什么意思?一文讲清BI平台的具体应用!
  • 线性微分方程与非线性微分方程
  • Windows查看和修改IP,IP互相ping通
  • 智能机器人在物流行业的应用:效率提升与未来展望
  • 【QT】编写第一个 QT 程序 对象树 Qt 编程事项 内存泄露问题
  • 【SystemC初认识】SystemC是什么?有哪些主要组件?如何简单使用?
  • Java高阶程序员学习计划(详细到天,需有一定Java基础)
  • TimeDistill:通过跨架构蒸馏的MLP高效长期时间序列预测
  • LeRobot 项目部署运行逻辑(四)——control_robot.py
  • 使用 Spring Data Redis 实现 Redis 数据存储详解
  • L35.【LeetCode题解】转置矩阵(C语言)
  • 11.Spring Boot 3.1.5 中使用 SpringDoc OpenAPI(替代 Swagger)生成 API 文档
  • 2025.4.28 Vue.js 学习笔记
  • Rancher 2.6.3企业级容器管理平台部署实践
  • 百家号等新媒体私信入口是否可以聚合到企业微信的客服,如何实现
  • E. Unpleasant Strings【Educational Codeforces Round 178 (Rated for Div. 2)】
  • SpringAI实现AI应用-搭建知识库
  • 核心技能:ArcGIS洪水灾害普查、风险评估及淹没制图
  • 前行中的“模速空间”:要攻克核心技术,也要成为年轻人创业首选地
  • 中央网信办:重点整治违规AI产品、利用AI制作发布谣言等突出问题
  • 是否进行了及时有效处置?伤者情况如何?辽阳市相关负责人就饭店火灾事故答问
  • 华夏幸福:去年营业收入237.65亿元,同比减亏12亿元
  • 媒体:黑话烂梗包围小学生,“有话好好说”很难吗?
  • 夜读丨跷脚牛肉乐翘脚