Skip to main content

Camera

PixelStorm uses a 2D orthographic camera. That choice fits the engine well because it keeps the projection simple, makes pixel-art scenes easier to reason about, and lines up naturally with the logical resolution used by the rest of the API.

Camera2D​

Construction​

Camera2D camera(-320.0f, 320.0f, 180.0f, -180.0f);

The constructor defines the initial orthographic bounds. In the default engine setup, those bounds are derived from the initial window size.

Public API​

MethodUse
SetProjection(left, right, bottom, top)changes the orthographic bounds
SetPosition(position)moves the camera in world space
SetRotation(rotationDegrees)rotates the camera around Z
GetPosition()current position
GetRotation()current rotation
GetProjectionMatrix()projection matrix
GetViewMatrix()view matrix
GetViewProjectionMatrix()combined matrix

When To Use It​

  • use Application::SetCameraPosition() for simple camera adjustments
  • use GetCamera() when you need direct camera access
  • use FollowCamera() when the camera should track an entity automatically

Coordinates​

With the default Application projection:

  • the origin is centered on screen
  • one unit usually corresponds to one logical pixel
  • positive vertical direction points downward in the gameplay logic used by the engine
note

That matches Input::GetAxis2D() and the patterns used in the demo.

Camera Follow​

Application::FollowCamera() is the recommended way to track an entity.

ParameterUse
entitytarget to follow
offsetrelative offset from the target
followRotationwhether the camera copies the target rotation
followSpeedsmoothing amount

Behavior​

  • if the entity is invalid, follow is canceled
  • if the target loses Transform, follow is canceled
  • if followSpeed <= 0, follow becomes instant

Example​

GetApplication().FollowCamera(player, Vec2(0.0f, 0.0f), false, 8.0f);

Useful Patterns​

Fixed HUD and World Text​

UI::Print("HUD", Vec2(12.0f, 12.0f), Colors::White(), 1.0f, false);
UI::Print("Enemy", enemy.Transform().GetPosition(), Colors::Red(), 1.0f, true);

Projectile Cleanup​

if (GetApplication().IsPositionOutsideCamera(bullet.Transform().GetPosition(), 32.0f))
{
bullet.Destroy(false);
}

Aim With Mouse​

const Vec2 mouseWorld = Input::GetMouseWorldPosition(GetApplication().GetCamera());
const Vec2 aimDirection = mouseWorld - gun.Transform().GetPosition();
gun.Transform().SetRotation(Degrees(Atan2(aimDirection.y, aimDirection.x)));

Instant Camera Snap​

GetApplication().FollowCamera(player, Vec2(0.0f, 0.0f), false, 0.0f);
tip

Use followSpeed = 0 only if you want an immediate camera snap.