Moving the enemies

Questions about the LÖVE API, installing LÖVE and other support related questions go here.
Forum rules
Before you make a thread asking for help, read this.
cvirus
Prole
Posts: 24
Joined: Mon Sep 26, 2011 1:48 pm

Re: Moving the enemies

Post by cvirus »

Thanks for this explanation and for the code, i didn´t try it yet, i'm trying to understand it first, but i don't understand this piece of code:

Code: Select all

for i = 1, #ammo do
   ammo[i].x = ammo[i].x + (dt * 300)
end
If you declare ammo = {}, isn't this an empty table? how can i have as enemys as i want?

and this one too

Code: Select all

ammo[#ammo + 1] = { <-- this is like a counter to put in table ammo +1?
         x = playerX, <-- put the bullet in the same coordinates as the player?
         y = playerY
I'm sorry for this silly questions but i' a n00b to game programming.

Thanks
User avatar
tentus
Inner party member
Posts: 1060
Joined: Sun Oct 31, 2010 7:56 pm
Location: Appalachia
Contact:

Re: Moving the enemies

Post by tentus »

cvirus wrote:

Code: Select all

for i = 1, #ammo do
   ammo[i].x = ammo[i].x + (dt * 300)
end
If you declare ammo = {}, isn't this an empty table? how can i have as enemys as i want?
Correct, it's an empty table, or in other words, a table with 0 entries. So that loop will happen a total of 0 times. If we had, say, 5 entries in the table, the loop would happen 5 times. If we had 500 entries, it would happen 500 times. The beauty of #ammo is that we can stick it in and then not worry about it.

To have as many enemies as you want, just extend the concepts we're using for ammo to the enemies.
cvirus wrote:

Code: Select all

ammo[#ammo + 1] = { <-- this is like a counter to put in table ammo +1?
Correct again. So if we have 0 entries in ammo so far, then 0+1=1, so it's like saying ammo[1] = {
cvirus wrote:

Code: Select all

x = playerX, <-- put the bullet in the same coordinates as the player?
Yes, though in practice I would recommend doing something like x = playerX + 10
Kurosuke needs beta testers
cvirus
Prole
Posts: 24
Joined: Mon Sep 26, 2011 1:48 pm

Re: Moving the enemies

Post by cvirus »

So to have a slot of bullets in ammo table a should do something like this to work:

Code: Select all

ammo = {30} <------ or 50 or 300 wrigth?
This way i have 30 shots, but this way when i reach the 30 bullets don't i have to do this?

Code: Select all

If #ammo >=30 then
    #ammo = 0
Does this work?

#ammo or ammo[1] is the same thing? Or #ammo takes all values inside a table?

I get it the part of x = playerX + 10, this way the bullet will be shot in the middle of players image wright?

Thanks again.
User avatar
tentus
Inner party member
Posts: 1060
Joined: Sun Oct 31, 2010 7:56 pm
Location: Appalachia
Contact:

Re: Moving the enemies

Post by tentus »

cvirus wrote:So to have a slot of bullets in ammo table a should do something like this to work:

Code: Select all

ammo = {30} <------ or 50 or 300 wrigth?
No no no. That would make #ammo == 1. #ammo is how many entries are in ammo. It's like this:

Code: Select all

ammo = {}   -- 0 entries
ammo = {   -- 1 entry
   "string"
}
ammo = {   -- 2 entries
   "string",
   1
}
Taking it a step further, entries don't have to be strings or numbers. They can also be tables (each table counts as one entry, regardless of how many entries it has). Like this:

Code: Select all

ammo = {}   -- 0 entries
ammo = {   -- 1 entry
   bullet = {}
}
ammo = {   -- 2 entries
   bullet = {
      "string"
   },
   bullet = {
      1,
      2
   }
}
The code that I posted (in love.keypressed) inserts a table into the ammo table. The subtable contains the values for each bullet: in this case, just an X/Y coordinates. The for loops use those subtable values for updating: ammo.x refers to the X value of whichever subtable you are currently on in the for loop.
Kurosuke needs beta testers
cvirus
Prole
Posts: 24
Joined: Mon Sep 26, 2011 1:48 pm

Re: Moving the enemies

Post by cvirus »

Ok, i think i got it, this piece of code:

Code: Select all

ammo=[#ammo + 1]
is the part that is responsable for increase the number of items inside the table wright?

So I have to do the same at my var maxEnemies i think.

Here is my love file to see what i have done so far.
Attachments
conf.love
(9.16 KiB) Downloaded 74 times
User avatar
tentus
Inner party member
Posts: 1060
Joined: Sun Oct 31, 2010 7:56 pm
Location: Appalachia
Contact:

Re: Moving the enemies

Post by tentus »

cvirus wrote:

Code: Select all

ammo=[#ammo + 1]
is the part that is responsable for increase the number of items inside the table wright?
Yes, it's part of it.
cvirus wrote: So I have to do the same at my var maxEnemies i think.
Not... quite. Replace #maxEnemies with #enemy, and pass a parameter into posEnemy to control how many enemies you want to create and position. Here, attached is what I mean. I also adjusted a few other little things.
Attachments
cvirus.love
(9.15 KiB) Downloaded 261 times
Kurosuke needs beta testers
cvirus
Prole
Posts: 24
Joined: Mon Sep 26, 2011 1:48 pm

Re: Moving the enemies

Post by cvirus »

Hello coders, i have a one more question related to this piece of code:

Code: Select all

for i = 1, #ammo do
   ammo[i].x = ammo[i].x + (dt * 300)
end
I have this code and to clear the items inside so the table doesn t get to big and slow i must clear those items as soon as they get off the screen, right?

so to do that i must:

Code: Select all

if bullet > 480 then
       bullet.visible = false
       table.remove(ammo[#ammo])
   end
Is this way that works?

Thanks
User avatar
Robin
The Omniscient
Posts: 6506
Joined: Fri Feb 20, 2009 4:29 pm
Location: The Netherlands
Contact:

Re: Moving the enemies

Post by Robin »

Code: Select all

table.remove(ammo, #ammo)
or in this case (when you want to remove the last) just:

Code: Select all

table.remove(ammo)
Whether it really is correct depends on the rest of the code, though.
Help us help you: attach a .love.
cvirus
Prole
Posts: 24
Joined: Mon Sep 26, 2011 1:48 pm

Re: Moving the enemies

Post by cvirus »

well, i did this:

instead of ammo i changed to shot, and this works if only i shot once at a time and let the bullet get off the screen, but if i shot more times in a row then it gives an error saying.

attempt to index field '?' (a nil value)

Code: Select all

for i = 1, #shot do
          shot[i].y = shot[i].y + 2  <---- here is when it says that message
          if shot[i].y > 480 then
             shot[i].visible = false
             table.remove(shot)
          end
    end                        
This works fine without the table.remove
User avatar
Robin
The Omniscient
Posts: 6506
Joined: Fri Feb 20, 2009 4:29 pm
Location: The Netherlands
Contact:

Re: Moving the enemies

Post by Robin »

Removing items of a list in a loop causes problems (plus you always remove the last item, instead of the current). Here's how it's usually done:

Code: Select all

    for i = 1, #shot do
          shot[i].y = shot[i].y + 2
          if shot[i].y > 480 then
             shot[i].visible = false
          end
    end
    for i = #shot, 1, -1 do --traverse backwards to remove items without everything going to hell
        if not shot[i].visible then
            table.remove(shot, i)
        end
    end
In this case you might replace it by a single backwards loop. Anyway, this is a tricky thing you always need to keep in minds whenever you remove things in a loop.
Help us help you: attach a .love.
Post Reply

Who is online

Users browsing this forum: Ahrefs [Bot], Bing [Bot] and 7 guests