MainHub Lessons Game Overview
Let’s Go! Let’s Go! Let’s Go!

Classes (Interactive Viewer)

Click a topic to explore examples and explanations.


Overview: Classes in Game Development

Classes are the blueprint system of object‑oriented programming. They define what an object is, what data it holds, and how it behaves. In game development, classes allow you to build structured, reusable, and modular systems — characters, enemies, platforms, backgrounds, UI elements, and more.

Your engine uses a class‑based architecture where every game object extends a base class and participates in a shared lifecycle. Understanding how classes work — especially inheritance, method overriding, and constructor chaining — is essential for building custom behaviors that integrate smoothly with the engine.

Below is a detailed breakdown of the three major class concepts you’re working with.


🧬 1. Extending Base Classes

In your engine, every object begins by extending a built‑in base class. These base classes provide core functionality such as:

  • Position and movement
  • Physics and collision
  • Sprite loading and rendering
  • Lifecycle hooks (update, draw, etc.)
  • Registration inside the game world

Common Base Classes

  • Character — players, NPCs, animals, humanoids
  • Enemy — hostile AI with attack logic
  • Platform — ground, obstacles, moving platforms
  • Background — parallax layers, scenery, skyboxes

Why This Matters

By extending a base class, you inherit all of its built‑in behavior. This means you don’t have to rewrite physics, rendering, or collision logic — you only add what makes your object unique.

Example

class Wolf extends Character {
  constructor(data, gameEnv) {
    super(data, gameEnv);
    this.type = "Wolf";
  }
}

This Wolf automatically gains movement, collisions, and rendering from Character without extra code.


🔄 2. Overriding Lifecycle Methods

Every game object participates in a shared lifecycle. The engine calls certain methods every frame or during specific events. You can override these methods to customize behavior.

Key Lifecycle Methods

  • update() — movement, AI, physics, timers
  • draw() — custom rendering, effects, UI overlays
  • handleCollision() — reactions to collisions with players, enemies, platforms, etc.

Why This Matters

Overriding lets you keep the engine’s default behavior while adding your own. You can:

  • Add AI logic
  • Trigger animations
  • Modify physics
  • React to player proximity
  • Handle special collision cases

Example

update() {
  super.update();          // keep engine behavior
  this.howlCooldown--;     // custom behavior
}

handleCollision(other) {
  if (other instanceof Player) {
    this.attack();
  }
}

This pattern keeps your code clean and predictable.


🧱 3. Constructor Chaining with super(data, gameEnv)

Every custom class must call super(data, gameEnv) inside its constructor. This is how the engine initializes the object.

What super() Does

  • Registers the object in the game world
  • Loads sprites and animations
  • Sets initial position and size
  • Applies physics settings
  • Connects the object to the engine’s update/draw loop

Without calling super(), your object won’t function correctly — it won’t render, collide, or update.

Example

constructor(data, gameEnv) {
  super(data, gameEnv);  // required for engine integration
  this.health = 50;
  this.speed = 2.5;
}

Why This Matters

Constructor chaining ensures your custom class is fully compatible with the engine’s systems. It’s the handshake between your code and the engine.


🎯 Why Classes Matter in Your Game Engine

Classes give your game:

  • Structure — clear definitions for each object
  • Reusability — shared logic through inheritance
  • Customization — override only what you need
  • Consistency — every object follows the same lifecycle
  • Scalability — easy to add new enemies, NPCs, platforms, etc.

This architecture lets you build complex behaviors without rewriting core systems. It’s the foundation of clean, maintainable game code.