I need to reconsider the delta thing

This commit is contained in:
kolaflash
2025-11-28 12:13:31 +01:00
parent 37fe43d8e9
commit ad9ab70d05
3 changed files with 58 additions and 37 deletions
+13 -17
View File
@@ -20,13 +20,11 @@ export type SceneData = {
export type Scene = { export type Scene = {
data: SceneData; data: SceneData;
entityPool: Map< entityMap: Map<
string, string,
{ {
hooks: { animate: AnimateEntity<never>;
animate: AnimateEntity<never>; process: ProcessEntity<never>;
process: ProcessEntity<never>;
};
entities: Array<Entity<unknown>>; entities: Array<Entity<unknown>>;
} }
>; >;
@@ -50,21 +48,21 @@ export const currentScene: Scene = {
entities: [], entities: [],
}, },
process: () => {}, process: () => {},
entityPool: new Map(), entityMap: new Map(),
}; };
function animateEntities(ctx: CanvasRenderingContext2D, delta: number): void { function animateEntities(ctx: CanvasRenderingContext2D, delta: number): void {
for (const entry of currentScene.entityPool.values()) { for (const entry of currentScene.entityMap.values()) {
for (const entity of entry.entities) { for (const entity of entry.entities) {
entry.hooks.animate(entity as Entity<never>, ctx, delta); entry.animate(entity as Entity<never>, ctx, delta);
} }
} }
} }
function processEntities(delta: number): void { function processEntities(delta: number): void {
for (const entry of currentScene.entityPool.values()) { for (const entry of currentScene.entityMap.values()) {
for (const entity of entry.entities) { for (const entity of entry.entities) {
entry.hooks.process(entity as Entity<never>, delta); entry.process(entity as Entity<never>, delta);
} }
} }
} }
@@ -111,15 +109,13 @@ export async function loadScene(name: string): Promise<void> {
state: structuredClone(e.state), state: structuredClone(e.state),
}; };
if (currentScene.entityPool.has(e.id)) { if (currentScene.entityMap.has(e.id)) {
const pool = currentScene.entityPool.get(e.id); const pool = currentScene.entityMap.get(e.id);
pool!.entities.push(entity); pool!.entities.push(entity);
} else { } else {
currentScene.entityPool.set(e.id, { currentScene.entityMap.set(e.id, {
hooks: { animate: entityAnimateMap.get(entry.id)!,
animate: entityAnimateMap.get(entry.id)!, process: entityProcessMap.get(entry.id)!,
process: entityProcessMap.get(entry.id)!,
},
entities: [entity], entities: [entity],
}); });
} }
+37 -10
View File
@@ -1,24 +1,51 @@
import { useEntity } from "#/engine/Entity.ts"; import { type Entity, useEntity } from "#/engine/Entity.ts";
import { viewport } from "#/engine/Viewport.ts"; import { viewport } from "#/engine/Viewport.ts";
import { loadImage } from "#/lib/loadImage.ts"; import { loadImage } from "#/lib/loadImage.ts";
import { createSprite, drawSprite } from "#/lib/Sprite.ts"; import { createSprite, drawSprite, type Sprite } from "#/lib/Sprite.ts";
const sprite = createSprite(await loadImage("/assets/char-idle.png"), 2, 4); const spriteIdle = createSprite(await loadImage("/assets/char-idle.png"), 2, 4);
const spriteWalk = createSprite(await loadImage("/assets/char-walk.png"), 4, 4);
spriteWalk.yIndex = 2;
function animateSprite(
ctx: CanvasRenderingContext2D,
sprite: Sprite,
entity: Entity<any>,
delta: number,
): void {
entity.state.animations.walk.frameDelta += delta;
if (
entity.state.animations.walk.frameDelta >
entity.state.animations.walk.frameTime
) {
entity.state.animations.walk.frameDelta =
entity.state.animations.walk.frameDelta %
entity.state.animations.walk.frameTime;
spriteWalk.xIndex += 1;
if (spriteWalk.xIndex >= spriteWalk.xFrames) {
spriteWalk.xIndex = 0;
}
}
drawSprite(ctx, spriteWalk, entity.position.x, entity.position.y);
}
const { animate, process } = useEntity("testEntity", { const { animate, process } = useEntity("testEntity", {
animation: { animations: {
xFrame: 0, walk: {
yFrame: 0, frameTime: 222,
frameDelta: 0,
},
}, },
stuff: 1, stuff: 1,
}); });
animate((entity, ctx, _delta) => { animate((entity, ctx, delta) => {
drawSprite(ctx, sprite, entity.position.x, entity.position.y, 16, 16); animateSprite(ctx, spriteIdle, entity, delta);
}); });
process((entity, _delta) => { process((entity, delta) => {
entity.position.x += entity.state.stuff; entity.position.x += entity.state.stuff * 0.05 * delta;
if (entity.position.x > viewport.canvas.width - 16) { if (entity.position.x > viewport.canvas.width - 16) {
entity.state.stuff = -1; entity.state.stuff = -1;
} else if (entity.position.x < 0) { } else if (entity.position.x < 0) {
+8 -10
View File
@@ -4,8 +4,8 @@ export type Sprite = {
yFrames: number; yFrames: number;
frameWidth: number; frameWidth: number;
frameHeight: number; frameHeight: number;
x: number; xIndex: number;
y: number; yIndex: number;
}; };
export function createSprite( export function createSprite(
@@ -19,8 +19,8 @@ export function createSprite(
yFrames, yFrames,
frameWidth: image.width / xFrames, frameWidth: image.width / xFrames,
frameHeight: image.height / yFrames, frameHeight: image.height / yFrames,
x: 0, xIndex: 0,
y: 0, yIndex: 0,
}; };
} }
@@ -29,18 +29,16 @@ export function drawSprite(
sprite: Sprite, sprite: Sprite,
x: number, x: number,
y: number, y: number,
width: number,
height: number,
): void { ): void {
ctx.drawImage( ctx.drawImage(
sprite.image, sprite.image,
sprite.x, sprite.xIndex * sprite.frameWidth,
sprite.y, sprite.yIndex * sprite.frameHeight,
sprite.frameWidth, sprite.frameWidth,
sprite.frameHeight, sprite.frameHeight,
x, x,
y, y,
width, sprite.frameWidth,
height, sprite.frameHeight,
); );
} }