A game with a good design enables extensibility and portability with little modifications to the source code. It also enables the easy transformation of the game to multiple game platforms.
Object Oriented Programming has significant design benefits over procedure programming. New procedures developed in Object-oriented Programming can handle the complex problems pertaining to game programming. In this article, we discuss the use of Object-Oriented design patterns in implementing weapons for shooter games.
Weapon Design in Shooter Games
First-person shooter (FPS) games involve interaction between an avatar, ranged weapons, and one or more distant targets or enemies. The shooting devices are modeled on real-world or imaginary objects. Weapons are made to simulate the behavior of real firearms. These have attributes like accuracy, range, magazine, damage, firing modes, and propensity to malfunction. Weapons can have accessories like riflescopes, silencers, laser sighting devices, etc.
Why Use Design Patterns?
The weapons provide the players with seemingly real shooting experiences. Weapon accessories are given out as rewards or upgrades to the game. As such the developers would want the flexibility to add new weapons. A complex game design would require effort and changes to the existing system.
The Factory Method and the Decorator design patterns can be used to resolve this design problem.
- The Factory Method design pattern provides an interface for creating an object. The subclasses decide which particular class to instantiate.
- The Decorator pattern can be used to extend the functionality of the weapon dynamically with additional functions such as an added scope or silencer.
Figure 1: Class Diagram - Factory Method and Decorator patterns in FPS game design
Understanding the Class Diagram
- The WeaponFactory class is an abstract class.
- Concrete classes like ShotGunFactory, M16Factory implement WeaponFactory. These represent different weapon types.
- The Weapon class is an abstract class.
- Concrete classes like HandGun, ShotGun extend the Weapon class. The added functions are display (), fire (). These classes provide the core functionality. These can be instantiated to create weapon objects.
- The WeaponFactory objects can create Weapon objects specific to the weapon type. For instance, the M16Factory object creates a M16 Weapon object.
- The Decorator class conforms to the interface of the Weapon class and provides extended functionality. It also maintains a reference to Weapon object. An unlimited number of decorator “layers” can be added to the core weapon object.
The Decorator pattern allows for added responsibilities to an object. Let us look at how an assault gun can be added with “decorations” to improve accuracy, add silencer support, and more power to the gun.
In the example of a machine gun design, we define the abstract class MachineGun and the concrete classes StandardMachineGun and GunAccessory. The StandardMachineGun class provides the core functionality. The GunAccessory class follows the Decorator design pattern and provides additional functionality.
Figure 2: Class Diagram- Use of Decorator pattern for Weapon design.
Implementing the Decorator Pattern
- We implement a single core component. There are several optional decorations with a common interface.
- All classes inherit from the common interface (MachineGun). This makes the classes interchangeable.
- The Decorator (GunAccessory) base class is added for the optional functionality classes.
- The Core concrete class (StandardMachineGun) and Decorator (GunAccessory) class inherit the common interface (MachineGun).
- The GunAccessory class delegates to the MachineGun object.
- A derived class from GunAccessory class is defined for each optional accessory like a silencer, scope, etc.
- These derived classes implement the wrapper functionality and delegate to the GunAccessory base class.
Game programmers often concentrate on the core functionality of the game. They usually ignore the design aspects. This leads to less flexibility, extensibility, and robustness in the final game design. Any changes in game mechanics, algorithm, or player behavior becomes complex. This requires complete rework in most cases. Design Patterns provide solutions to common design problems. These can be evaluated and implemented in Game Design especially for modeling the principle Game components and their interactions.