How do I recreate the movement Phantom Puppet does in FNaF 3
💡 Creating complex character animations and movement systems? Need help with smooth transitions and camera tracking? 🚀 Get Animation Help
HorrorGameDev
Posted on July 16, 2025 • Intermediate
👻 Complex movement mechanics question
Hey everyone! I’m working on recreating a specific movement effect from Five Nights at Freddy’s 3 - specifically how the Phantom Puppet moves.
The behavior I’m trying to replicate has two simultaneous effects:
- Every 0.5 seconds: The character glides smoothly toward the center of the screen
- Continuously: The character’s position also changes based on the office camera’s position
I need both effects to work together seamlessly. The challenge is combining the periodic gliding movement with the continuous position tracking. Any ideas on how to implement this dual movement system? 🤔
AnimationMaster_Pro
Replied 2 hours later • ⭐ Best Answer
Excellent question @HorrorGameDev! This is a great example of layered movement systems. The key is to separate the different movement components and combine them properly.
🎭 Movement System Architecture
Here’s how the dual movement system works:
🔧 Step 1: Basic Position Tracking System
First, let’s create the camera-following component:
when flag clicked set [base offset x v] to [0] set [base offset y v] to [0] forever // Calculate base position relative to camera set [camera x v] to ([x position v] of [Office Camera v]) set [camera y v] to ([y position v] of [Office Camera v]) // Apply camera offset to phantom position set [phantom base x v] to ((camera x) + (base offset x)) set [phantom base y v] to ((camera y) + (base offset y)) end
👻 Step 2: Gliding Movement System
Now add the periodic gliding behavior:
when flag clicked set [glide timer v] to [0] set [glide progress v] to [1] // 1 = glide complete set [glide start x v] to [0] set [glide start y v] to [0] set [glide target x v] to [0] set [glide target y v] to [0] forever // Update glide timer change [glide timer v] by (1) // Check if it's time for a new glide (30 frames = 0.5 seconds at 60 FPS) if <(glide timer) > [30]> then // Start new glide set [glide timer v] to [0] set [glide progress v] to [0] // Set starting position (current phantom position) set [glide start x v] to (phantom base x) set [glide start y v] to (phantom base y) // Set target (screen center, adjusted for camera) set [glide target x v] to (camera x) set [glide target y v] to (camera y) end // Update glide progress if <(glide progress) < [1]> then change [glide progress v] by [0.05] // Adjust speed as needed if <(glide progress) > [1]> then set [glide progress v] to [1] end end end
🎯 Step 3: Smooth Interpolation Function
Create a custom block for smooth movement:
define smooth lerp (start) (end) (progress) // Ease-out interpolation for smoother movement set [eased progress v] to (1 - ((1 - (progress)) * (1 - (progress)))) set [lerp result v] to ((start) + (((end) - (start)) * (eased progress))) define calculate phantom position // Get current glide position smooth lerp (glide start x) (glide target x) (glide progress) set [glide offset x v] to (lerp result) smooth lerp (glide start y) (glide target y) (glide progress) set [glide offset y v] to (lerp result) // Combine camera tracking with glide movement set [final x v] to ((phantom base x) + ((glide offset x) - (phantom base x)) * (glide progress)) set [final y v] to ((phantom base y) + ((glide offset y) - (phantom base y)) * (glide progress))
🚀 Step 4: Complete Implementation
Put it all together in the main phantom sprite:
when flag clicked // Initialize phantom set [phantom visible v] to [true] set [base offset x v] to [100] // Phantom appears 100 pixels right of camera center set [base offset y v] to [0] forever if <(phantom visible)> then calculate phantom position go to x: (final x) y: (final y) // Optional: Add some spooky effects set [ghost effect v] to (50) change [color effect v] by (2) else hide end end
🎮 Step 5: Advanced Features
Add some extra polish for a more authentic feel:
// Variable glide timing for unpredictability define random glide timing set [next glide time v] to (random (25) (35)) // 0.4 to 0.6 seconds // Phantom appearance/disappearance define phantom behavior if <(phantom visible)> then // Chance to disappear if <(random (1) (300)) = [1]> then set [phantom visible v] to [false] set [disappear timer v] to (random (60) (180)) // 1-3 seconds end else // Count down to reappearance change [disappear timer v] by (-1) if <(disappear timer) < [1]> then set [phantom visible v] to [true] // Reset position when reappearing set [glide progress v] to [1] end end // Glide with easing variations define advanced glide // Different easing for different moods if <(random (1) (3)) = [1]> then // Sudden movement set [glide speed v] to [0.15] else // Slow creep set [glide speed v] to [0.03] end
💡 Pro Tips for Horror Game Feel
- Timing variation: Don’t make the glides exactly 0.5 seconds - add slight randomness
- Easing curves: Use different easing for different emotional effects (sudden vs. creeping)
- Visual effects: Add transparency, color shifts, or distortion during movement
- Sound integration: Trigger audio cues when glides start or when phantom reaches center
This system gives you the dual movement effect you’re looking for - the phantom tracks the camera position while also periodically gliding toward the screen center! 👻
HorrorGameDev
Replied 45 minutes later
@AnimationMaster_Pro This is absolutely incredible! 🤯 The layered approach makes perfect sense now!
I implemented the basic version first and it works exactly like the original FNaF 3 effect. The smooth interpolation function really makes the movement feel natural and spooky. I love how you separated the camera tracking from the gliding system - it’s so much cleaner than trying to do everything in one script.
The advanced features section is pure gold too - the random timing and easing variations add so much personality to the movement! Thanks for the detailed breakdown! 🎉
FNaFGameDev
Replied 1 hour later
Amazing solution @AnimationMaster_Pro! 👏 As someone who’s recreated several FNaF mechanics, I can confirm this approach is spot-on.
One additional tip for authenticity: In the original FNaF 3, the Phantom Puppet’s movement also has a slight “drift” effect where it doesn’t always glide to the exact center. You can add this by:
// Add slight randomness to target position set [glide target x v] to ((camera x) + (random (-20) (20))) set [glide target y v] to ((camera y) + (random (-15) (15)))
This makes the movement feel more organic and less predictable! 🎮
Vibelf_Community
Pinned Message • Moderator
🎬 Master Advanced Animation and Movement Systems
Fantastic discussion on complex movement mechanics! For developers ready to create professional-quality animations and character systems, our expert tutors can help you master:
- 🎭 Advanced character animation and state machines
- 📹 Camera systems and cinematic effects
- 🎯 Smooth interpolation and easing functions
- 👻 Horror game mechanics and atmospheric effects
📚 Related Animation Topics
- Creating smooth camera following systems
- Advanced easing and interpolation techniques
- Building atmospheric horror game effects
Ready to create stunning animations and immersive game experiences? Get personalized guidance from our animation experts!