- Pokémon Essentials Version
- v21.1 ✅
Pros / Cons
Pros:- Powerful and flexible; lets you control the camera exactly as you want.
- Still approachable for basic tasks: following player, LookAt, simple offsets.
- Strong foundation for creating complex or dynamic camera effects.
- Key advantage: disabling all modules leaves the game’s default camera untouched.
- Not plug‑and‑play; requires some discipline and understanding.
- Multiple active modules can interact in unexpected ways.
- For complex setups, you really need to understand and manage each module—it’s not user‑friendly.
No Coding Required
You don’t need to know how to code to use this plugin. Simply insert a script call, paste the line you want, and tweak values like target, duration, etc.The plugin is a collection of modules that let you create complex behaviors. All you need to understand is how to combine the different “building blocks” to achieve the result you want.
Simple examples
Camera::LookAt.event("pokeball")
Camera::LookAt.between($game_player, 4, "pokeball")
Camera::Follow.on("NPC")
Camera::Follow.on($game_player, "NPC 1", "NPC 2")
Camera::StopMoveWithPlayer.active = true
Camera.release
Example Scene
The zip includes Map999.rxdata.
I strongly recommend experimenting with / playing around the camera using the example scene, and checking out the code of the events.
1) Create a new project.
2) Create a map and note its ID (e.g., map022 → 22).
3) Save and exit the project.
4) Go to /data, delete the map you just created (Map022.rxdata), copy Map999.rxdata into /data, and rename it to match the deleted map’s ID.
5) Restart the project.
I strongly recommend experimenting with / playing around the camera using the example scene, and checking out the code of the events.
1) Create a new project.
2) Create a map and note its ID (e.g., map022 → 22).
3) Save and exit the project.
4) Go to /data, delete the map you just created (Map022.rxdata), copy Map999.rxdata into /data, and rename it to match the deleted map’s ID.
5) Restart the project.
Setup
- Download and Installation
- Download the plugin zip via the top-right button.
- Extract the technical camera plugin folder into your project’s Plugins folder.
- File: 99_on_start.rb
This file is included to make setup convenient and activate certain camera modules automatically.- Functionality: It enables some modules and can automatically hook in a “smooth follow player” behavior.
- Warning: This file is really only for convenience. Conceptually, it doesn’t belong in your project and should ideally be removed, with its logic handled properly elsewhere.
Modules
Camera::LookAt
Calculates a target point (barycenter) and moves the camera there. Continues focusing until stop is called; when stopped, the camera stays at its current position (see Camera.release).
Camera::Follow
Smoothly follows one or multiple targets (barycenter) with elasticity and minimum speed. Continues until stop is called; when stopped, the camera stays at its current position (see Camera.release).
Camera.release
Recenters the camera on the player and stops all active camera modules; does not affect any active offsets.
Camera::EaseOffset
Smoothly eases camera offsets over time. Not affected by Camera.release; other modules like LookAt or Follow ignore this offset. Useful for temporarily shifting the view (for example, if a menu covers part of the screen) while keeping camera movement consistent.
Camera::AlwaysMoveWithPlayer
When active, all player movement is tracked and the camera moves accordingly (this seems to be the default behavior, but there are exceptions).
Camera::StopMoveWithPlayer
Prevents camera from moving with player input when active.
Camera::TakeScrollControl
Overrides basic map scroll functions to avoid conflicts with other camera modules.
Easing
Lets you add custom easing functions for smooth camera transitions.
Calculates a target point (barycenter) and moves the camera there. Continues focusing until stop is called; when stopped, the camera stays at its current position (see Camera.release).
Camera::Follow
Smoothly follows one or multiple targets (barycenter) with elasticity and minimum speed. Continues until stop is called; when stopped, the camera stays at its current position (see Camera.release).
Camera.release
Recenters the camera on the player and stops all active camera modules; does not affect any active offsets.
Camera::EaseOffset
Smoothly eases camera offsets over time. Not affected by Camera.release; other modules like LookAt or Follow ignore this offset. Useful for temporarily shifting the view (for example, if a menu covers part of the screen) while keeping camera movement consistent.
Camera::AlwaysMoveWithPlayer
When active, all player movement is tracked and the camera moves accordingly (this seems to be the default behavior, but there are exceptions).
Camera::StopMoveWithPlayer
Prevents camera from moving with player input when active.
Camera::TakeScrollControl
Overrides basic map scroll functions to avoid conflicts with other camera modules.
Easing
Lets you add custom easing functions for smooth camera transitions.
Watch out / Pitfalls
- LookAt calculates its target only once, at the moment it is called. If these targets move afterward, it won’t track them.
- Following the player without activating StopMoveWithPlayer can create movement conflicts and visually odd behavior.
- Not paying attention to which modules are active: calling LookAt.stop stops the camera where it was; if a Follow is active, the camera will snap back to the target. Otherwise, there may just be an offset relative to the player.
Documentation
Camera Module — Documentation
A .md file is in the downloads folder.
---
Camera — Main
Release the camera manually
Description: calls stop on all camera modules and triggers a smooth movement to center the camera on the player. The current offset of the camera is not modified.
Example: reacting to map change (first load on game start)
Other direct methods (prefer using modules)
Note about offset: The camera may have an active offset applied via Camera.offset. Some modules, such as LookAt, do not take this offset into account when positioning the camera. As a result, targets may appear shifted on-screen by the amount of the active offset.
---
Camera::AlwaysMoveWithPlayer
Enable/disable automatic camera follow for the player.
true: camera always moves to follow the player
false: default behavior — if the camera is off-center, the camera does not move when the player's movement brings them closer to the screen center
---
Camera::StopMoveWithPlayer
Prevents all camera movement triggered by player movement.
---
Camera::EaseOffset
Smooth offset easing (grid or pixel units).
Methods
Example
---
Camera::Follow
Follow one or several targets smoothly with elasticity and a minimum speed.
Config
Methods
Notes
targets can be a single item, a list of items, $game_player, event objects, event names, or event IDs
Example
---
Camera::LookAt
Move camera to a specific position, event, or between targets with easing.
Position-based Methods
Event-based Methods
Control Methods
Examples
---
Camera::TakeScrollControl
Overrides map scroll methods to capture scroll actions and send them as offsets to the camera via EaseOffset.
active = false: scroll actions move the camera directly (default behavior)
active = true: scroll actions are intercepted and applied as camera offsets using EaseOffset, instead of directly changing the camera position
---
Easing — Adding Custom Easing Functions
You can add custom easing functions to the Easing module.
Example
A .md file is in the downloads folder.
---
Camera — Main
Release the camera manually
Ruby:
Camera.release()
Description: calls stop on all camera modules and triggers a smooth movement to center the camera on the player. The current offset of the camera is not modified.
Example: reacting to map change (first load on game start)
Ruby:
Camera.setOnMapChanged(-> (isFirstLoad) {
if isFirstLoad
puts "Game started: enabling default camera modules"
Camera::TakeScrollControl.active = true
Camera::AlwaysMoveWithPlayer.active = true
else
puts "Map changed: not first load"
end
})
Other direct methods (prefer using modules)
Ruby:
Camera.move(offset)
Camera.setPosition(pos)
Camera.setGridPosition(x, y)
Camera.resetOffset()
Camera.offset
Camera.offset = newOffset
Note about offset: The camera may have an active offset applied via Camera.offset. Some modules, such as LookAt, do not take this offset into account when positioning the camera. As a result, targets may appear shifted on-screen by the amount of the active offset.
---
Camera::AlwaysMoveWithPlayer
Enable/disable automatic camera follow for the player.
true: camera always moves to follow the player
false: default behavior — if the camera is off-center, the camera does not move when the player's movement brings them closer to the screen center
Ruby:
Camera::AlwaysMoveWithPlayer.active = true
Camera::AlwaysMoveWithPlayer.active = false
---
Camera::StopMoveWithPlayer
Prevents all camera movement triggered by player movement.
Ruby:
Camera::StopMoveWithPlayer.active = true
Camera::StopMoveWithPlayer.active = false
---
Camera::EaseOffset
Smooth offset easing (grid or pixel units).
Methods
Ruby:
Camera::EaseOffset.gridSet(x, y, duration = 0.25, shape = :cubic)
Camera::EaseOffset.pxSet(x, y, duration = 0.25, shape = :cubic)
Camera::EaseOffset.pxAdd(x, y, duration = 0.25, shape = :cubic)
Camera::EaseOffset.reset(duration = 0.25, shape = :cubic)
Camera::EaseOffset.moving? # => boolean
Example
Ruby:
Camera::EaseOffset.gridSet(0, 5, 3, :cubic)
---
Camera::Follow
Follow one or several targets smoothly with elasticity and a minimum speed.
Config
Ruby:
Camera::Follow.elasticity # default: 5
Camera::Follow.minSpeed # default: Game_Map::TILE_WIDTH * 30
Methods
Ruby:
Camera::Follow.on(*targets)
Camera::Follow.betweenPlayer(*targets)
Camera::Follow.stop
Camera::Follow.isActive?
Notes
targets can be a single item, a list of items, $game_player, event objects, event names, or event IDs
Example
Ruby:
Camera::Follow.on($game_player, "eventName", 5, someEventObject)
---
Camera::LookAt
Move camera to a specific position, event, or between targets with easing.
Position-based Methods
Ruby:
Camera::LookAt.position(x, y, duration = 0.7, shape = :cubic)
Camera::LookAt.betweenPlayerPosition(x, y, duration = 0.7, shape = :cubic)
Event-based Methods
Ruby:
Camera::LookAt.event(hybrid, duration = 0.7, shape = :cubic)
Camera::LookAt.betweenPlayerEvent(hybrid, duration = 0.7, shape = :cubic)
Camera::LookAt.between(hybrid, duration = 0.7, shape = :cubic)
Control Methods
Ruby:
Camera::LookAt.stop
Camera::LookAt.stopWhenCurrentDone
Camera::LookAt.isActive?
Examples
Ruby:
Camera::LookAt.event("eventName")
Camera::LookAt.betweenPlayerEvent(["eventName", 5])
Camera::LookAt.between([$game_player, "eventName", 5])
---
Camera::TakeScrollControl
Overrides map scroll methods to capture scroll actions and send them as offsets to the camera via EaseOffset.
active = false: scroll actions move the camera directly (default behavior)
active = true: scroll actions are intercepted and applied as camera offsets using EaseOffset, instead of directly changing the camera position
---
Easing — Adding Custom Easing Functions
You can add custom easing functions to the Easing module.
Example
Ruby:
Easing += { sin: ->(x) { Math.sin(x * Math::PI / 2) } }
Technical Overview
This camera plugin integrates a central manager that handles camera modules: it maintains the list of modules, manages their lifecycle (preUpdate, update), handles map changes, and oversees their release.
Each module/handler is independent, can implement update, stop, and other hooks (onMapChanged), and is called every frame.
Modules are prioritized (handlerPriority) to control execution order and avoid conflicts.
Offsets (like those handled by EaseOffset) are managed separately; a module can handle applying an offset, but it is not automatically applied to other modules. This allows temporary camera shifts without breaking the behavior of main modules.
You can create your own module, add it via Camera.addHandler, and it will be integrated into the pipeline automatically.
Each module/handler is independent, can implement update, stop, and other hooks (onMapChanged), and is called every frame.
Modules are prioritized (handlerPriority) to control execution order and avoid conflicts.
Offsets (like those handled by EaseOffset) are managed separately; a module can handle applying an offset, but it is not automatically applied to other modules. This allows temporary camera shifts without breaking the behavior of main modules.
You can create your own module, add it via Camera.addHandler, and it will be integrated into the pipeline automatically.
- Credits
- No credit required.