For my shmup project (bullet hell/danmaku), my first step was to work on the bullet/pattern system because it's related to the core of the gameplay (dodging bullets); and also because it's accountable to the beauty of the game. |
First, I need limits. I decide to handle 128 bullets at a time. New bullets will replace the old one. From my perspective, is not a big deal. Players probably won't notice it. But if it happens, maybe it's because that bullet stays visible too long on the screen, turning arround following a circular path or simply moving too slowly. So, fuck that bullet.
I decide to create a table of bullet objects during the _init() proccess and reuse them instead of creating/deleting every time. It is called object pool
The process: every time I need to shoot a bullet, I select the next bullet object in the pool, If I reach the last one, I loop to the first. Simple.
To do that, I need:
- a list of bullet objects,
- an index for the next bullet index to use
- and a number of max bullet:
bullets={} bullets.next=1 bullets.len=128 |
Notice how the bullets table is used as an indexed list (to store bullets objects) and an object (to store properties).
During the _init() process, I warm up the table by creating all the bullet objects:
for i=1,bullets.len do local b={} bullets[i]=b ...later... -- warmup bullet properties end |
Next, every time I want to shoot a new bullet:
function shoot(...later...) -- get the bullet object local b=bullets[bullets.next] -- increment the next property bullets.next=(bullets.next%bullets.len)+1 ...later... -- setup bullet properties end |
This little code make the .next property goes from 1 to 128 and loop to 1. Remember, tables in lua do not start at 0, but 1.
To draw the bullets:
for i=1,bullets.len do local b=bullets[i] spr(...later...) end |
I'm using a simple for loop here and not a for all() because I need the index for other purpose.
I'm using this technique for every data objects in my shmup game: bullet pattern functions, enemy ship, particles
With a little subtlety for the particles, because the objects are render sequentially, particles would appear stacked on each other. To fix that, when I need to create a new one, I do not increment by 1 but 7:
particles.next=(particles.next+6)%32+1 |
That's all for today, I hope you will use object pooling like crazy for your futur pico8 projects.
[Please log in to post a comment]