跳转到内容

How to make NPCs/Enemies in an open world game?

此内容尚不支持你的语言。

💡 Building complex open world systems? Need help with NPC management and camera systems? 🚀 Get Help Now

WS

WorldBuilder_Sam

Posted on July 26, 2025 • Advanced

🌍 Need help with NPCs and enemies in open world games

Hey everyone! I’m working on an open world game in Scratch and I’m running into some challenges with NPCs and enemies.

The main issue is that in open world games, typically the background moves instead of the player to create the scrolling effect. But this creates problems with NPCs and enemies:

  • If NPCs are part of the background, they can’t be interacted with individually
  • If they’re separate sprites, they get affected by the camera movement like the player
  • How do I handle enemies that need to spawn off-screen and move around independently?

I’m looking for a system that can handle multiple NPCs with different behaviors while maintaining proper world coordinates. Any help would be amazing! 🙏

OW

OpenWorldExpert_Luna

Replied 6 hours later • ⭐ Best Answer

Excellent question @WorldBuilder_Sam! Open world NPC systems are definitely complex, but I’ll show you a comprehensive solution using world coordinates and cloning! 🌟

🗺️ Open World NPC System Architecture

Here’s how a proper open world NPC system works:

flowchart TD A[🚀 Game Start] --> B[Initialize Camera System] B --> C[Set World Coordinates] C --> D[Create NPC Manager] D --> E[🎮 Game Loop] E --> F[Update Camera Position] F --> G[Check NPC Spawn Areas] G --> H{NPCs in Range?} H -->|Yes| I[Show/Update NPCs] H -->|No| J[Hide/Despawn NPCs] I --> K[Update NPC Behaviors] J --> K K --> L[Handle NPC Interactions] L --> E K --> M{Player Interaction?} M -->|Yes| N[Execute NPC Response] M -->|No| E N --> E style A fill:#e1f5fe style D fill:#f3e5f5 style K fill:#e8f5e8 style N fill:#fff3e0

📍 Step 1: World Coordinate System

First, establish a world coordinate system separate from screen coordinates:

    // Main Camera Controller
when flag clicked
set [camera_x v] to [0]
set [camera_y v] to [0]
set [player_world_x v] to [0]
set [player_world_y v] to [0]

forever
// Player movement updates world position
if <key [right arrow v] pressed?> then
change [player_world_x v] by [5]
end
if <key [left arrow v] pressed?> then
change [player_world_x v] by [-5]
end
if <key [up arrow v] pressed?> then
change [player_world_y v] by [5]
end
if <key [down arrow v] pressed?> then
change [player_world_y v] by [-5]
end

// Update camera to follow player
set [camera_x v] to (player_world_x)
set [camera_y v] to (player_world_y)

// Player stays centered on screen
go to x: [0] y: [0]
end
  

👥 Step 2: NPC Visibility System

Create a system to show/hide NPCs based on camera distance:

    // NPC Visibility Manager
when flag clicked
forever
// Calculate screen position from world coordinates
set [screen_x v] to ((npc_world_x) - (camera_x))
set [screen_y v] to ((npc_world_y) - (camera_y))

// Show NPC if within screen bounds (with buffer)
if <<(screen_x) > [-300]> and <(screen_x) < [300]>> then
if <<(screen_y) > [-250]> and <(screen_y) < [250]>> then
show
go to x: (screen_x) y: (screen_y)
else
hide
end
else
hide
end
end
  

🤖 Step 3: Advanced NPC Clone System

Use cloning for multiple NPCs with different behaviors:

    // NPC Master Controller
when flag clicked
delete all clones
set [active_npcs v] to [0]
set [max_npcs v] to [15]

// Create initial NPCs
repeat [5]
create clone of [myself v]
wait [0.2] seconds
end

forever
// Spawn new NPCs if needed
if <(active_npcs) < (max_npcs)> then
if <(pick random [1] to [100]) < [3]> then
create clone of [myself v]
end
end
wait [1] seconds
end
  

🎯 Step 4: NPC Behavior System

Implement different NPC types with unique behaviors:

    // NPC Clone Behavior
when I start as a clone
change [active_npcs v] by [1]

// Initialize NPC properties
set [npc_type v] to (pick random [1] to [4])
set [npc_world_x v] to ((camera_x) + (pick random [-400] to [400]))
set [npc_world_y v] to ((camera_y) + (pick random [-300] to [300]))
set [move_speed v] to (pick random [1] to [3])
set [patrol_range v] to (pick random [50] to [150])
set [original_x v] to (npc_world_x)
set [original_y v] to (npc_world_y)

switch costume to (join [npc_type_] (npc_type))

forever
// Update screen position
go to x: ((npc_world_x) - (camera_x)) y: ((npc_world_y) - (camera_y))

// Behavior based on type
if <(npc_type) = [1]> then
// Wandering NPC
change [npc_world_x v] by (pick random [-2] to [2])
change [npc_world_y v] by (pick random [-2] to [2])
end

if <(npc_type) = [2]> then
// Patrol NPC
if <(distance to [Player v]) > (patrol_range)> then
point towards [Player v]
change [npc_world_x v] by ((move_speed) * ([sin v] of (direction)))
change [npc_world_y v] by ((move_speed) * ([cos v] of (direction)))
end
end

if <(npc_type) = [3]> then
// Aggressive Enemy
if <(distance to [Player v]) < [100]> then
point towards [Player v]
change [npc_world_x v] by ((move_speed) * ([sin v] of (direction)))
change [npc_world_y v] by ((move_speed) * ([cos v] of (direction)))
end
end

if <(npc_type) = [4]> then
// Stationary Merchant
turn cw [2] degrees
end

// Despawn if too far from player
if <(distance to [Player v]) > [500]> then
delete this clone
change [active_npcs v] by [-1]
end
end
  

💬 Step 5: NPC Interaction System

Add interaction capabilities:

    // NPC Interaction Handler
when I start as a clone
forever
if <touching [Player v]?> then
if <key [space v] pressed?> then
// Different interactions based on NPC type
if <(npc_type) = [4]> then
broadcast [open shop v]
else
if <(npc_type) = [3]> then
broadcast [combat start v]
else
say [Hello there!] for [2] seconds
end
end
end
end
end
  

🌟 Step 6: Performance Optimization

Optimize for better performance:

    // Performance Manager
when flag clicked
forever
// Limit updates based on distance
if <(distance to [Player v]) < [200]> then
// Full update rate
wait [0.033] seconds
else
if <(distance to [Player v]) < [400]> then
// Reduced update rate
wait [0.1] seconds
else
// Minimal updates
wait [0.5] seconds
end
end
end
  

This system gives you complete control over NPCs in your open world! You can easily add new NPC types, behaviors, and interactions. The key is separating world coordinates from screen coordinates! 🎮

WS

WorldBuilder_Sam

Replied 4 hours later

@OpenWorldExpert_Luna This is incredible! Thank you so much! 🤩

The world coordinate system makes perfect sense now. I was trying to handle everything in screen coordinates which was causing all the issues. This approach is so much cleaner and more scalable!

Already implementing this and the NPCs are working beautifully. The performance optimization tips are especially helpful!

AI

AIBehavior_Dev

Replied 2 hours later

Great solution @OpenWorldExpert_Luna! 👏 I’d like to add some advanced AI behavior patterns that work well with this system:

🧠 Smart NPC Behaviors

  • State Machines: Use variables to track NPC states (idle, patrol, chase, flee)
  • Memory System: NPCs remember player interactions using lists
  • Group Behavior: NPCs can communicate and coordinate actions
  • Dynamic Spawning: Spawn NPCs based on player actions and world events

The world coordinate approach makes all of these advanced features much easier to implement!

VB

Vibelf_Community

Pinned Message • Moderator

🚀 Ready to Build Epic Open Worlds?

Amazing discussion on open world NPC systems! For those looking to create even more sophisticated worlds, our community can help you implement:

  • 🏰 Complex quest systems
  • 🌍 Dynamic world events
  • 🤝 Advanced NPC relationships
  • ⚔️ Faction-based combat systems

📚 Related Topics

Ready to create the next great open world adventure? Get expert guidance from our experienced game developers in the Vibelf app!