Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@mieki256
Last active November 23, 2018 11:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mieki256/2ee0ab8b37e6b81e27b0b02dd861564f to your computer and use it in GitHub Desktop.
Save mieki256/2ee0ab8b37e6b81e27b0b02dd861564f to your computer and use it in GitHub Desktop.
TIC-80 shoot 'em up example No.6
-- title: WCQ No.6 - Worst Cheap Quality Shoot 'em up exapmle No.6 -
-- author: mieki256
-- desc: short description
-- script: lua
scrw,scrh=240,136
-- --------------------
-- sprite class
Sprite={}
Sprite.new=function(_x,_y,_spd,_ang,_hitr,_sprid,_colkey,_cw,_ch)
local ra = math.rad(_ang)
local o={
alive=true,
x=_x,y=_y, spd=_spd, ang=_ang,
dx=_spd * math.cos(ra),
dy=_spd * math.sin(ra),
colli={_x,_y,_hitr},
sprid=_sprid,colkey=_colkey,
flip=0,rot=0,visible=true,t=0
}
o.cw=_cw or 1
o.ch=_ch or 1
o.ox=-(8 * o.cw / 2)
o.oy=-(8 * o.ch / 2)
return setmetatable(o,{__index=Sprite})
end
Sprite.move=function(self)
self.x=self.x+self.dx
self.y=self.y+self.dy
self.colli[1]=self.x
self.colli[2]=self.y
end
Sprite.scrchk=function(self,_w,_h)
local w = _w or (self.cw * 8 / 2)
local h = _h or (self.ch * 8 / 2)
if self.x < -w or scrw + w < self.x or
self.y < -h or scrh + h < self.y then
self.alive=false
end
end
Sprite.update=function(self)
self:move()
self:scrchk()
end
Sprite.draw=function(self)
if not self.visible then return end
spr(self.sprid,
self.x + self.ox, self.y + self.oy,
self.colkey,1,self.flip,self.rot,
self.cw,self.ch)
end
Sprite.hit=function(self,o)
end
Sprite.shot=function(self,o)
end
-- --------------------
-- Player class
Player={}
Player.new=function()
local o={alive=true}
return setmetatable(o,{__index=Player})
end
Player.init=function(self)
self.step = 0
self.x = scrw / 5
self.y = scrh / 2
self.life = 3
self.sprid = 5
self.t = 0
self.dead = false
self.nodamage = 0
self.shott = 0
self.colli={self.x,self.y,1}
end
Player.update=function(self)
if self.step ==0 then
if self.nodamage > 0 then
self.nodamage=self.nodamage-1
end
if self.dead then
-- start dead
self.step=1
self.t=0
self.sprid=32
if self.life > 0 then
self.life=self.life-1
end
sfx(2,"G-2")
-- music(1,-1,-1,false)
else
-- normal
local spd=2.0
local dx,dy=0,0
if btn(0) then dy=-spd end
if btn(1) then dy=spd end
if btn(2) then dx=-spd end
if btn(3) then dx=spd end
if dx~=0 and dy~=0 then
local d=math.cos(math.rad(45))
dx=dx*d
dy=dy*d
end
self.x=self.x+dx
self.y=self.y+dy
self.x=math.min(math.max(self.x,8),scrw-8)
self.y=math.min(math.max(self.y,8),scrh-8)
self.colli[1]=self.x
self.colli[2]=self.y
-- shot
if btnp(4) then self.shott=0 end
if btn(4) and self.shott%7==0 then
local x,y=self.x,self.y
spd=6
table.insert(bullets,Bullet.new(x+10,y,spd,0))
-- table.insert(bullets,Bullet.new(x,y,spd,12))
-- table.insert(bullets,Bullet.new(x,y,spd,-12))
-- table.insert(bullets,Bullet.new(x,y,spd,180))
end
end
elseif self.step==1 then
-- dead effect
self.sprid=32+2*(self.t % 16 // 8)
if self.t>=90 then
self.dead=false
self.step=0
self.nodamage=180
self.sprid=5
end
end
self.shott=self.shott+1
self.t=self.t+1
end
Player.draw=function(self)
if self.step==0 then
if self.nodamage>0 and
(self.nodamage>>2)%2==0 then
return
end
end
spr(self.sprid,self.x-8,self.y-8,
14,1,0,0,2,2)
end
Player.hit=function(self,o)
if self.nodamage<=0 then
self.dead=true
end
end
Player.shot=function(self,o)
end
-- --------------------
-- Bullet class, super class : Sprite
Bullet={}
setmetatable(Bullet,{__index=Sprite})
Bullet.new=function(_x,_y,_spd,_ang)
local o=Sprite.new(_x,_y,_spd,_ang,5,7,0,1,1)
return setmetatable(o,{__index=Bullet})
end
Bullet.update=function(self)
self:move()
self:scrchk()
end
Bullet.shot=function(self,o)
self.alive=false
end
-- --------------------
-- Enemy Bullet class, super class : Sprite
Ebullet={}
setmetatable(Ebullet,{__index=Sprite})
Ebullet.new=function(_x,_y,_spd,_ang,_sprid)
local o=Sprite.new(_x,_y,_spd,_ang,1,14,0,1,1)
o.bsprid=_sprid
return setmetatable(o,{__index=Ebullet})
end
Ebullet.update=function(self)
self:move()
self:scrchk()
self.sprid=self.bsprid+(self.t%10//5)
self.t=self.t+1
end
Ebullet.shot=function(self,o)
self.alive=false
end
function bornEBulletToPlayer(x,y,spd,d)
local dx, dy = player.x - x, player.y - y
local ang=math.deg(math.atan2(dy,dx))
if dx*dx+dy*dy>d*d then
local o = Ebullet.new(x,y,spd,ang,14)
table.insert(ebullets,o)
end
return ang
end
function bornEBullet(x,y,spd,ang)
local o = Ebullet.new(x,y,spd,ang,14)
table.insert(ebullets,o)
end
function bornEBulletLaser(x,y,spd,ang)
local o = Ebullet.new(x,y,spd,ang,144)
table.insert(ebullets,o)
end
function bornDeathBullet(x,y)
if stgpass==0 then return end
local dx, dy = player.x - x, player.y - y
local d=48
if dx*dx+dy*dy<d*d then return end
local spd, ang
spd = 1.2 + 0.2 * stgpass
ang = bornEBulletToPlayer(x,y,spd,48)
if stgpass>=2 then
for i=1,stgpass-1 do
local a=ang+math.random(-20,20)
if a~=ang then bornEBullet(x,y,spd,a) end
end
end
end
-- --------------------
-- Mob enemy class, super class : Sprite
Mob={}
setmetatable(Mob,{__index=Sprite})
Mob.new=function(_x,_y,_spd,_ang)
local o=Sprite.new(_x,_y,_spd,_ang,6,36,14,2,2)
o.shotwait=math.random(30,90)
o.shotwaitnext=90
return setmetatable(o,{__index=Mob})
end
Mob.shot=function(self)
if not self.alive then return end
if self.shotwait <= 0 then
self.shotwait=self.shotwaitnext
bornEBulletToPlayer(self.x,self.y,1.6,80)
end
self.shotwait=self.shotwait-1
end
Mob.update=function(self)
if not self.alive then return end
self:move()
self:scrchk(32,32)
self:shot()
self.t=self.t+1
end
Mob.hit=function(self,o)
self.alive=false
addScore(10)
bornExplo(self.x,self.y)
bornDeathBullet(self.x,self.y)
end
-- --------------------
-- MobA enemy class, super class : Mob
MobA={}
setmetatable(MobA,{__index=Mob})
MobA.new=function(_x,_y,_spd,_ang,_r)
local o=Mob.new(_x,_y,_spd,180)
o.sprid=1
o.by=_y
o.ang=_ang
o.r=_r
o.shotwaitnext=180
return setmetatable(o,{__index=MobA})
end
MobA.update=function(self)
if not self.alive then return end
self.x=self.x+self.dx
self.y=self.by+self.r*math.sin(math.rad(self.ang))
self.colli[1]=self.x
self.colli[2]=self.y
self.ang=(self.ang+3.5)%360
if self.x<-32 then self.alive=false end
self:shot()
self.t=self.t+1
end
-- --------------------
-- MobB enemy class, super class : Mob
MobB={}
setmetatable(MobB,{__index=Mob})
MobB.new=function(_x,_y,_spd,_ang)
local o=Mob.new(_x,_y,_spd,_ang)
o.sprid=38
return setmetatable(o,{__index=MobB})
end
MobB.update=function(self)
if not self.alive then return end
local tx,ty,d,dd
tx = player.x - self.x
ty = player.y - self.y
d = self.dx * ty - self.dy * tx
dd = 0
if d > 0 then dd = 2
elseif d < 0 then dd = -2 end
if dd ~= 0 then
self.ang = (self.ang + dd) % 360
end
local ra = math.rad(self.ang)
self.dx = self.spd * math.cos(ra)
self.dy = self.spd * math.sin(ra)
self:move()
self:scrchk(32,32)
self:shot()
self.t=self.t+1
end
-- --------------------
-- MobC enemy class, super class : Mob
MobC={}
setmetatable(MobC,{__index=Mob})
MobC.new=function(_x,_y)
local o=Mob.new(_x,_y,0,0)
o.sprid=40
o.dx=8.0
o.ax=0.135
local tt=o.dx/o.ax
local yd=(scrh/2)+((scrh/2)-o.y)
o.dy = (yd - o.y) / (tt * 2)
o.shotwait = tt - 30
return setmetatable(o,{__index=MobC})
end
MobC.update=function(self)
if not self.alive then return end
self.dx=self.dx-self.ax
self.flip = (self.dx >= 2.5) and 0 or 1
self:move()
self:scrchk(32,32)
self:shot()
self.t=self.t+1
end
-- --------------------
-- Middle boss class
Midboss={}
Midboss.new=function(_x,_y,_tx,_ty)
local o={
alive=true,x=_x,y=_y,dx=0,dy=0,
tx=_tx,ty=_ty,
step=0,t=0,shott=0,
colli={_x,_y,15},
sprid=64,hp=15,
dmgeff=0,dmgox=0,dmgoy=0
}
return setmetatable(o,{__index=Midboss})
end
Midboss.update=function(self)
if self.step==0 then
-- enter the stage
local xd,yd
xd=self.tx-self.x
yd=self.ty-self.y
self.dx=xd*0.05
self.dy=yd*0.05
if self.t >= 60 then
self.step=1
self.t=0
self.shott=0
end
elseif self.step==1 then
-- shot
local tt = self.shott % 60
if tt<20 then
if tt%4==0 then
bornEBullet(self.x-4*8,self.y,4,180)
end
elseif tt==30 then
for i=0,6 do
bornEBullet(self.x-4*8,self.y,2,180+12*(-3+i))
end
end
self.shott = self.shott + 1
if self.t>=60*4 then
self.step=2
end
elseif self.step==2 then
-- exit move
self.dx=math.max(self.dx-0.02, -3)
if self.x<-4*8 then self.alive=false end
end
self.x=self.x+self.dx
self.y=self.y+self.dy
self.colli[1]=self.x
self.colli[2]=self.y
self.t=self.t+1
if self.dmgeff>0 then
self.dmgox=math.random(-2,2)
self.dmgoy=math.random(-2,2)
self.dmgeff=self.dmgeff-1
else
self.dmgox=0
self.dmgoy=0
end
end
Midboss.draw=function(self)
local x,y
x = self.x-32 + self.dmgox
y = self.y + self.dmgoy
spr(self.sprid,x,y-16,14,1,0,0,8,2)
spr(self.sprid,x,y,14,1,2,0,8,2)
end
Midboss.hit=function(self,o)
self.hp=self.hp-1
self.dmgeff=5
if self.hp<=0 then
self.alive=false
addScore(200)
bornExplo(self.x, self.y, 48)
bornExplo(self.x, self.y, 32)
bornDeathBullet(self.x,self.y)
end
end
Midboss.shot=function(self,o)
end
-- --------------------
-- Stage1 Boss class
Stg1boss={}
Stg1boss.new=function(_x,_y)
local o={
alive=true,step=0,t=0,
x=_x,y=_y,dx=-1,dy=0,bx=0,by=0,
sprid=102,visible=true,
colli={_x,_y,28},
dmgox=0,dmgoy=0,dmgeff=0,
hpmax=100
}
o.hp=o.hpmax
-- arms init
o.armsr={}
o.armsl={}
local n=12
for i=1,n do
local col, cor
if i==n then
cor={sprid=96,w=4,h=2,x=0,y=0,ang=270,r=8,ox=-24,oy=-8}
col={sprid=96,w=4,h=2,x=0,y=0,ang= 90,r=8,ox=-24,oy=-8}
elseif i==1 then
cor={sprid=149,w=1,h=1,x=0,y=0,ang=270,r=8,ox=-4,oy=-4}
col={sprid=149,w=1,h=1,x=0,y=0,ang= 90,r=8,ox=-4,oy=-4}
else
cor={sprid=149,w=1,h=1,x=0,y=0,ang=270,r=5,ox=-4,oy=-4}
col={sprid=149,w=1,h=1,x=0,y=0,ang= 90,r=5,ox=-4,oy=-4}
end
table.insert(o.armsr,cor)
table.insert(o.armsl,col)
end
return setmetatable(o,{__index=Stg1boss})
end
Stg1boss.armsUpdate=function(self,arms,px,py,v,ba)
if self.step<=1 then
local a=(t * 2) % 360
local d = v * math.sin(math.rad(a))
arms[1].ang = ba + d * 1.5
local pa=arms[1].ang
for i,o in ipairs(arms) do
o.ang = pa - (v/5) * math.sin(math.rad((a+30) % 360))
pa = o.ang
end
if self.step==1 and self.t % 13 == 0 then
local x,y
x=arms[#arms].x-24
y=arms[#arms].y
bornEBulletLaser(x,y,2,180)
end
end
for i,o in ipairs(arms) do
local x,y,ra
ra = math.rad(o.ang)
x = px + o.r * math.cos(ra)
y = py + o.r * math.sin(ra)
o.x, o.y = x, y
px, py = x, y
end
end
Stg1boss.bornShot=function(self)
local x,y,a,d
x = self.x - 20
y = self.y
d = 90 / 6
for i=0,6 do
a = 180 - d * 3 + d * i
bornEBullet(x,y,2.5,a)
end
end
Stg1boss.update=function(self)
if self.step==0 then
self.x=self.x+self.dx
self.y=self.y+self.dy
if self.x<=scrw-4-32 then
self.dx=0
self.dy=0
self.bx=self.x
self.by=self.y
self.t=0
self.step=1
end
elseif self.step==1 then
-- attack
self.x = math.floor(self.bx - 24*math.sin(math.rad((self.t*3)%360)))
self.y = math.floor(self.by + (scrh/2-8)*math.sin(math.rad((self.t*2)%360)))
if self.t % 110 == 0 then
self:bornShot()
end
if self.dmgeff > 0 then
local r=2
self.dmgox=math.random(-r,r)
self.dmgoy=math.random(-r,r)
self.dmgeff=self.dmgeff-1
else
self.dmgox=0
self.dmgoy=0
end
elseif self.step==2 then
-- dead demo
local r=5
self.dmgox=math.random(-r,r)
self.dmgoy=math.random(-r,r)
if self.t%2==0 then
local x,y
r=32
x=self.x+math.random(-r,r)
y=self.y+math.random(-r,r)
bornExploFg(x,y,16)
if self.t%10==0 then
local sfxpat={"G-1","B-2","C-3"}
sfx(1,sfxpat[math.random(1,3)])
end
end
if self.t>=60*3 then
self.alive=false
bornExploFg(self.x, self.y, 128)
music(4,0,-1,false)
stgclrfg=true
end
end
self.colli[1]=self.x
self.colli[2]=self.y
local px,py
px,py = self.x-22, self.y-23
self:armsUpdate(self.armsr,px,py,90,180)
px,py = self.x-22, self.y+23-1
self:armsUpdate(self.armsl,px,py,-90,180)
self.t=self.t+1
end
Stg1boss.armsDraw=function(self,_arms,_ox,_oy)
local x,y
for i,o in ipairs(_arms) do
x = o.x + o.ox + _ox
y = o.y + o.oy + _oy
spr(o.sprid,x,y,14,1,0,0,o.w,o.h)
end
end
Stg1boss.draw=function(self)
if self.visible then
-- draw body
local x,y
x=self.x-4*8+self.dmgox
y=self.y+self.dmgoy
spr(self.sprid,x,y-4*8,14,1,0,0,8,4)
spr(self.sprid,x,y,14,1,2,0,8,4)
-- draw arm
self:armsDraw(self.armsr,self.dmgox,self.dmgoy)
self:armsDraw(self.armsl,self.dmgox,self.dmgoy)
end
if self.hp > 0 then
local x,y,w,c
y = 8
w = print("BOSS:",2,y)
x = w + 4
w = (scrw / 2) - w - 4
rect(x,y,w,5,2)
w = (w-2) * self.hp / self.hpmax
c=(self.hp > self.hpmax * 0.2) and 15 or 6
rect(x+1,y+1,w,3,c)
end
end
Stg1boss.hit=function(self,o)
if self.step~=1 then return end
if self.hp<=0 then return end
self.hp=self.hp-1
self.dmgeff=5
if self.hp<=0 then
addScore(1000)
self.dy=0
self.t=0
self.step=2
music()
clearEBullets()
end
end
Stg1boss.shot=function(self,o)
end
-- --------------------
-- Explosion effect class
Explosion={}
Explosion.new=function(_x,_y,_r)
local o={
alive=true,x=_x,y=_y,t=0,
cols={15,15,9,6,0},
sfxpat={"G-3","B-3","C-3"}
}
o.r = _r or 20
o.br = o.r
o.pos={}
return setmetatable(o,{__index=Explosion})
end
Explosion.update=function(self)
local x,y,r,c,rr
self.r=self.r-1
c = self.cols[self.t % (#self.cols) + 1]
rr = math.floor(math.max(self.br*0.4, 6))
self.pos={}
for i=1,3 do
x = self.x + math.random(-rr,rr)
y = self.y + math.random(-rr,rr)
r = math.max(2, self.r / i)
-- c = self.cols[(self.t + i - 1) % (#self.cols) + 1]
table.insert(self.pos,{x,y,r,c})
end
if self.r<3 then self.alive=false end
self.t=self.t+1
end
Explosion.draw=function(self)
local x,y,r,c
for i=1,3 do
x=self.pos[i][1]
y=self.pos[i][2]
r=self.pos[i][3]
c=self.pos[i][4]
circ(x,y,r,c)
end
end
function bornExplo(_x,_y,_r)
local sfxpat={"C-4","E-3","C-5"}
sfx(1,sfxpat[math.random(1,#sfxpat)])
local o=Explosion.new(_x,_y,_r)
table.insert(effects,o)
end
function bornExploFg(_x,_y,_r)
local o=Explosion.new(_x,_y,_r)
table.insert(effects_fg,o)
end
-- --------------------
-- star
Star={}
Star.new=function(_x,_y,_spd,_id)
local o={x=_x,y=_y,spd=_spd,sprid=1}
o.sprid = 44 + _id
return setmetatable(o,{__index=Star})
end
Star.update=function(self)
self.x = self.x - self.spd
if self.x <= -8 then self.x = self.x + scrw end
end
Star.draw=function(self)
spr(self.sprid,self.x,self.y,0,1,0,0,1,1)
end
function initStar()
local tbl={1.6, 0.8, 0.4, 0.2}
for y=8,scrh-1,1 do
local x,id,spd
x = math.random(0,scrw)
id = math.random(1,#tbl)
spd = tbl[id]
-- id = (id - 1) % 4
id = math.random(0,3)
table.insert(stars,Star.new(x,y,spd,id))
end
end
-- --------------------
function objsUpdate(objs)
for i,o in ipairs(objs) do
o:update()
end
end
function objsDraw(objs)
for i,o in ipairs(objs) do
o:draw()
end
end
function objsRemove(objs)
local l=#objs
for i=l,1,-1 do
if not objs[i].alive then
table.remove(objs,i)
end
end
end
-- --------------------
-- Enemy generator
EnemyGenerator={}
EnemyGenerator.new=function()
local o={}
o.pnt=1
o.cbx=0
o.bx=o.cbx
return setmetatable(o,{__index=EnemyGenerator})
end
EnemyGenerator.init=function(self)
self.pnt = 1
self.bx = self.cbx
end
EnemyGenerator.update=function(self)
local e, tt
e=enemytbl[self.pnt]
tt=e[1]
while tt <= self.bx do
local kind=e[2]
if kind==-2 then break end
if kind==-1 then
self:init()
break
end
if tt > self.cbx then
if kind==0 then
local x,y,spd,ang
x,y,spd,ang=e[3],e[4],e[5],e[6]
local o=Mob.new(x,y,spd,ang)
table.insert(enemys,o)
elseif kind==1 then
local o=MobA.new(e[3],e[4],e[5],e[6],e[7])
table.insert(enemys,o)
elseif kind==2 then
local o=MobB.new(e[3],e[4],e[5],e[6])
table.insert(enemys,o)
elseif kind==3 then
local o=MobC.new(e[3],e[4])
table.insert(enemys,o)
elseif kind==4 then
local o=Midboss.new(e[3],e[4],e[5],e[6])
table.insert(enemys,o)
elseif kind==5 then
local o=Stg1boss.new(e[3],e[4])
table.insert(enemys,o)
end
end
self.pnt=self.pnt+1
if self.pnt>#enemytbl then
self:init()
break
end
e=enemytbl[self.pnt]
tt=e[1]
end
self.bx=self.bx+1
end
enemytbl_dev={
{20,5,scrw+32+64,scrh/2},
{40,-2}
}
enemytbl={
-- Mob
{20+0*20,0,256,8,1.5,157},
{20+1*20,0,256,128,1.5,-157},
{20+2*20,0,256,28,1.8,164},
{20+3*20,0,256,108,1.8,-164},
{20+4*20,0,256,48,2.0,172},
{20+5*20,0,256,88,2.0,-172},
{20+6*20,0,256,68,2.0,180},
-- MobA
{260+0*12,1,252,68,0.9,0,45},
{260+1*12,1,252,68,0.9,0,45},
{260+2*12,1,252,68,0.9,0,45},
{260+3*12,1,252,68,0.9,0,45},
{260+4*12,1,252,68,0.9,0,45},
{260+5*12,1,252,68,0.9,0,45},
-- MobA
{420+0*12,1,252,98,0.9,0,45},
{420+1*12,1,252,98,0.9,0,45},
{420+2*12,1,252,98,0.9,0,45},
{420+3*12,1,252,98,0.9,0,45},
{420+4*12,1,252,98,0.9,0,45},
{420+5*12,1,252,98,0.9,0,45},
-- MobB
{550+0*20,2,248,16,1.3,180},
{550+0*20,2,248,120,1.3,180},
{550+2*20,2,248,16,1.3,180},
{550+2*20,2,248,120,1.3,180},
-- MobC
{730+0*30,3,-8,8},
{730+1*30,3,-8,20},
{730+2*30,3,-8,32},
-- MobC
{900+0*30,3,-8,scrh-8},
{900+1*30,3,-8,scrh-20},
{900+2*30,3,-8,scrh-32},
-- Midboss
{1100+0*180,4,scrw-32-64,-16,scrw-32-8,(scrh/2)-16},
{1100+1*180,4,scrw-32-64,scrh+16,scrw-32-8,(scrh/2)+16},
-- Mob
{1500+0*8,0,8+5*40,144,1.2,270},
{1500+1*8,0,8+4*40,144,1.2,270},
{1500+2*8,0,8+3*40,144,1.2,270},
{1500+3*8,0,8+2*40,144,1.2,270},
{1500+4*8,0,8+1*40,144,1.2,270},
-- Mob
{1500+6*8,0,20+5*40,-8,1.5,90},
{1500+7*8,0,20+4*40,-8,1.5,90},
{1500+8*8,0,20+3*40,-8,1.5,90},
{1500+9*8,0,20+2*40,-8,1.5,90},
{1500+10*8,0,20+1*40,-8,1.5,90},
{1500+11*8,0,20+0*40,-8,1.5,90},
-- MobA
{1700+0*12,1,252, 30,1.1, 90,30},
{1700+0*12,1,252,106,1.1,270,30},
{1700+1*12,1,252, 30,1.1, 90,30},
{1700+1*12,1,252,106,1.1,270,30},
{1700+2*12,1,252, 30,1.1, 90,30},
{1700+2*12,1,252,106,1.1,270,30},
{1700+3*12,1,252, 30,1.1, 90,30},
{1700+3*12,1,252,106,1.1,270,30},
{1700+4*12,1,252, 30,1.1, 90,30},
{1700+4*12,1,252,106,1.1,270,30},
{1700+5*12,1,252, 30,1.1, 90,30},
{1700+5*12,1,252,106,1.1,270,30},
-- MobB
{1960+0*60,2,-8,16,1.4,0},
{1960+1*60,2,-8,120,1.6,0},
-- Midboss
{2100, 4,scrw-32-64,scrh+16,scrw-32-8,(scrh/2)+16},
{2100+120,2,scrw+8,16,1.2,180},
{2300, 4,scrw-32-64,-16,scrw-32-8,(scrh/2)-16},
{2300+120,2,scrw+8,120,1.2,180},
-- boss
{2600,5,scrw+32+64,scrh/2},
-- stop
{2800,-2}
}
-- --------------------
-- hit check
function hitchkCirc(e,b)
if not next(e.colli) then return false end
if not next(b.colli) then return false end
local x,y,r
x=e.colli[1]-b.colli[1]
y=e.colli[2]-b.colli[2]
r=e.colli[3]+b.colli[3]
if x*x+y*y <= r*r then return true end
return false
end
function hitCheck()
-- enemys with bullet
for i,e in ipairs(enemys) do
if e.alive and next(e.colli) then
for j,b in ipairs(bullets) do
if b.alive and hitchkCirc(e,b) then
e:hit(b)
b:shot(e)
break
end
end
end
end
if player.alive==false or
not next(player.colli) then
return
end
-- enemys with player
for i,e in ipairs(enemys) do
if e.alive and hitchkCirc(player,e) then
player:hit(e)
return
end
end
-- enemy bullets with player
for i,b in ipairs(ebullets) do
if b.alive and hitchkCirc(player,b) then
player:hit(b)
break
end
end
end
-- --------------------
function initObjsWork()
bullets={}
enemys={}
ebullets={}
effects={}
effects_fg={}
stars={}
eg=EnemyGenerator.new()
initStar()
stgclrfg=false
end
function clearEBullets()
ebullets={}
end
function startGame()
t=0
bx=0
music(2)
end
function addScore(a)
score = score + a
if score > hiscore then
hiscore = score
end
end
function printc(s,y)
local w=print(s,0,-8)
local x=(scrw-w)/2
local sc=0
print(s,x-1,y,sc)
print(s,x+1,y,sc)
print(s,x,y-1,sc)
print(s,x,y+1,sc)
print(s,x,y,15)
end
function title_update()
objsUpdate(stars)
if btnp(5) then
score=0
stgpass=0
startGame()
gamestep=1
end
end
function title_draw()
printc("WCQ No.6",30)
printc("MOVE : CURSOR KEY", 90)
printc("SHOT : Z KEY", 100)
printc("PUSH X KEY TO START", 120)
end
function gamemain_update()
objsUpdate(stars)
eg:update()
hitCheck()
objsUpdate(bullets)
objsUpdate(enemys)
objsUpdate(ebullets)
objsUpdate(effects)
objsUpdate(effects_fg)
player:update()
objsRemove(bullets)
objsRemove(enemys)
objsRemove(ebullets)
objsRemove(effects)
objsRemove(effects_fg)
if stgclrfg then
t=0
gamestep=3
sstep=0
elseif player.life <= 0 then
t=0
music()
gamestep=2
end
bx=bx+1
end
function gamemain_draw()
objsDraw(effects)
objsDraw(bullets)
objsDraw(enemys)
objsDraw(effects_fg)
objsDraw(ebullets)
player:draw()
local s="LIFE: "..player.life
s=s.." SCORE: "..score
s=s.." HI-SCORE: "..hiscore
-- s=s.." e:"..#enemys
-- s=s.." eb:"..#ebullets
print(s,2,2)
end
function gameover_update()
if t >= 150 then
player:init()
initObjsWork()
gamestep=0
end
end
function gameover_draw()
printc("GAME OVER",(scrh / 2 - 8))
end
function stageclear_update()
objsUpdate(stars)
objsUpdate(bullets)
objsUpdate(enemys)
objsUpdate(ebullets)
objsUpdate(effects)
objsUpdate(effects_fg)
player:update()
objsRemove(bullets)
objsRemove(enemys)
objsRemove(ebullets)
objsRemove(effects)
objsRemove(effects_fg)
if sstep==0 then
if #enemys==0 and #effects==0 and #effects_fg==0 then
sstep=1
t=0
end
elseif sstep==1 then
if t>=150 then
stgpass=stgpass+1
initObjsWork()
startGame()
gamestep=1
end
end
end
function stageclear_draw()
if sstep==1 then
printc("STAGE CLEAR",(scrh / 2 - 8))
end
end
-- init
score=0
hiscore=0
t=0
bx=0
gamestep=0
sstep=0
stgclrfg=false
stgpass=0
player=Player.new()
player:init()
initObjsWork()
-- main loop
function TIC()
-- update
if gamestep==0 then title_update()
elseif gamestep==1 then gamemain_update()
elseif gamestep==2 then gameover_update()
elseif gamestep==3 then stageclear_update()
end
-- draw
cls(0)
objsDraw(stars)
gamemain_draw()
if gamestep==0 then title_draw()
elseif gamestep==2 then gameover_draw()
elseif gamestep==3 then stageclear_draw()
end
t=t+1
end
@mieki256
Copy link
Author

sprites.gif

sprites

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment