diff options
| author | 1029chris <1029chris@gmail.com> | 2022-02-04 16:12:11 -0800 |
|---|---|---|
| committer | 1029chris <1029chris@gmail.com> | 2022-02-04 16:12:11 -0800 |
| commit | f53f66987ade0b3f2811cacbdcf72c474170621e (patch) | |
| tree | e540e63083db6258d61a18eedc29980cc692b34f | |
| parent | 39ecc01dba7141bce30292a38eca2f498919fb33 (diff) | |
Pickups! Camera Shake! sPARKS!! YEAHH!!!
| -rw-r--r-- | background.lua | 5 | ||||
| -rw-r--r-- | bullets.lua | 10 | ||||
| -rw-r--r-- | enemies.lua | 52 | ||||
| -rw-r--r-- | particles.lua | 14 | ||||
| -rw-r--r-- | pickups.lua | 71 | ||||
| -rw-r--r-- | players.lua | 42 | ||||
| -rw-r--r-- | update.lua | 8 |
7 files changed, 165 insertions, 37 deletions
diff --git a/background.lua b/background.lua index 6965774..8393ad3 100644 --- a/background.lua +++ b/background.lua @@ -28,14 +28,15 @@ end function drawbg() cls(0) - + camera((sin(shake+t())*shake)/3, (sin(shake+t()/2.1)*shake)/3) --clouds scrollingcircles(-9, 24, 22, 22, 4) scrollingcircles(-14, 40, 25, 20, 13) - + camera((sin(shake+t())*shake)/2, (sin(shake+t()/2.1)*shake)/2) --landscape scrollingcircles(110, 72, 25, 20, 14) + camera(sin(shake+t())*shake, sin(shake+t()/2.1)*shake) scrollingcircles(135, 100, 30, 32, 15) end diff --git a/bullets.lua b/bullets.lua index 820f3ef..ea82be7 100644 --- a/bullets.lua +++ b/bullets.lua @@ -3,7 +3,6 @@ bullets = {} function addbullet(x, y, velx, vely, evil, sprite) local bullet = {} - bullet.type = "bullet" bullet.sprite = sprite bullet.evil = evil bullet.x = x @@ -22,6 +21,13 @@ function addbullet(x, y, velx, vely, evil, sprite) end end + function bullet.accurate_collide(object) + if bullet.x+4 >= object.x-2 and bullet.x+4 <= object.x+2+object.w and bullet.y+4 >= object.y-2 and bullet.y+4 <= object.y+object.h+2 and object.inv < 0 then + object:shot() + del(obj, bullet) + end + end + function bullet.update(bullet) --applying velocity bullet.x += bullet.velx @@ -31,7 +37,7 @@ function addbullet(x, y, velx, vely, evil, sprite) if bullet.evil then foreach(players, bullet.collide) elseif bullet.evil == false then - foreach(enemies, bullet.collide) + foreach(enemies, bullet.accurate_collide) end --delete bullet if off screen diff --git a/enemies.lua b/enemies.lua index 0e1df4d..6721a2a 100644 --- a/enemies.lua +++ b/enemies.lua @@ -1,6 +1,8 @@ enemies = {} -function addbasicenemy(x, y, sprite, health) +basicenemysprites = {11, 27, 43, 59} --these are all possible 8x8 basic enemy sprites + +function addbasicenemy(x, y, sprite, health, speed) local enemy = {} enemy.x = x enemy.y = y @@ -10,42 +12,60 @@ function addbasicenemy(x, y, sprite, health) enemy.sprite = sprite enemy.health = health enemy.shootcooldown = 3 + enemy.speed = speed function enemy.draw(enemy) - spr(enemy.sprite, enemy.x, enemy.y, 1,1) + local sprite = enemy.sprite + if flr(sin(time()/5)) ~= 0 then + sprite += 1 + end + spr(sprite, enemy.x, enemy.y, 1,1) end function enemy.shot(enemy) --explode - for i = 1, 4, 1 do - addcircle(enemy.x+rnd(8), enemy.y+rnd(8), -0.5, 0, rnd(8), rnd(1.5)+1, 5) - end - for i = 1, 4, 1 do - addcircle(enemy.x+rnd(8), enemy.y+rnd(8), -0.4, 0, rnd(8), rnd(1)+0.5, 9) - end + explosion(enemy.x, enemy.y) --and reduce health enemy.health -= 1 - if enemy.health <= 0 then - del(enemies, enemy) + end + + function enemy.collide(object) + if enemy.x+4 >= object.x and enemy.x+4 <= object.x+object.w and enemy.y+4 >= object.y and enemy.y+4 <= object.y+object.h and object.inv < 0 then + object:shot() + explosion(enemy.x, enemy.y) + enemy.health -= 2 end end function enemy.update() - enemy.x -= 0.1 - enemy.y += sin(time()/5)*0.1 + enemy.x -= speed + enemy.y += sin(time()/5)*speed enemy.shootcooldown -= 1/60 + foreach(players, enemy.collide) if enemy.shootcooldown < 0 then enemy.shootcooldown = 0.5 + rnd(2) - addbullet(enemy.x-3, enemy.y, -1, 0, true, 38) + addbullet(enemy.x-3, enemy.y, -1, 0, true, 3) end if enemy.x < -8 then del(enemies, enemy) end + if enemy.health <= 0 then + for i = 1, rnd(6)+6, 1 do + addcircle(enemy.x+rnd(8), enemy.y+rnd(8), rnd(4)-2, -rnd(2)-1, 1, 2, rnd({3, 11, 9}), -0.1) + end + if rnd(100) > 95 then + addpickup(enemy.x, enemy.y) + end + if shake < 3 then + shake = 2.5 + end + del(enemies, enemy) + end end add(enemies, enemy) end -addbasicenemy(128, 60, 9, 1) -addbasicenemy(128, 90, 9, 1) -addbasicenemy(128, 20, 9, 1) +addbasicenemy(128, 60, rnd(basicenemysprites), 1, 0.2) +addbasicenemy(128, 90, rnd(basicenemysprites), 1, 0.1) +addbasicenemy(128, 20, rnd(basicenemysprites), 1, 0.1) diff --git a/particles.lua b/particles.lua index 29a8140..38b64ca 100644 --- a/particles.lua +++ b/particles.lua @@ -1,4 +1,5 @@ -function addcircle(x, y, velx, vely, r, time, color) +shake = 0 +function addcircle(x, y, velx, vely, r, time, color, grav) local circle = {} circle.x = x circle.y = y @@ -8,6 +9,7 @@ function addcircle(x, y, velx, vely, r, time, color) circle.time = time circle.t = time circle.col = color + circle.grav = grav function circle.draw(circle) circfill(circle.x, circle.y, circle.r*sin(circle.time/circle.t), circle.col) @@ -15,6 +17,7 @@ function addcircle(x, y, velx, vely, r, time, color) function circle.update(circle) circle.x += circle.velx + circle.vely -= circle.grav circle.y += circle.vely circle.time -= 1/60 if circle.time < 0 then @@ -23,4 +26,13 @@ function addcircle(x, y, velx, vely, r, time, color) end add(obj, circle) +end + +function explosion(x,y) + for i = 1, 4, 1 do + addcircle(x+rnd(8), y+rnd(8), -0.5, 0, rnd(8), rnd(1.5)+1, 5, 0) + end + for i = 1, 4, 1 do + addcircle(x+rnd(8), y+rnd(8), -0.4, 0, rnd(8), rnd(1)+0.5, 9, 0) + end end
\ No newline at end of file diff --git a/pickups.lua b/pickups.lua new file mode 100644 index 0000000..ce09e91 --- /dev/null +++ b/pickups.lua @@ -0,0 +1,71 @@ +local randompickups = {} +pickuptimer = 10 +function randompickups.update() + pickuptimer -= 1/60 + if (pickuptimer < 0) then + pickuptimer = 10 + if rnd(100) > 93 then + addpickup(128, rnd(80)+20) + end + end +end +function randompickups.draw() +end +add(obj, randompickups) + +function addpickup(x, y, type) + local pickup = {} + pickup.x = x + pickup.y = y + pickup.type = type or rnd({"health", "fastshoot", "3shoot"}) + pickup.sprite = 5 + + if (pickup.type == "fastshoot") then + pickup.sprite = 21 + elseif (pickup.type == "3shoot") then + pickup.sprite = 37 + end + + function pickup.collide(player) + if pickup.x+4 >= player.x-4 and pickup.x+4 <= player.x+4+player.w and pickup.y+4 >= player.y-4 and pickup.y+4 <= player.y+player.h+4 then + pickup:affect(player) + for i = 1, 8, 1 do + local color = 8 + if (pickup.type == "fastshoot") then + color = 12 + elseif (pickup.type == "3shoot") then + color = 11 + end + addcircle(pickup.x, pickup.y, sin(i/8), cos(i/8), 2, 0.6, color, 0) + end + del(obj, pickup) + end + end + + function pickup.affect(pickup, player) + if pickup.type == "health" then + player.health = 3 + elseif pickup.type == "fastshoot" then + player.shootspeed = 0.1 + elseif pickup.type == "3shoot" then + player.shoot3 = true + end + end + + function pickup.draw(pickup) + spr(pickup.sprite, pickup.x, pickup.y) + end + + function pickup.update(pickup) + pickup.x -= 0.3 + pickup.y += sin(time()/2)*0.2 + foreach(players, pickup.collide) + if pickup.x < -8 then + del(obj, pickup) + end + end + + add(obj, pickup) +end + +addpickup(120, 60)
\ No newline at end of file diff --git a/players.lua b/players.lua index ae9ee96..a4792ec 100644 --- a/players.lua +++ b/players.lua @@ -16,10 +16,12 @@ function addplayer(sprite, bulletsprite) player.id = playercount player.shootcooldown = 0.0 player.particlecooldown = 0.0 - player.type = "player" + player.shootspeed = 0.25 + player.shoot3 = false function player.draw(player) print(player.health) + --draw a different sprite when moving, and blink when hurt if player.inv < 0 or ceil(player.inv*10%2) == 1 then if (player.ymov == 0) then spr(player.sprite, player.x, player.y) @@ -32,14 +34,14 @@ function addplayer(sprite, bulletsprite) end function player.shot(player) + --when the player is shot, reduce health and make temporarily invincible + --also remove any powerups, shake the screen, and spawn an explosion. player.health -= 1 player.inv = 1 - for i = 1, 4, 1 do - addcircle(player.x+rnd(8), player.y+rnd(8), -0.5, 0, rnd(8), rnd(1.5)+1, 5) - end - for i = 1, 4, 1 do - addcircle(player.x+rnd(8), player.y+rnd(8), -0.4, 0, rnd(8), rnd(1)+0.5, 9) - end + player.shootspeed = 0.25 + player.shoot3 = false + shake = 9 + explosion(player.x, player.y) end function player.update(player) @@ -61,18 +63,24 @@ function addplayer(sprite, bulletsprite) player.x = mid(0, player.x, 120) player.y = mid(0, player.y, 120) - --particles from rockets + --particles from rockets, and smoke/sparks from damage player.particlecooldown -= 1/60 if player.particlecooldown < 0 then - addcircle(player.x-1, player.y, -0.5, 0, 1.5, 0.5, 9) - addcircle(player.x-1, player.y+7, -0.5, 0, 1.5, 0.5, 9) - if (player.health == 1) then - addcircle(player.x+rnd(8), player.y+rnd(8), -0.5, -0.2, rnd(8), rnd(1.5)+1, 5) + addcircle(player.x-1, player.y, -0.5, 0, 1.5, 0.5, 9, 0) + addcircle(player.x-1, player.y+7, -0.5, 0, 1.5, 0.5, 9, 0) + if player.health < 3 then + addcircle(player.x+rnd(8), player.y+rnd(8), -0.5, -0.2, rnd(8), rnd(1.5)+1, 5, 0) + if player.health < 2 then + addcircle(player.x+rnd(8), player.y+rnd(8), rnd(1.5)-0.75, -1.5, 1, rnd(1)+0.5, 9, -0.1) + if ceil(rnd(2)) == 1 then + addcircle(player.x+rnd(8), player.y+rnd(8), -0.4, -0.2, rnd(8), rnd(1)+0.5, 9, 0) + end + end end player.particlecooldown = 0.1 end - --shooting + --shooting after cooldown player.shootcooldown -= 1/60 player.inv -= 1/60 if btn(4, player.id) and player.shootcooldown < 0 then @@ -80,11 +88,15 @@ function addplayer(sprite, bulletsprite) --addcircle(player.x+3, player.y+4, rnd(1)+0.5, rnd(1)-0.5, 1.5, rnd(0.4), 12) --end addbullet(player.x+3, player.y, 2, 0, false, player.bulletsprite) - player.shootcooldown = 0.1 + if player.shoot3 then + addbullet(player.x+3, player.y+3, 2, 0.25, false, player.bulletsprite) + addbullet(player.x+3, player.y-3, 2, -0.25, false, player.bulletsprite) + end + player.shootcooldown = player.shootspeed end end add(players, player) end -addplayer(2, 6)
\ No newline at end of file +addplayer(16, 19)
\ No newline at end of file @@ -1,4 +1,10 @@ updateobjs() +--screenshake math +shake = shake + 0.11 * (0 - shake); +if shake < 1 then + shake = 0 +end +--add another player if they fire if btn(4, 1) and playercount == 0 then - addplayer(18, 22) + addplayer(32, 35) end
\ No newline at end of file |
