• Do not use Discord to host any images you post, these links expire quickly! You can learn how to add images to your posts here.
  • The results of the game jam are out!
    See the Judge's Spotlight choices and vote for your favorites to win Community Choice Spotlight by the 28th! 🫙
  • Reminder: AI-generated content is not allowed on the forums per the Rules and Regulations. Please contact us if you have any questions!
Resource icon

v21.1 Technical Camera 2025-09-18

This resource pertains to version 21.1 of Pokémon Essentials.
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.
Cons:
  • 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.

Setup

  1. Download and Installation
    • Download the plugin zip via the top-right button.
    • Extract the technical camera plugin folder into your project’s Plugins folder.
  2. 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.

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


Ruby:
Expand Collapse Copy
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:
Expand Collapse Copy
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:
Expand Collapse Copy
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:
Expand Collapse Copy
Camera::AlwaysMoveWithPlayer.active = true
Camera::AlwaysMoveWithPlayer.active = false

---

Camera::StopMoveWithPlayer

Prevents all camera movement triggered by player movement.

Ruby:
Expand Collapse Copy
Camera::StopMoveWithPlayer.active = true
Camera::StopMoveWithPlayer.active = false

---

Camera::EaseOffset

Smooth offset easing (grid or pixel units).

Methods

Ruby:
Expand Collapse Copy
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:
Expand Collapse Copy
Camera::EaseOffset.gridSet(0, 5, 3, :cubic)

---

Camera::Follow

Follow one or several targets smoothly with elasticity and a minimum speed.

Config

Ruby:
Expand Collapse Copy
Camera::Follow.elasticity    # default: 5
Camera::Follow.minSpeed      # default: Game_Map::TILE_WIDTH * 30

Methods

Ruby:
Expand Collapse Copy
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:
Expand Collapse Copy
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:
Expand Collapse Copy
Camera::LookAt.position(x, y, duration = 0.7, shape = :cubic)
Camera::LookAt.betweenPlayerPosition(x, y, duration = 0.7, shape = :cubic)

Event-based Methods

Ruby:
Expand Collapse Copy
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:
Expand Collapse Copy
Camera::LookAt.stop
Camera::LookAt.stopWhenCurrentDone
Camera::LookAt.isActive?

Examples

Ruby:
Expand Collapse Copy
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:
Expand Collapse Copy
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.
Credits
No credit required.
  • Love
Reactions: julieharu
Author
Askip Capass
Downloads
22
Views
164
First release
Last update

Ratings

0.00 star(s) 0 ratings
Back
Top