Browse/Movement & Navigation/Teleport / Blink
Movement & Navigation

Teleport / Blink

Design pattern addressing teleport / blink, defining how this system creates engagement and supports the overall game experience.

Medium complexity
3 examples
1 patterns

Overview

As a core game system, teleport / blink balances complexity with accessibility to engage diverse audiences. Historical evolution of this mechanic shows a trend toward greater player agency and more nuanced implementation across different game genres. Modern implementations often combine this mechanic with procedural elements to increase variety and replayability.

Game Examples

Simulation Games

Simulation Games use this mechanic where players plan their approach to survive increasingly difficult challenges. Each decision has cascading consequences, resulting in risk-reward tension.

Social Deduction Games

Social Deduction Games use this mechanic where players learn through failure to discover hidden content. The system rewards both skill and knowledge, resulting in personal achievement.

Metroidvanias

Metroidvanias use this mechanic where players solve environmental puzzles to achieve mastery over the system. The mechanic integrates seamlessly with other systems, resulting in personal achievement.

Pros & Cons

Advantages

  • Reduces monotony while maintaining challenge
  • Provides clear numerical feedback on player actions
  • Creates satisfying visual loops
  • Encourages exploratory playstyles and experimentation
  • Creates meaningful social decisions for players

Disadvantages

  • Can become overpowered in the late game
  • Increases CPU requirements significantly
  • Risk of exploitation in multiplayer contexts
  • Can create griefing if not carefully balanced
  • Requires significant balance data to implement well

Implementation Patterns

Collision Detector

Data-driven implementation that loads teleport / blink configuration from external definitions.

class TeleportBlinkController {
  pos = { x: 0, y: 0 };
  baseSpeed = 8.0;
  phase = "standing";

  update(input: Input, dt: number) {
    const speed = this.getSpeed();
    this.pos.x += input.x * speed * dt;
    this.pos.y += input.y * speed * dt;
  }

  getSpeed() {
    switch (this.phase) {
      case "sprinting": return this.baseSpeed * 1.5;
      case "crouching": return this.baseSpeed * 0.5;
      case "swimming": return this.baseSpeed * 0.7;
      default: return this.baseSpeed;
    }
  }
}