制作一款打飞机游戏58:子弹模式组合

news2025/7/17 20:14:38

今天我们将继续深入探讨子弹模式系统,并在我们的模式编辑器上做一些收尾工作。

子弹模式系统的乐趣

首先,我想说,这个子弹模式系统真的非常有趣。看着屏幕上不断喷射的子弹,感觉真是太棒了!

合并修饰符

今天,我想添加一个合并修饰符。这个修饰符允许我们将多个子弹模式合并在一起,同时发射。这样,在BOSS战中,我们就可以一次性发射多种不同的子弹,而不是分别发射。我相信这将是一个非常有用的功能。

我将为这个合并修饰符创建一个菜单,并设置五个插槽来组合不同的子弹模式。如果将来需要更多插槽,我们可以随时增加。

实现合并修饰符

现在,让我们来实现这个合并修饰符。我们将遍历所有插槽,如果插槽中的值不为零,就生成对应的子弹模式,并将所有子弹添加到返回数组中。这样,我们就可以在屏幕上看到合并后的子弹效果了。

角度指示器

接下来,我想添加一个角度指示器。当敌人发射子弹时,角度指示器将显示子弹的发射角度,以避免混淆。我们将使用一个简单的公式来计算角度,并绘制一条线来表示子弹的发射方向。

测试新功能

在将新功能添加到游戏中之前,我想先做一个测试运行。在上一期的Doggy Zone中,我给大家布置了一个任务,那就是复制Loki Striker在《Steel Surge》中展示的一个美丽子弹模式。现在,我想亲自尝试一下,看看我们的系统是否足够灵活,能够创造出这样的模式。

创建新子弹模式

通过不断尝试和调整参数,我成功创建了一个类似Loki Striker展示的子弹模式。这个模式由两个螺旋子弹模式叠加而成,每个螺旋由三个子弹组成,部分子弹速度较快,部分较慢。看起来非常酷炫!

pico-8 cartridge // http://www.pico-8.com
version 41
__lua__
-- todo
------------------
-- bring it into the game
-- bring it into brainedit

-- shift?


-- assumptions
------------------
-- bullets don't change direction
-- bullets don't change speed


function _init()
 --- customize here ---
 #include shmup_pats.txt
 file="shmup_pats.txt"
 arrname="pats"
 data=pats

 #include shmup_myspr.txt
 #include shmup_anilib.txt
 ----------------------

 debug={}
 msg={}
 
 _drw=draw_pats
 _upd=update_pats
 
 menuitem(1,"export",export)
 
 reload(0x0,0x0,0x2000,"cowshmup.p8")
 
 curx=1
 cury=1
 scrolly=0
 scrollx=0
 scroll=0
 
 pspr={
  x=64,
  y=110
 }
 
 enspr={
  x=64,
  y=64,
  bulq={}
 }
 
 buls={} 
 
 poke(0x5f2d, 1)
 
 selpat=1

 fireang=-99
end

function _draw()
 _drw()
 
 if #msg>0 then
  bgprint(msg[1].txt,64-#msg[1].txt*2,80,14)
  msg[1].t-=1
  if msg[1].t<=0 then
   deli(msg,1)
  end  
 end
 
 -- debug --
 cursor(4,4)
 color(8)
 for txt in all(debug) do
  print(txt)
 end
end

function _update60()
 dokeys()
 domouse()
 mscroll=stat(36)
 scroll+=0.2
 scroll=scroll%16
 
 _upd()
end

function dokeys()
 if stat(30) then
  key=stat(31)
  if key=="p" then
   poke(0x5f30,1)
  end
 else
  key=nil
 end
 
end

function domouse()
 local oldmousex=mousex
 local oldmousey=mousey
 
 mousex=stat(32)
 mousey=stat(33)
 
 mousemove=false
 if mousex!=oldmousex or oldmousey!=mousey then
  mousemove=true
 end
 
 if stat(34)==0 then
  clkwait=false
 end
 clkl=false
 clkr=false
 if not clkwait then
  if stat(34)==1 then
   clkl=true
   clkwait=true
  elseif stat(34)==2 then
   clkr=true
   clkwait=true  
  end
 end
 
end
-->8
--draw

function draw_pats()
 cls(13)
 
 if flr(scroll)%2==0 then
  fillp(0b0000111100001111.1)
 else
  fillp(0b1111000011110000.1)
 end
 for i=0,7 do
  line(i*16,0,i*16,128,5)
 end
 fillp(▥)
 for i=-1,7 do
  line(0,i*16+scroll,128,i*16+scroll,5)
 end
 fillp()

 --enemy
 line(enspr.x-2,enspr.y-2,enspr.x+2,enspr.y+2,5)
 line(enspr.x-2,enspr.y+2,enspr.x+2,enspr.y-2,5)
 
 local myang=0
 if fireang==-99 then
  myang=atan2(pspr.y-enspr.y,pspr.x-enspr.x)
 end
 line(enspr.x+sin(myang)*8,enspr.y+cos(myang)*8,
      enspr.x+sin(myang)*12,enspr.y+cos(myang)*12,5)
 
 --player
 circ(pspr.x,pspr.y,3,5)

 for s in all(buls) do
  drawobj(s) 
 end
   
 drawmenu()

 bgprint(#buls,3,120,5)

end

function draw_table()
 cls(2)
 --spr(0,0,0,16,16)
 
 drawmemnu()
end

function drawmenu()
	if menu then
		for i=1,#menu do
		 for j=1,#menu[i] do
		  local mymnu=menu[i][j]
		  local c=mymnu.c or 13
		  if i==cury and j==curx then
		   c=7
		   if _upd==upd_type then
		    c=0
		   end
		  end
		  
		  bgprint(mymnu.w,mymnu.x+scrollx,mymnu.y+scrolly,13)   
		  bgprint(mymnu.txt,mymnu.x+scrollx,mymnu.y+scrolly,c) 
		 end
		end
 end
 
	if menui then
		for i=1,#menui do
		 for j=1,#menui[i] do
		  local mymnui=menui[i][j]
		  local c=mymnui.c or 13
		  if i==cury and j==curx then
		   c=7
		   if _upd==upd_type then
		    c=0
		   end
		  end 
		  bgprint(mymnui.w,mymnui.x,mymnui.y,13)   
		  bgprint(mymnui.txt,mymnui.x,mymnui.y,c) 
		 end
		end
 end
 
 if _upd==upd_type then
  local 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 then
   txt_cur="\^i"..txt_cur.."\^-i"
  end
   
  local txt=txt_bef..txt_cur..txt_aft
		bgprint(txt,mymnu.x+scrollx,mymnu.y+scrolly,7)
 end
end


-->8
--update

function update_pats()

 if key=="1" then
  if fireang==-99 then
   fireang=0
  else
   fireang=-99
  end
 end
 
 refresh_pats()
 
 enspr.x=mousex
 enspr.y=mousey
 
 if clkl and selpat<=#pats then
  patshoot(enspr,selpat,fireang)
 end
 dobulq(enspr)
 dobuls(buls)
 
 if btnp(⬆️) then
  cury-=1
 end
 if btnp(⬇️) then
  cury+=1
 end
 cury=mid(1,cury,#menu)
 
 if cury==1 then
  curx=1
  if btnp(⬅️) then
   selpat-=1
  end
  if btnp(➡️) then
   selpat+=1
  end
  selpat=mid(1,selpat,#pats+1)
 elseif cury==2 then
  curx=1
 elseif cury==#menu then
  curx=1
 else
	 curx=2
 end
 
 if btnp(❎) then
  local mymnu=menu[cury][curx]
  if mymnu.cmd=="patedit" then
   _upd=upd_type
   typetxt=tostr(mymnu.txt)
   typecur=#typetxt+1
   callback=enter_pat
   return
  elseif mymnu.cmd=="newpat" then
   add(pats,newpat("base"))
   return
  elseif mymnu.cmd=="delpat" then
   deli(pats,selpat)
   add(msg,{txt="pat deleted!",t=120})

  end
 end
 
 
end

function update_table()
 refresh_table()

 if btnp(⬆️) then
  cury-=1
 end
 if btnp(⬇️) then
  cury+=1
 end
 cury=(cury-1)%#menu+1
 cury-=mscroll
 cury=mid(1,cury,#menu)
 
 if btnp(⬅️) then
  curx-=1
 end
 if btnp(➡️) then
  curx+=1
 end
 if cury<#menu then
  curx=(curx-2)%(#menu[cury]-1)+2
 else
  curx=1
 end
 local mymnu=menu[cury][curx]
 if mymnu.y+scrolly>110 then
  scrolly-=4
 end
 if mymnu.y+scrolly<10 then
  scrolly+=4
 end
 scrolly=min(0,scrolly)
 
 if mymnu.x+scrollx>110 then
  scrollx-=2
 end
 if mymnu.x+scrollx<20 then
  scrollx+=2
 end
 scrollx=min(0,scrollx)
 
 if btnp(❎) then
  local mymnu=menu[cury][curx]
  if mymnu.cmd=="edit" then
   _upd=upd_type
   typetxt=tostr(mymnu.txt)
   typecur=#typetxt+1
   callback=enter_table
  elseif mymnu.cmd=="newline" then
   add(data,{0})  
  elseif mymnu.cmd=="newcell" then
   add(data[mymnu.cmdy],0)
  end
 end
end

function upd_type()
 if key then
  if key=="\r" then
   -- enter
   poke(0x5f30,1)
   callback()
   return
  elseif key=="\b" then
   --backspace
   if typecur>1 then
    if typecur>#typetxt then
	    typetxt=sub(typetxt,1,#typetxt-1)
	   else
			  local txt_bef=sub(typetxt,1,typecur-2)
			  local txt_aft=sub(typetxt,typecur)
			  typetxt=txt_bef..txt_aft
	   end
	   typecur-=1
   end
  else
   if typecur>#typetxt then
    typetxt..=key
   else
		  local txt_bef=sub(typetxt,1,typecur-1)
		  local txt_aft=sub(typetxt,typecur)
		  typetxt=txt_bef..key..txt_aft
   end
   typecur+=1
  end
 end
 
 if btnp(⬅️) then
  typecur-=1
 end
 if btnp(➡️) then
  typecur+=1
 end
 typecur=mid(1,typecur,#typetxt+1)
end
-->8
--tools

function bgprint(txt,x,y,c)
 print("\#0"..txt,x,y,c)
end

function spacejam(n)
 local ret=""
 for i=1,n do
  ret..=" "
 end
 return ret
end

function split2d(s)
 local arr=split(s,"|",false)
 for k, v in pairs(arr) do
  arr[k] = split(v)
 end
 return arr
end

function mysgn(v) 
 return v==0 and 0 or sgn(v)
end

function rndrange(low,high)
 return flr(rnd(high+1-low)+low)
end

function mspr(si,sx,sy)
 local _x,_y,_w,_h,_ox,_oy,_fx,_nx=unpack(myspr[si])
 sspr(_x,_y,_w,_h,sx-_ox,sy-_oy,_w,_h,_fx==1)
 if _fx==2 then
  sspr(_x,_y,_w,_h,sx-_ox+_w,sy-_oy,_w,_h,true)
 end
 
 if _nx then
  mspr(_nx,sx,sy)
 end
end

function cyc(age,arr,anis)
 local anis=anis or 1
 return arr[(age\anis-1)%#arr+1]
end

function drawobj(obj)
 mspr(cyc(obj.age,obj.ani,obj.anis),obj.x,obj.y)
 
 --★
 if coldebug and obj.col then
  msprc(obj.col,obj.x,obj.y)
 end
end

function copylist(org)
 local ret={}
 for k, v in pairs(org) do
  ret[k]=v
 end
 return ret
end
-->8
--i/o
function export()
 local s=arrname.."=split2d\""
 
 for i=1,#data do
  if i>1 then
   s..="|"
  end
  for j=1,#data[i] do
	  if j>1 then
	   s..=","
	  end
	  s..=data[i][j]
  end
 end
 
 s..="\""
 printh(s,file,true)
 add(msg,{txt="exported!",t=120})
 --debug[1]="exported!"
end
-->8
--ui

function refresh_pats()
 menu={}
 if selpat>#pats then
	 add(menu,{
	  {
		  txt="< new pat ",
		  w="          ",
		  cmd="newpat",
		  x=4,
		  y=4,
		  c=13  
	  }
	 })
	 return 
 end
 local mypat=pats[selpat]
 add(menu,{
  {
	  txt="< pat "..selpat.." >",
	  w="    ",
	  cmd="pat",
	  x=4,
	  y=4,
	  c=13  
  }
 })
 
 add(menu,{
  {
	  txt=mypat[1],
	  w="    ",
	  cmd="patedit",
	  cmdy=selpat,
	  cmdx=1,
	  x=4,
	  y=12,
	  c=13  
  }
 })
 
 local mycap={}
 if mypat[1]=="base" then
	 mycap={
	  "spd :",
	  "ani :",
	  "anis:",
	  "col :" 
	 }
 elseif mypat[1]=="some" then
	 mycap={
	  "src :",
	  "perc:"
	 } 
 elseif mypat[1]=="sprd" then
	 mycap={
	  "src :",
	  "from:",
	  "to  :",
	  "ang :",
	  "spd :",
	  "time:",
	  "mirr:"
	 }  
 elseif mypat[1]=="brst" then
	 mycap={
	  "src :",
	  "num :",
	  "ang :",
	  "spd :",
	  "time:"

	 }
 elseif mypat[1]=="comb" then
	 mycap={
	  "src1:",
	  "src2:",
	  "src3:",
	  "src4:",
	  "src5:"
	 } 
 else
  for i=2,#mypat do
   add(mycap,"p"..i..":")
  end
 end
 
 for i=2,#mypat do
	 add(menu,{
		 {
		  txt=mycap[i-1],
		  w="     ",
		  cmd="",
		  cmdy=selpat,
		  cmdx=i,
		  x=4,
		  y=6+i*7,
		  c=13  
	  },
	  {
		  txt=mypat[i],
		  w=spacejam(#tostr(mypat[i])),
		  cmd="patedit",
		  cmdy=selpat,
		  cmdx=i,
		  x=24,
		  y=6+i*7,
		  c=13  
	  }
	 }) 
 end
 
	add(menu,{
	 {
	  txt="delete",
	  w="      ",
	  cmd="delpat",
	  cmdy=selpat,
	  x=4,
	  y=6+#mypat*7+9,
	  c=13  
		}
	})

end

function refresh_table()
 menu={}
 for i=1,#data do
  local lne={}
  local linemax=#data[i]
  if i==cury then
   linemax+=1  
  end
  add(lne,{
	  txt=i,
	  w="   ",
	  cmd="",
	  x=4,
	  y=-4+8*i,
	  c=2  
  })
  for j=1,linemax do
   if j==#data[i]+1 then
			 add(lne,{
			  txt="+",
			  w=" ",
			  cmd="newcell",
			  cmdy=i,
			  x=-10+14*(j+1),
			  y=-4+8*i, 
			 })
		 else
		  add(lne,{
		   txt=data[i][j],
		   cmd="edit",
		   cmdx=j,
		   cmdy=i,
		   x=-10+14*(j+1),
		   y=-4+8*i,
		   w="   "
		  })
   end
  end
  add(menu,lne)
 end
 add(menu,{{
  txt=" + ",
  w="   ",
  cmd="newline",
  x=4,
  y=-4+8*(#data+1), 
 }})
end

function newpat(typ)
 if typ=="base" then
  return {
   "base",
   1,
   11,
   3,
   40
  } 
 elseif typ=="some" then
  return {
   "some",
   1,
   0.5
  }
 elseif typ=="sprd" then
  return {
   "sprd",
   1,
   1,
   1,
   0.1,
   0,
   0,
   0
  }
 elseif typ=="brst" then
  return {
   "brst",
   1,
   1,
   0.5,
   0,
   5
  }
 elseif typ=="comb" then
  return {
   "comb",
   1,
   0,
   0,
   0,
   0
  }
 else
  return {
   typ
  } 
 end

end

function enter_pat()
 local mymnu=menu[cury][curx]
 local typeval=typetxt
 
 if mymnu.cmdx==1 then
  --tricky!!
  if data[mymnu.cmdy][mymnu.cmdx]!=typetxt and typetxt!="" then
   data[mymnu.cmdy]=newpat(typetxt)   
  end
 else
  typeval=tonum(typeval)
  if typeval==nil then
   typeval=0
  end
  data[mymnu.cmdy][mymnu.cmdx]=tonum(typeval)
 end
 _upd=update_pats
end

function enter_table()
 local mymnu=menu[cury][curx]
 local typeval=typetxt
 if typeval==nil or typeval=="" then
  if mymnu.cmdx==#data[mymnu.cmdy] and typetxt=="" then
   --delete cell
   deli(data[mymnu.cmdy],mymnu.cmdx)
   if mymnu.cmdx==1 then
    deli(data,mymnu.cmdy)
   end
   _upd=update_table
   return
  end  
  typeval=0
 end   
 data[mymnu.cmdy][mymnu.cmdx]=typeval
 _upd=update_table
end
-->8
--pats

function dobuls(arr)
 for s in all(arr) do
  s.age+=1
  s.x+=s.sx
  s.y+=s.sy
    
  if s.y<-16 or s.y>130 then
   del(arr,s)
  end
 end
end

function patshoot(en,pat,pang)
 if pang==-99 then
  pang=atan2(pspr.y-en.y,pspr.x-en.x)
 end

 local mybuls=makepat(pat,pang)

 for b in all(mybuls) do
  add(en.bulq,b)
 end
end

function dobulq(en)
 for b in all(en.bulq) do
  if b.wait<=0 then
	  b.x+=en.x
	  b.y+=en.y
	  b.sx=sin(b.ang)*b.spd
	  b.sy=cos(b.ang)*b.spd
   add(buls,b)
   del(en.bulq,b)
  else
   b.wait-=1
  end
 end
end

function makepat(pat,pang)
 local mypat,ret=pats[pat],{}
 local patype,p2,p3,p4,p5,p6,p7,p8=unpack(mypat)
 if patype=="base" then
  add(ret,{
   age=0,
   x=0,
   y=0,
   ang=pang,
   spd=p2,
   ani=anilib[p3],
   anis=p4,
   col=p5,
   wait=0
  })
 elseif patype=="some" then
  if rnd()<p3 then
   ret=makepat(p3,pang)
  end
 elseif patype=="sprd" then
  for i=p3-1,p4-1 do
   for p in all(makepat(p2,pang)) do
    p.spd+=i*p6
    p.wait+=i*p7
    add(ret,p)
    if i>0 and p8>0 then
     local copyp=copylist(p)
     copyp.ang+=i*-p5
     add(ret,copyp)
    end
    p.ang+=i*p5
   end
  end
 elseif patype=="brst" then
  for i=1,p3 do
   local rndw,rnds=flr(rnd(p6)),rnd(p5)
   for p in all(makepat(p2,pang+spread(p4))) do
    p.wait+=rndw
    p.spd+=rnds
    add(ret,p)
   end
  end
 elseif patype=="comb" then
  for i=2,5 do
   if mypat[i]>0 then
    for p in all(makepat(mypat[i],pang)) do
     add(ret,p)
    end
   end
  end
 end
 
 return ret
end

function spread(val)
 return (rnd(2)-1)*val
end

__gfx__
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
__map__
0000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2387781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用新一代达梦管理工具SQLark,高效处理 JSON/XML 数据!

在应用开发领域&#xff0c;JSON/XML数据结构因其灵活性和通用性&#xff0c;成为开发者存储和交换数据的首选。然而&#xff0c;传统管理工具在处理这些半结构化数据时&#xff0c;往往存在可视化效果差、编辑效率低等问题&#xff0c;严重影响开发者的工作效率。 现在&#…

深入了解PyTorch:起源、优势、发展与安装指南

深入了解PyTorch&#xff1a;起源、优势、发展与安装指南 目录 引言PyTorch简介PyTorch的优势 动态计算图直观易用的API强大的社区支持丰富的生态系统高性能与可扩展性 PyTorch的发展历程PyTorch的主要组件 Torch.TensorAutograd自动求导nn模块TorchvisionTorchText和TorchAu…

DeepSeek智能对话助手项目

目录&#xff1a; 1、效果图2、实现代码3、温度和TopK的作用对比 1、效果图 2、实现代码 # import gradio as gr# def reverse_text(text): # return text[::-1]# demogr.Interface(fnreverse_text,inputs"text",outputs"text")# demo.launch(share&q…

浅谈Mysql的MVCC机制(RC与RR隔离级别)

MVCC&#xff08;Multi-Version Concurrency Control&#xff09;多版本并发控制 说这个我们先来了解一下Mysql的隔离级别&#xff0c;因为MVCC和Mysql的隔离级别是有关的。 Mysql默认的隔离级别是RR&#xff08;可重复读&#xff09; 其他的隔离级别是读未提交&#xff08;…

uniapp-商城-72-shop(5-商品列表,购物车实现回顾)

我们通过前面的章节已经将数据添加到了购物车,但实际上购物车的处理还有很多东西需要完成。 我们看看如何将商品添加到购物车。 本文介绍了购物车功能的实现方式,重点讲解了如何将商品添加到购物车以及购物车状态管理的处理机制。主要内容包括:1. 通过Vuex管理购物车状态,包…

MySQL#Select语句执行过程

服务端程序架构 MySQL 是典型的 C/S 架构&#xff0c;即 Client/Server 架构&#xff0c;服务器端程序mysqld。 Select语句执行过程 连接层 客户端和服务器端建立连接&#xff0c;客户端发送 SQL 至服务器端 SQL层 SQL语句处理 查询缓存&#xff1a; 缓存命中该SQL执行结果直…

hbuilder中h5转为小程序提交发布审核

【注意】 [HBuilder] 11:59:15.179 此应用 DCloud appid 为 __UNI__9F9CC77 &#xff0c;您不是这个应用的项目成员。1、联系这个应用的所有者&#xff0c;请求加入项目成员&#xff08;https://dev.dcloud.net.cn "成员管理"-"添加项目成员"&#xff09;…

【数据结构】单链表练习

1.链表的中间节点 https://leetcode.cn/problems/middle-of-the-linked-list/description/ 用快慢指针来解决 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* middleNode(struct ListNode* he…

学习vue3:跨组件通信(provide+inject)

目录 一&#xff0c;关于跨组件通信概述 二&#xff0c;跨组件传值 案例1(爷传孙&#xff09; 三&#xff0c;跨组件传函数 案例2(爷传孙&#xff09; 疑问&#xff1a;孙子传给爷爷是否可行呢&#xff1f; 一&#xff0c;关于跨组件通信概述 之前我们学习了父子组件的传…

【菜狗work前端】小程序加if判断时不及时刷新 vs Web

零、前提&#xff1a; 实现input输入数字不大于10000&#xff08;需要配合typenumber&#xff0c;maxlength5&#xff0c;这里没写&#xff09; 一、探究代码&#xff1a; <input v-model"model1" input"changeModel1" placeholder"请输入拒收件…

TCP 三次握手:详解与原理

无图、长文警告&#xff01;&#xff01;&#xff01;&#xff01; 文章目录 一、引言二、TCP 三次握手的过程&#xff08;一&#xff09;第一次握手&#xff1a;SYN&#xff08;同步序列号&#xff09;&#xff08;二&#xff09;第二次握手&#xff1a;SYN-ACK&#xff08;同…

LabVIEW累加器标签通道

主要展示了 Accumulator Tag 通道的使用&#xff0c;通过三个并行运行的循环模拟不同数值的多个随机序列&#xff0c;分别以不同频率向累加器写入数值&#xff0c;右侧循环每秒读取累加器值&#xff0c;同时可切换查看每秒内每次事件的平均值&#xff0c;用于演示多线程数据交互…

永磁同步电机控制算法--IP调节器

一、基本原理 在电机控制领域&#xff0c;现今普遍使用的是比例-积分(PI)控制器。然而&#xff0c;PI控制器有一些缺点&#xff0c;可能会在某些应用中产生一些问题&#xff0c;例如:一个非常快的响应&#xff0c;也同时具有过大的超调量。虽然设计PI控制器时&#xff0c;可以…

Ubuntu 25.04 锁屏不能远程连接的解决方案

最近安装了一个 Ubuntu 25.04&#xff0c;偶然发现可以通过 windows 自带的 rdp 远程工具进行连接&#xff0c;内心狂喜。此外&#xff0c;还支持启动 VNC 协议&#xff0c;也就是默认支持了 rdp 和 vnc 连接。 看了以下&#xff0c;ubuntu 在用户级别下创建了一个远程桌面服务…

Java 自动装箱和拆箱还有包装类的缓存问题

自动装箱和拆箱就是将基本数据类型和包装类之间进行自动的互相转换。JDK1.5 后&#xff0c; Java 引入了自动装箱(autoboxing)/拆箱(unboxing)。 自动装箱&#xff1a; 基本类型的数据处于需要对象的环境中时&#xff0c;会自动转为“对象”。 我们以 Integer 为例&#xff1a;…

java-jdk8新特性Stream流

一、Stream流 是专业用于对集合或者数组进行便捷操作的。 1.1 Stream流的创建 主要分为Collection&#xff08;List与Set&#xff09;、Map、数组三种创建方式&#xff1a; //1.Collection集合的创建List<String> names new ArrayList<>();Collections.addAll(…

大语言模型 21 - MCP 自动操作 Figma+Cursor 实现将原型转换为代码

MCP 基本介绍 官方地址&#xff1a; https://modelcontextprotocol.io/introduction “MCP 是一种开放协议&#xff0c;旨在标准化应用程序向大型语言模型&#xff08;LLM&#xff09;提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种…

QNAP NEXTCLOUD 域名访问

我是用docker compose方式安装的&#xff0c;虽然不知道是不是这么个叫法&#xff0c;废话不多说。 背景&#xff1a;威联通container station安装了nextcloud和lucky&#xff0c;lucky进行的域名解析和反代 先在想安装的路径、数据存储路径、数据库路径等新建文件夹。再新建…

华为OD机试真题——信道分配(2025B卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

比亚迪“双剑”电池获中汽中心权威认证,堪称“移动安全堡垒”。

在新能源汽车发展中&#xff0c;电池安全是重中之重。比亚迪的刀片电池与闪充刀片电池提前通过电池新国标全项检测&#xff0c;获中汽中心权威认证&#xff0c;堪称“移动安全堡垒”。 传统电池极端条件下易热失控&#xff0c;而刀片电池独特长条形设计&#xff0c;似刀片般&am…