制作一款打飛機游戲33:碰撞體編輯

我們設置系統的方式使得編輯碰撞檢測框(即碰撞盒)并不容易。所以,我們的下一步是擴展我們的編輯器,尤其是精靈編輯器,以便我們能夠在編輯器中直接編輯碰撞盒。


編輯碰撞盒

讓我們加載Sprite編輯器。例如,這里的碰撞檢測框實際上并不是一個精靈,而是一個碰撞盒。我們想要給編輯器一些工具,讓它能夠識別并顯示這些碰撞盒。

問題是,我們如何保存這些信息?如果我們只是在編輯器中添加一個菜單項來繪制這個碰撞盒,但當我們導出并重新加載時,這些信息就會丟失。因此,我們需要添加元數據。


元數據是什么?

元數據是關于數據的數據。在我們的案例中,我們有一堆精靈,這些精靈是要加載到游戲中的實際內容。但我們還有關于這些精靈的額外信息,這些信息對編輯器很有用,但在游戲中并不重要。這些額外信息就是元數據的完美候選者。

我們想要編輯器記住這是碰撞盒,并給我們一些好用的工具,但游戲本身并不關心這是否是碰撞盒,游戲有自己的方式來確定這些。


實現元數據

現在,讓我們創建一個名為meta的數組,并在里面存放一些信息。然后,我們將這些信息寫入一個文件。例如,我們可以為每個精靈創建一個對象,包含精靈的名稱和是否是碰撞盒的標識。

當導出時,我們不僅要導出數據文件,還要導出元數據文件。我們可以將其命名為.mspr文件,并將所有這些文本文件放入一個單獨的目錄中。


編輯器和UI更新

接下來,我們需要更新編輯器,以便它能夠顯示和編輯這些元數據。我們將添加一個按鈕,用于切換碰撞盒模式。當該模式開啟時,我們編輯的就不再是精靈本身,而是與該精靈相關聯的碰撞盒。

我們還需要確保在刪除或創建精靈時,相應地刪除或創建關聯的元數據條目。


測試和調整

讓我們測試一下我們的新系統。我們可以為玩家的子彈和敵人創建碰撞盒,并調整它們的大小和位置。通過編輯器,我們可以直觀地看到碰撞盒是如何與精靈疊加的,從而確保它們的位置準確無誤。

pico-8 cartridge // http://www.pico-8.com
version 41
__lua__
function _init()--- customize here ---#include shmup_myspr.txt#include shmup_myspr_meta.txtfile="shmup_myspr.txt"filem="shmup_myspr_meta.txt"arrname="myspr"data=mysprreload(0x0,0x0,0x2000,"cowshmup.p8")------------------------[[meta={}for x=1,#data domobj={}mobj[1]="spr "..xmobj[2]=0meta[x]=mobjend]]--debug={}msg={}_drw=draw_list_upd=update_listmenuitem(1,"export",export)curx=1cury=1scrolly=0scrollx=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
--draw
function draw_edit()-- backgroundfillp(0b11001100001100111100110000110011)rectfill(0,0,127,127,33)fillp(?)line(63,0,63,127,13)line(0,63,127,63,13)fillp()draw_menu()-- draw spriteif selspr thenif meta[selspr][2]>0 thenwrapmspr(meta[selspr][2],63,63)msprc(selspr,63,63)elsewrapmspr(selspr,63,63)endend-- blinking dotif (time()*2)%1<0.5 thenpset(63,63,rnd({8,13,7,15}))end
endfunction draw_list()fillp(0b11001100001100111100110000110011)rectfill(0,0,127,127,33)fillp(?)line(63,0,63,127,13)line(0,63,127,63,13)fillp()draw_menu()-- draw spritelocal mymnu=menu[cury][curx]if mymnu and mymnu.cmdy thenif meta[mymnu.cmdy][2]>0 thenwrapmspr(meta[mymnu.cmdy][2],63,63)msprc(mymnu.cmdy,63,63)elsewrapmspr(mymnu.cmdy,63,63)endendif (time()*2)%1<0.5 thenpset(63,63,rnd({8,13,7,15}))end
endfunction draw_table()cls(2)draw_menu()
endfunction draw_menu()--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)endend-->8
--update
function update_edit()refresh_edit()if btnp(??) thencury-=1endif btnp(??) thencury+=1endcury=(cury-1)%#menu+1cury-=mscrollcury=mid(1,cury,#menu)if cury==1 thencurx=1if btnp(??) thenselspr-=1elseif btnp(??) thenselspr+=1endselspr=mid(1,selspr,#data)	elseif cury==11 thencurx=1elsecurx=2endif btnp(🅾?) then_drw=draw_list_upd=update_listrefresh_list()cury=selsprcurx=1scrolly=0scrollx=0returnendif btnp(?) thenlocal mymnu=menu[cury][curx]if mymnu.cmd=="editval" then_upd=upd_typelocal s=tostr(data[mymnu.cmdy][mymnu.cmdx])if s=="[nil]" or s==nil thens=""endtypetxt=stypecur=#typetxt+1typecall=enter_editelseif mymnu.cmd=="editcol" then_upd=upd_typelocal s=tostr(meta[selspr][2])typetxt=stypecur=#typetxt+1typecall=enter_editcolelseif mymnu.cmd=="delspr" thendeli(data,selspr)deli(meta,selspr)selspr-=1if selspr==0 thenselspr=1end_drw=draw_list_upd=update_listrefresh_list()cury=selsprcurx=1scrolly=0scrollx=0return   endend
endfunction update_list()refresh_list()if btnp(??) thencury-=1endif btnp(??) thencury+=1endcury=(cury-1)%#menu+1cury-=mscrollcury=mid(1,cury,#menu)curx=1local 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=="newline" thenadd(data,{0,0,0,0,0,0})add(meta,{"new",0})elseif mymnu.cmd=="editspr" thenselspr=mymnu.cmdy_upd=update_edit_drw=draw_editscrolly=0scrollx=0refresh_edit()cury=1endend
endfunction 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+1typecall=enter_tableelseif 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-- enter   poke(0x5f30,1)typecall()returnelseif 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
endfunction wrapmspr(si,sx,sy)if si==nil thenbgprint("[nil]",sx-5*2+1,sy-2,14)returnendif myspr[si]==nil thenbgprint("["..si.."]",sx-5*2+1,sy-2,14)returnendlocal ms=myspr[si]if ms[8] then--check for loopsif ms[8]==si thenbgprint("[loop]",sx-6*2+1,sy-2,14)returnelseif checkloop(ms,10) thenbgprint("[loop]",sx-6*2+1,sy-2,14)return   endendendmspr(si,sx,sy)
endfunction checkloop(ms,depth)depth-=1if depth<=0 thenreturn trueendif ms==nil thenreturn trueendif ms[8] thenreturn checkloop(myspr[ms[8]],depth)elsereturn falseend
endfunction mspr(si,sx,sy)local ms=myspr[si]sspr(ms[1],ms[2],ms[3],ms[4],sx-ms[5],sy-ms[6],ms[3],ms[4],ms[7]==1)if ms[7]==2 thensspr(ms[1],ms[2],ms[3],ms[4],sx-ms[5]+ms[3],sy-ms[6],ms[3],ms[4],true)endif ms[8] thenmspr(ms[8],sx,sy)end
endfunction msprc(si,sx,sy)local _x,_y,_w,_h,_ox,_oy,_fx,_nx=unpack(myspr[si])if _fx==2 then_w*=2end--sspr(_x,_y,_w,_h,sx-_ox,sy-_oy,_w,_h,_fx==1)rect(sx-_ox,sy-_oy,sx-_ox+_w-1,sy-_oy+_h-1,rnd({8,14,15}))
endfunction spacejam(n)local ret=""for i=1,n doret..=" "endreturn ret
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)local s="meta=split2d\""for i=1,#meta doif i>1 thens..="|"endfor j=1,#meta[i] doif j>1 thens..=","ends..=meta[i][j]endends..="\""printh(s,filem,true)add(msg,{txt="exported!",t=120})--debug[1]="exported!"
end
-->8
--ui
function refresh_edit()menu={}add(menu,{{txt="< "..selspr.." "..meta[selspr][1].." >",w="",cmd="sprhead",x=2,y=2}})local lab={"  x:","  y:","wid:","hgt:"," ox:"," oy:"," fx:","nxt:"}for i=1,8 dolocal s=tostr(data[selspr][i])if s==nil thens="[nil]"endadd(menu,{{txt=lab[i],w="    ",x=2,y=3+i*7},{txt=s,w=spacejam(#s),cmd="editval",cmdy=selspr,cmdx=i,x=2+16,y=3+i*7}}) endlocal coltxt=meta[selspr][2]==0 and "off" or tostr(meta[selspr][2])add(menu,{{txt="col:",w=spacejam(4),x=2,y=4+9*7},{txt=coltxt,w=spacejam(#coltxt),cmd="editcol",cmdy=selspr,x=19,y=4+9*7}})add(menu,{{txt="delete",w="",cmd="delspr",x=2,y=5+10*7}})
endfunction refresh_list()menu={}for i=1,#data dolocal lne={}local linemax=#data[i]if i==cury thenlinemax+=1  endadd(lne,{txt=i.." "..meta[i][1],w="",cmd="editspr",cmdy=i,x=2,y=-4+6*i})add(menu,lne)endadd(menu,{{txt=" + ",w="   ",cmd="newline",x=2,y=-4+6*(#data+1)+2, }})
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), }})
endfunction enter_table()local mymnu=menu[cury][curx]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_tablerefresh_table()
endfunction enter_edit()local mymnu=menu[cury][curx]local typeval=tonum(typetxt)if mymnu.cmdx==8 thenif typeval!=nil thenif data[mymnu.cmdy][7]==nil thendata[mymnu.cmdy][7]=0endendendif typeval==nil thenif mymnu.cmdx>=7 and mymnu.cmdx==#data[mymnu.cmdy] thendeli(data[mymnu.cmdy],mymnu.cmdx)elsedata[mymnu.cmdy][mymnu.cmdx]=0endelsedata[mymnu.cmdy][mymnu.cmdx]=typevalend _upd=update_editrefresh_edit()
endfunction enter_editcol()local mymnu=menu[cury][curx]local typeval=tonum(typetxt)if typeval==nil or typeval<1 thenmeta[selspr][2]=0elsemeta[selspr][2]=typevalend_upd=update_editrefresh_edit()
end
__gfx__
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
__map__
0000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78766.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78766.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78766.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kotlin和JavaScript的對比

Kotlin和JavaScript有一些相似之處&#xff0c;但也存在顯著的差異&#xff0c;下面從多個方面為你詳細分析&#xff1a; 相似點 1. 語法靈活性 變量聲明&#xff1a;二者在變量聲明上都較為靈活。在JavaScript里&#xff0c;借助var、let和const可以聲明變量。其中&#xf…

生活需要一些思考

總分總 寫文章、做事情、寫郵件、寫信&#xff0c;都是要【總分總】。 先總【因為沒人有耐心一上來就看細節&#xff0c;先總結&#xff0c;別人感興趣才會看分】 然后分【分中包括多個子部分&#xff0c;或子章節、子目標&#xff0c;他們之間層層遞進&#xff0c;最終引出最…

JAVA設計模式——(九)工廠模式

JAVA設計模式——&#xff08;九&#xff09;工廠模式 介紹理解實現ProductFactory測試泛型擴展 應用 介紹 定義一個工廠類的接口&#xff0c;幫助一個實際對象 創建實例&#xff0c;并讓其工廠類的子類決定實例化哪個類。 理解 工廠模式中&#xff0c;必定分為了兩部分&…

Java后端接口調用攔截處理:注解與攔截器的實現

在Java開發中&#xff0c;對后端接口調用進行攔截處理是一種常見的需求&#xff0c;通常用于權限驗證、Token校驗、狀態更新等操作。本文將圍繞 Spring框架的攔截器&#xff08;Interceptor&#xff09;、Spring AOP&#xff08;面向切面編程&#xff09; 和 Spring Security 三…

第14講:科研圖表的導出與排版藝術——高質量 PDF、TIFF 輸出與投稿規范全攻略!

目錄 ?? 前言:導出,不只是“保存”! ?? 一、你需要掌握的導出目標 ??? 二、TIFF / PNG 導出規范(適用于投稿) ?? 三、PDF 矢量圖導出(排版首選) ?? 四、強烈推薦組合:showtext + Cairo ?? 五、多個圖的組合導出技巧 ?? 六、特殊投稿需求處理 ?…

對 FormCalc 語言支持較好的 PDF 編輯軟件綜述

FormCalc是一種專為PDF表單計算設計的腳本語言&#xff0c;主要應用于Adobe生態及SAP相關工具。以下是對FormCalc支持較好的主流軟件及其特點&#xff1a; 1. Adobe LiveCycle Designer 作為FormCalc的原生開發環境&#xff0c;LiveCycle Designer提供最佳支持&#xff1a; …

第二階段:基礎加強階段總體介紹

Java語法的學習筆記 下面放復習的文檔鏈接&#xff0c;如果有需要可以前往下載獲取&#xff0c;這個倉庫還有關于mysql、hadoop、python等的復習部分&#xff0c;并且每個文檔有著對應的代碼部分。文章作為復習使用&#xff0c;更多代碼內容見鏈接如下: https://gitee.com/zha…

大前端開發——前端知識漸變分層講解 利用金字塔原理簡化前端知識體系

Web開發基礎 核心概念 HTML、CSS和JavaScript&#xff1a;Web開發的三大基石&#xff0c;分別負責結構、樣式和行為。 代碼管理&#xff1a;隨著項目規模擴大&#xff0c;需要將代碼拆分成小塊&#xff0c;便于維護。 作用域污染&#xff1a;早期所有代碼共享全局作用域&…

Mixture-of-Experts(MoE)原理與在DeepSeek中的應用

MoE機制簡介 Mixture-of-Experts(MoE,混合專家)是一種“分而治之”的神經網絡架構思想。在MoE模型中,存在多個并行的子網絡,被稱為“專家”。每個專家通常擅長處理特定類型的輸入特征或知識片段。而在模型前向計算時,并非激活所有專家參與運算,而是通過一個專門的門控網…

SpringCloud學習筆記

個人學習進度&#xff1a;視頻跟敲筆記&#xff08;12天&#xff09; 學習視頻&#xff1a;尚硅谷微服務速通&#xff08;7小時左右課程&#xff09; 資源&#xff1a; 1.pdf&#xff1a;微服務pdf&#xff08;課程&#xff09;&#xff1a;https://pan.baidu.com/s/1g_TAuBjQ…

【大模型】Coze AI 智能體工作流從配置到使用實戰詳解

目錄 一、前言 二、工作流介紹 2.1 什么是工作流 2.2 工作流與對話流 2.2.1 兩者區別 2.3 工作流節點介紹 2.3.1 工作流節點說明 2.3.2 開始節點與結束節點 2.4 工作流入口 2.4.1 自定義智能體入口 2.4.2 從資源庫新增工作流 2.5 工作流使用限制 三、工作流配置與使…

Discord多賬號注冊登錄:如何同時管理多個賬戶?

Discord是許多人、特別是游戲玩家和社區管理者的重要溝通工具。隨著用戶需求的增長&#xff0c;越來越多的人開始在Discord上注冊多個賬號進行管理。例如&#xff0c;個人和工作賬號的區分&#xff0c;多個游戲社區的參與&#xff0c;或者通過不同的身份進行更靈活的社交互動。…

前端如何使用Mock模擬數據實現前后端并行開發,提升項目整體效率

1. 安裝 Mock.js npm install mockjs --save-dev # 或使用 CDN <script src"https://cdn.bootcdn.net/ajax/libs/Mock.js/1.0.0/mock-min.js"></script>2. 創建 Mock 數據文件 在項目中新建 mock 目錄&#xff0c;創建 mock.js 文件&#xff1a; // m…

AimRT 從零到一:官方示例精講 —— 二、HelloWorld示例.md

HelloWorld示例 官方倉庫&#xff1a;helloworld 配置文件&#xff08;configuration_helloworld.yaml? &#xff09; 依據官方示例項目結構自行編寫YAML配置文件 # 基礎信息 base_info:project_name: helloworld # 項目名稱build_mode_tags: ["EXAMPLE", &quo…

Tauri 跨平臺開發指南及實戰:用前端技術征服桌面應用(合集-萬字長文)

厭倦了笨重的Electron應用&#xff1f;想要構建體積小、性能高、安全可靠的跨平臺桌面應用&#xff1f;Tauri將是你的不二之選&#xff01;本教程帶你從入門到精通&#xff0c;掌握這個下一代桌面應用開發框架&#xff0c;并通過實戰APK分析工具項目&#xff0c;將理論知識轉化…

【LeetCode 熱題 100】矩陣置零 / 螺旋矩陣 / 旋轉圖像 / 搜索二維矩陣 II

??個人主頁&#xff1a;小羊 ??所屬專欄&#xff1a;LeetCode 熱題 100 很榮幸您能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;歡迎歡迎 ~ 目錄 矩陣矩陣置零螺旋矩陣旋轉圖像搜索二維矩陣 II 矩陣 矩陣置零 矩陣置零 用兩個數組分別標記行和列&#xff0c;判斷…

JavaScript進階(三十一): === 與 == 比較運算符

文章目錄 一、前言二、嚴格相等運算符 ()三、寬松相等運算符 ()四、推薦做法五、特殊情況 一、前言 在 JavaScript 中&#xff0c; 和 都是比較運算符&#xff0c;但它們在比較時有重要區別&#xff1a; 二、嚴格相等運算符 () 不進行類型轉換只有當兩個操作數的值和類型都…

HTML與安全性:XSS、防御與最佳實踐

HTML 與安全性&#xff1a;XSS、防御與最佳實踐 前言 現代 Web 應用程序無處不在&#xff0c;而 HTML 作為其基礎結構&#xff0c;承載著巨大的安全責任。跨站腳本攻擊&#xff08;XSS&#xff09;仍然是 OWASP Top 10 安全威脅之一&#xff0c;對用戶數據和網站完整性構成嚴…

安達發|破解醫療器械多BOM困局:APS生產計劃排產軟件解決方案

在醫療器械設備制造行業&#xff0c;生產計劃與排程&#xff08;Advanced Planning and Scheduling, APS&#xff09;系統的應用至關重要。由于醫療器械行業具有嚴格的法規要求&#xff08;如FDA、ISO 13485&#xff09;、復雜的多級BOM&#xff08;Bill of Materials&#xff…

組件輪播與樣式結構重用實驗

任務一&#xff1a;使用“Swiper 輪播組件”對自行選擇的圖片和文本素材分別進行輪播&#xff0c;且調整對應的“loop”、“autoPlay”“interval”、“vertical”屬性&#xff0c;實現不同的輪播效果&#xff0c;使用Swiper 樣式自定義&#xff0c;修改默認小圓點和被選中小圓…