aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author1029chris <1029chris@gmail.com>2022-02-04 16:12:11 -0800
committer1029chris <1029chris@gmail.com>2022-02-04 16:12:11 -0800
commitf53f66987ade0b3f2811cacbdcf72c474170621e (patch)
treee540e63083db6258d61a18eedc29980cc692b34f
parent39ecc01dba7141bce30292a38eca2f498919fb33 (diff)
Pickups! Camera Shake! sPARKS!! YEAHH!!!
-rw-r--r--background.lua5
-rw-r--r--bullets.lua10
-rw-r--r--enemies.lua52
-rw-r--r--particles.lua14
-rw-r--r--pickups.lua71
-rw-r--r--players.lua42
-rw-r--r--update.lua8
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
diff --git a/update.lua b/update.lua
index 022181d..01847a5 100644
--- a/update.lua
+++ b/update.lua
@@ -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