制作一款打飞机游戏17:敌人
创建敌人
首先,我们需要一个可以射击的飞船。因此,今天的目标是生成一个敌人。
导入精灵
现在,我需要选择这个帧,然后拖放到这里。制作敌人时,不仅要考虑静态敌人,还要考虑动态敌人,尤其是当屏幕上有很多这样的精灵时,动画会让游戏感觉更生动。
敌人动画
初步设置
现在,让我们把这些精灵导入系统。
敌人行为
创建敌人区域
我想创建一个敌人区域,并添加一个敌人。我们需要设置敌人的X和Y坐标,以及它的速度和动画。
绘制敌人
现在,我们要绘制敌人。关于绘制顺序,我认为让子弹在敌人上方绘制更有意义,因为子弹可能会与敌人相交。
滚动背景问题
当飞船左右移动时,敌人似乎也在移动。问题是我们不仅需要滚动背景,还需要滚动所有敌人以及爆炸等效果。这会让碰撞检测变得更复杂。
敌人动画
动画函数
现在,我想让敌人动画循环播放。我们可以创建一个特定的更新函数来处理敌人的动画。
敌人行为规划
初步移动
现在,敌人可以移动了,但我们需要规划更复杂的敌人行为。比如,让敌人飞进来,停留一秒,然后飞出去。
函数化敌人行为
理想情况下,我们应该将这种行为封装成一个函数,以便可以生成多个敌人,让它们每隔几秒飞进来并飞出去。
function startgame()px,py=64,64spd=1.4lastdir=0shipspr=0scroll=300xscroll=0mapsegi=0cursegs={}boss=falseparts={}shots={}shotwait=0muzz={}enemies={}add(enemies,{x=74,y=16,sani={18,19,20},si=1,sx=0.1,sy=0.2})_upd=upd_game_drw=drw_game
endfunction _draw()_drw()--★cursor(4,4)color(7)for txt in all(debug) doprint(txt)end
endfunction _update60()t+=1_upd()
end-->8
--drawfunction drw_game()for seg in all(cursegs) domap(seg.x,seg.y,xscroll,scroll-seg.o,18,8)endfor p in all(parts) doif p.age>=0 then--animate colorif p.ctab thenp.ctabv=p.ctabv or 0local i=(p.age+p.ctabv)/p.maxagei=mid(1,flr(1+i*#p.ctab),#p.ctab)p.c=p.ctab[i]endp.draw(p)endendfor e in all(enemies) domspr(e.sani[flr(e.si)],e.x+xscroll,e.y)pset(e.x+xscroll,e.y,8)endfor s in all(shots) do mspr(s.sani[flr(s.si)],s.x,s.y)endfor m in all(muzz) do mspr(m.sani[flr(m.si)],px+m.x,py+m.y)end--shipmspr(shiparr[flr(shipspr*2.4+3.5)],px,py)pset(px,py,8)local fframe=flamearr[t\3%4+1]mspr(fframe,px-1,py+8)mspr(fframe,px+2,py+8)debug[1]=scroll
endfunction drw_menu()map(19,8)
end
-->8
--updatefunction doenemies()for e in all(enemies) doe.x+=e.sxe.y+=e.sye.si+=0.1if flr(e.si)>#e.sani thene.si=1endend
end