I my thirteenth video of the “Building a Game Development Framework” series, I change things up by using the framework to build a functional Shoot ‘Em Up (Shmup) style game. This project shows how to use the framework in a game development scenario. It focuses on using the framework’s features, such as input handling, movement scripting, and collision detection.
First I update the framework to the latest versions.
- LibGDX 1.12.1: I updated the framework to the latest version of LibGDX.
- LWJGL3 Transition: With newer LibGDX versions, the backend transitions from LWJGL2 to LWJGL3. This requires updating the
DesktopLauncherconfiguration to useLwjgl3ApplicationConfiguration, which changes how window titles, icons, and dimensions are set.
Implementing the Game
I build the player character using the Actor class:
- Movement Constraints: First, I override the
updatemethod to prevent the ship from moving off-screen. TheMovementchecks the X-coordinate and “clamps” it so the ship stops just before hitting the window edges. - Audio Integration: A laser sound effect (created in ChipTone) is triggered whenever the player presses the Space key.
To handle many objects on screen (like hundreds of lasers or falling obstacles), I create the Actor Factory class with Object Pooling:
- The Problem: Creating a new “Laser” object every time the player fires is memory-intensive and can cause lag.
- The Solution (Pooling): The factory maintains a
Queueof pre-created actors. When a laser is needed, it’s pulled from the queue and “reset.” When it leaves the screen, it’s added back to the queue for reuse instead of being deleted.
The game needs a way to spawn enemies or obstacles over time. I made these updates to accomplish that:
- Updatable Interface: A new interface is added for logic that needs to run every frame but doesn’t have a visual sprite (like a “spawner” or “game manager”).
- Randomized Spawning: The
ObstacleFactoryimplementsUpdatable. Every 1 second, it picks a random X-coordinate and spawns a falling block at the top of the screen.
The collision logic between lasers and obstacles utilizes the movement scripts built in the previous video:
- Hit Logic: When a laser hits an obstacle, it doesn’t just disappear. The obstacle’s movement script transitions to an Easing Action, causing it to slow down and changing its color to red (simulating being “destroyed”) before eventually being removed and returned to the pool.
- Collision Filtering: To prevent “ghost” collisions, the obstacle’s
containsmethod is overridden to returnfalseonce it has been destroyed, allowing other lasers to pass through it while it’s in its death animation.
By the end of the video, the user has a playable demo where they can move a ship, fire lasers, and destroy falling obstacles with smooth transitions and efficient memory management.
