I’m working on a 2D shmup, and the idea is that the level continuously scrolls automatically, and your character can move around the screen.
Now, I’m having trouble figuring out how I would implement this and Google hasn’t been any help. Right now I have a scrolling background (the background position is simply decremented for each frame) and the player can move around freely in the window, but how would I go about creating the objects in the level? Would I just use a timer to trigger objects and enemies or is there a way to do it based on the position/width of the background (I’d prefer the second method…But I have no clue how that would be done)?
Since this is a general question and doesn’t really pertain to any of my code that I’ve already written as far as I know, I don’t think I need to include any of it…But I’ll be happy to provide any part of it if needed.
I’d recommend either:
Physical triggers
Simply place a box on your level. When it scrolls partially or completely onto the screen (whichever makes more sense – maybe use both in different cases?), you trigger the event associated with that trigger.
This would be simpler to support in a level editor because the physical nature is inherently very easy to visualize.
Timed events
You basically create a timer object at the beginning of the level, and an ordered queue of events. In your game update loop, peek at the head of the queue. If the trigger time of the item at the head of the queue is less than the current elapsed time, pop the item off the queue and trigger the event.
Timed events would be more generically useful because it would also support non-scrolling level, or non-scrolling portions of levels.
Combination of both
You could also do some sort of combination of these to get the benefits of both styles: Easier visualization/level editing, and supporting non-scrolling sections or time-based events.
Each physical trigger will have its own script queue. When the trigger is hit, a timer is started and an event queue is created. That timer and queue is added to a list of currently running timers and queues.
In your update function, you check all items on the list, and trigger events the same way you did with the timed event queue above. Once a queue is emptied, you remove it from the list of timers/queues.
How to detect that a trigger is on-screen
You should implement scrolling first.
One you have scrolling, calculate the rectangle that matches where the screen is located in your pixel/world coordinate system. This will give you the "bounding box" of the screen.
From here, do an intersection test between your event trigger’s "bounding box" and the screen.
Here is a test to see if there is any overlap between two rectangles. It isn’t order-specific:
If the rects are touching at all, it will return true.
Here is a test to make sure
rect1containsrect2. Order is important:If
rect2is completely contained byrect1(it is completely on-screen), it will return true.How to implement simple timers
Simply get some sort of clock value (could be
SDL_GetTicks), and store that value.To see how long has elapsed since that timer was started, call the function again and subtract. Compare the values with
<to see if the difference is greater than the target time.