I need to reconsider the delta thing
This commit is contained in:
+9
-13
@@ -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],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user