Help with multiple "enemies" [Solved]
Forum rules
Before you make a thread asking for help, read this.
Before you make a thread asking for help, read this.
- Leonardo2450
- Prole
- Posts: 15
- Joined: Wed Jul 17, 2019 12:45 am
- Location: Esta xd
Help with multiple "enemies" [Solved]
I am creating a game where one has to eliminate immovable "enemies" so to speak. I need you to tell me how I can create several of them and delete them when they touch the player.
Last edited by Leonardo2450 on Sun Feb 09, 2020 2:29 am, edited 2 times in total.
-Leonardo2450-
[DATA EXPUNGED] Argentinian looking for something to do in his spare time.
[DATA EXPUNGED] Argentinian looking for something to do in his spare time.
-
- Prole
- Posts: 48
- Joined: Fri Jul 05, 2019 2:59 am
Re: Help with multiple "enemies"
How that will look depends a great deal on how you implement those enemies, and on how far you want to go with "deleting" them. If you just want to remove them from play (but keep them in memory), a simple boolean variable that the game looks for when rendering and doing collision detection will suffice:
Where j goes through the whole table of all enemies. Of course, that has some problems if those enemies need to be gone for good. If that's the case, it's best to make use of Lua's table architecture and use the table.remove command on the relevant data entries. Either way, as you can see, you'll probably be wanting to use tables to keep track of data on the enemies! Tables are easy. Here's how you set one up:
That's it. Then you can add to it like this:
Where Foo is the name you're using, obviously. A bunch of aligned tables like this can be very useful for making large arrays of things that all have related functions or code run on them! I suggest you read up on Lua table structures, they are powerful.
Code: Select all
while j <= #enemy_present do
if enemy_present[j] == true then
(your code)
end
j = j + 1
end
Code: Select all
enemy_name = {}
Code: Select all
table.insert(enemy_name, "Foo")
Re: Help with multiple "enemies"
As stated by Sky_Render, there is a lot of ways to implement this and I too recommend reading up on Lua Tables I find using metatables very handy for stuff like this, but that is more advanced and might be confusing if you're new to Lua.
My understanding of your game is similar to games where you move the player around and collect coins that are stationary. Below is some pseudocode.
There are certainly better ways to do it, but this would work. The CheckCollision is only for two rectangles. Other algorithms will be needed for other types of geometry collisions.
My understanding of your game is similar to games where you move the player around and collect coins that are stationary. Below is some pseudocode.
Code: Select all
-- Collision detection function;
-- Returns true if two boxes overlap, false if they don't;
-- x1,y1 are the top-left coords of the first box, while w1,h1 are its width and height;
-- x2,y2,w2 & h2 are the same, but for the second box.
function CheckCollision(x1,y1,w1,h1, x2,y2,w2,h2) -- taken from https://www.love2d.org/wiki/BoundingBox.lua
return x1 < x2+w2 and
x2 < x1+w1 and
y1 < y2+h2 and
y2 < y1+h1
end
function love.load()
enemyType1 = {
-- just a list of important things about your enemy.
-- This example is just dimensions
width = 20,
height = 20
}
enemies = {} -- empty to start here
player = {
x = 150,
y = 150,
width = 50,
height = 50
}
local spawn = 10 -- total number of enemies to spawn
for i = 1, spawn do
-- put new enemies information into table.
table.insert(enemies, {
x = math.random(1, width), -- set coords
y = math.random(1, height),
width = enemyType1.width, -- set dimensions
height = enemyType1.height
})
end
end
function love.update(dt)
for k,v in pairs(enemies) do -- loop through all enemies.
if CheckCollision(player.x, player.y, player.width, player.height, -- pass player info
v.x, v.y, v.width, v.height) then -- pass info about each enemy
table.remove(enemies, k) -- remove the enemy from the list.
end
end
end
function love.draw()
-- draw it how you'd like
end
- Leonardo2450
- Prole
- Posts: 15
- Joined: Wed Jul 17, 2019 12:45 am
- Location: Esta xd
Re: Help with multiple "enemies"
Sky_Render wrote: ↑Sat Feb 08, 2020 3:13 am How that will look depends a great deal on how you implement those enemies, and on how far you want to go with "deleting" them. If you just want to remove them from play (but keep them in memory), a simple boolean variable that the game looks for when rendering and doing collision detection will suffice:
Where j goes through the whole table of all enemies. Of course, that has some problems if those enemies need to be gone for good. If that's the case, it's best to make use of Lua's table architecture and use the table.remove command on the relevant data entries. Either way, as you can see, you'll probably be wanting to use tables to keep track of data on the enemies! Tables are easy. Here's how you set one up:Code: Select all
while j <= #enemy_present do if enemy_present[j] == true then (your code) end j = j + 1 end
That's it. Then you can add to it like this:Code: Select all
enemy_name = {}
Where Foo is the name you're using, obviously. A bunch of aligned tables like this can be very useful for making large arrays of things that all have related functions or code run on them! I suggest you read up on Lua table structures, they are powerful.Code: Select all
table.insert(enemy_name, "Foo")
Thank you very much for your reply. They have really helped me a lot. I'm still learning a lot from this programming language. I started a long time ago but I still have to learn about meta tables and other things. Thank you!JJSax wrote: ↑Sat Feb 08, 2020 6:34 am As stated by Sky_Render, there is a lot of ways to implement this and I too recommend reading up on Lua Tables I find using metatables very handy for stuff like this, but that is more advanced and might be confusing if you're new to Lua.
My understanding of your game is similar to games where you move the player around and collect coins that are stationary. Below is some pseudocode.
There are certainly better ways to do it, but this would work. The CheckCollision is only for two rectangles. Other algorithms will be needed for other types of geometry collisions.Code: Select all
-- Collision detection function; -- Returns true if two boxes overlap, false if they don't; -- x1,y1 are the top-left coords of the first box, while w1,h1 are its width and height; -- x2,y2,w2 & h2 are the same, but for the second box. function CheckCollision(x1,y1,w1,h1, x2,y2,w2,h2) -- taken from https://www.love2d.org/wiki/BoundingBox.lua return x1 < x2+w2 and x2 < x1+w1 and y1 < y2+h2 and y2 < y1+h1 end function love.load() enemyType1 = { -- just a list of important things about your enemy. -- This example is just dimensions width = 20, height = 20 } enemies = {} -- empty to start here player = { x = 150, y = 150, width = 50, height = 50 } local spawn = 10 -- total number of enemies to spawn for i = 1, spawn do -- put new enemies information into table. table.insert(enemies, { x = math.random(1, width), -- set coords y = math.random(1, height), width = enemyType1.width, -- set dimensions height = enemyType1.height }) end end function love.update(dt) for k,v in pairs(enemies) do -- loop through all enemies. if CheckCollision(player.x, player.y, player.width, player.height, -- pass player info v.x, v.y, v.width, v.height) then -- pass info about each enemy table.remove(enemies, k) -- remove the enemy from the list. end end end function love.draw() -- draw it how you'd like end
-Leonardo2450-
[DATA EXPUNGED] Argentinian looking for something to do in his spare time.
[DATA EXPUNGED] Argentinian looking for something to do in his spare time.
- Leonardo2450
- Prole
- Posts: 15
- Joined: Wed Jul 17, 2019 12:45 am
- Location: Esta xd
Re: Help with multiple "enemies"
Sky_Render wrote: ↑Sat Feb 08, 2020 3:13 am How that will look depends a great deal on how you implement those enemies, and on how far you want to go with "deleting" them. If you just want to remove them from play (but keep them in memory), a simple boolean variable that the game looks for when rendering and doing collision detection will suffice:
Where j goes through the whole table of all enemies. Of course, that has some problems if those enemies need to be gone for good. If that's the case, it's best to make use of Lua's table architecture and use the table.remove command on the relevant data entries. Either way, as you can see, you'll probably be wanting to use tables to keep track of data on the enemies! Tables are easy. Here's how you set one up:Code: Select all
while j <= #enemy_present do if enemy_present[j] == true then (your code) end j = j + 1 end
That's it. Then you can add to it like this:Code: Select all
enemy_name = {}
Where Foo is the name you're using, obviously. A bunch of aligned tables like this can be very useful for making large arrays of things that all have related functions or code run on them! I suggest you read up on Lua table structures, they are powerful.Code: Select all
table.insert(enemy_name, "Foo")
Thank you very much for your reply. They have really helped me a lot. I'm still learning a lot from this programming language. I started a long time ago but I still have to learn about meta tables and other things. Thank you!JJSax wrote: ↑Sat Feb 08, 2020 6:34 am As stated by Sky_Render, there is a lot of ways to implement this and I too recommend reading up on Lua Tables I find using metatables very handy for stuff like this, but that is more advanced and might be confusing if you're new to Lua.
My understanding of your game is similar to games where you move the player around and collect coins that are stationary. Below is some pseudocode.
There are certainly better ways to do it, but this would work. The CheckCollision is only for two rectangles. Other algorithms will be needed for other types of geometry collisions.Code: Select all
-- Collision detection function; -- Returns true if two boxes overlap, false if they don't; -- x1,y1 are the top-left coords of the first box, while w1,h1 are its width and height; -- x2,y2,w2 & h2 are the same, but for the second box. function CheckCollision(x1,y1,w1,h1, x2,y2,w2,h2) -- taken from https://www.love2d.org/wiki/BoundingBox.lua return x1 < x2+w2 and x2 < x1+w1 and y1 < y2+h2 and y2 < y1+h1 end function love.load() enemyType1 = { -- just a list of important things about your enemy. -- This example is just dimensions width = 20, height = 20 } enemies = {} -- empty to start here player = { x = 150, y = 150, width = 50, height = 50 } local spawn = 10 -- total number of enemies to spawn for i = 1, spawn do -- put new enemies information into table. table.insert(enemies, { x = math.random(1, width), -- set coords y = math.random(1, height), width = enemyType1.width, -- set dimensions height = enemyType1.height }) end end function love.update(dt) for k,v in pairs(enemies) do -- loop through all enemies. if CheckCollision(player.x, player.y, player.width, player.height, -- pass player info v.x, v.y, v.width, v.height) then -- pass info about each enemy table.remove(enemies, k) -- remove the enemy from the list. end end end function love.draw() -- draw it how you'd like end
-Leonardo2450-
[DATA EXPUNGED] Argentinian looking for something to do in his spare time.
[DATA EXPUNGED] Argentinian looking for something to do in his spare time.
Who is online
Users browsing this forum: Bing [Bot] and 15 guests