mirror of
https://github.com/bspeice/speice.io
synced 2025-07-05 07:44:54 -04:00
Code for 2D camera system
This commit is contained in:
38
blog/2024-11-15-playing-with-fire/4-camera/camera.ts
Normal file
38
blog/2024-11-15-playing-with-fire/4-camera/camera.ts
Normal file
@ -0,0 +1,38 @@
|
||||
export function camera(
|
||||
x: number,
|
||||
y: number,
|
||||
width: number,
|
||||
height: number,
|
||||
scale: number,
|
||||
zoom: number,
|
||||
rotate: number,
|
||||
offsetX: number,
|
||||
offsetY: number,
|
||||
): [number, number] {
|
||||
const zoomFactor = Math.pow(2, zoom);
|
||||
|
||||
// Zoom, offset, and rotation are
|
||||
// applied in IFS coordinates
|
||||
[x, y] = [
|
||||
(x - offsetX) * zoomFactor,
|
||||
(y - offsetY) * zoomFactor,
|
||||
];
|
||||
|
||||
[x, y] = [
|
||||
x * Math.cos(rotate) -
|
||||
y * Math.sin(rotate),
|
||||
x * Math.sin(rotate) +
|
||||
y * Math.cos(rotate),
|
||||
]
|
||||
|
||||
// Scale is applied to pixel
|
||||
// coordinates. Shift by half
|
||||
// the image width and height
|
||||
// to compensate for the
|
||||
// IFS coordinates being symmetric
|
||||
// around the origin
|
||||
return [
|
||||
Math.floor(x * scale + width / 2),
|
||||
Math.floor(y * scale + height / 2)
|
||||
];
|
||||
}
|
Reference in New Issue
Block a user