Skip to content

Commit

Permalink
Refactor game setup and add enemy spawning
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolasstrands committed Mar 19, 2024
1 parent 03d40b9 commit 8b718f6
Showing 1 changed file with 173 additions and 174 deletions.
347 changes: 173 additions & 174 deletions src/game.ts
Original file line number Diff line number Diff line change
@@ -1,196 +1,195 @@
import kaboom, { type KaboomCtx } from "kaboom";

export function setupGame(element: HTMLCanvasElement) {
let kb: KaboomCtx;

kb = kaboom({
// width: 640,
// height: 480,
font: "sans-serif",
canvas:
element ?? undefined,
background: [113, 72, 181],
// background: [ 0, 0, 0, 0 ],
maxFPS: 30,
global: false,
});

kb.loadSprite("dodo", "./sprites/Dodo_10x.png", {
sliceX: 4,
sliceY: 3,
anims: {
idle: {
from: 0,
to: 3,
speed: 5,
loop: true,
},
walk: {
from: 4,
to: 7,
speed: 10,
loop: true,
},
jump: {
from: 10,
to: 11,
speed: 10,
loop: false,
},
let kb: KaboomCtx;

kb = kaboom({
// width: 640,
// height: 480,
font: "sans-serif",
canvas: element ?? undefined,
background: [113, 72, 181],
// background: [ 0, 0, 0, 0 ],
maxFPS: 30,
global: false,
});

kb.loadSprite("dodo", "./sprites/Dodo_10x.png", {
sliceX: 4,
sliceY: 3,
anims: {
idle: {
from: 0,
to: 3,
speed: 5,
loop: true,
},
});

kb.loadSprite("ground", "./tiles/Tileset_10x.png", {
sliceX: 4,
sliceY: 3,
});

kb.loadSprite("hunter", "./sprites/Hunter_10x.png", {
sliceX: 4,
sliceY: 1,
anims: {
walk: {
from: 0,
to: 3,
loop: true,
speed: 7,
},
walk: {
from: 4,
to: 7,
speed: 10,
loop: true,
},
});

const FLOOR_HEIGHT = 48;
const SPEED = 320;
const JUMP_FORCE = 700;

kb.scene("game", () => {
let score = 0;
let time = 0;

kb.setGravity(800);

const player = kb.add([
kb.sprite("dodo"),
kb.pos(kb.width() / 8, kb.height() / 2),
jump: {
from: 10,
to: 11,
speed: 10,
loop: false,
},
},
});

kb.loadSprite("ground", "./tiles/Tileset_10x.png", {
sliceX: 4,
sliceY: 3,
});

kb.loadSprite("hunter", "./sprites/Hunter_10x.png", {
sliceX: 4,
sliceY: 1,
anims: {
walk: {
from: 0,
to: 3,
loop: true,
speed: 7,
},
},
});

const FLOOR_HEIGHT = 48;
// const SPEED = 320;
const JUMP_FORCE = 700;

kb.scene("game", () => {
let score = 0;
let time = 0;

kb.setGravity(800);

const player = kb.add([
kb.sprite("dodo"),
kb.pos(kb.width() / 8, kb.height() / 2),
kb.rotate(0),
kb.anchor("center"),
kb.area({ scale: kb.vec2(0.65, 1), offset: kb.vec2(10, 0) }),
kb.body(),
kb.doubleJump(10),
]);

player.flipX = true;

player.play("walk");

kb.add([
kb.sprite("ground", {
tiled: true,
width: kb.width(),
height: FLOOR_HEIGHT,
frame: 1,
}),
kb.area(),
kb.outline(1),
kb.pos(0, kb.height() - FLOOR_HEIGHT * 3),
// kb.anchor("botleft"),
kb.body({ isStatic: true }),
]);

const spawnEnemy = () => {
const enemyHunter = kb.add([
kb.sprite("hunter"),
kb.pos(kb.width(), kb.height() - FLOOR_HEIGHT * 3 - 16),
kb.rotate(0),
kb.anchor("center"),
kb.area({ scale: kb.vec2(0.65, 1), offset: kb.vec2(10, 0) }),
kb.area({ scale: kb.vec2(0.7, 1), offset: kb.vec2(30, 0) }),
kb.anchor("botleft"),
kb.body(),
kb.doubleJump(10),
kb.offscreen({ destroy: true }),
kb.move(kb.LEFT, 240 + Math.floor(time)),
"hunter",
]);

player.flipX = true;

player.play("walk");
enemyHunter.flipX = false;

kb.add([
kb.sprite("ground", {
tiled: true,
width: kb.width(),
height: FLOOR_HEIGHT,
frame: 1,
}),
kb.area(),
kb.outline(1),
kb.pos(0, kb.height() - FLOOR_HEIGHT * 3),
// kb.anchor("botleft"),
kb.body({ isStatic: true }),
]);
enemyHunter.play("walk");

const spawnEnemy = () => {
const enemyHunter = kb.add([
kb.sprite("hunter"),
kb.pos(kb.width(), kb.height() - FLOOR_HEIGHT * 3 - 16),
kb.rotate(0),
kb.area({ scale: kb.vec2(0.7, 1), offset: kb.vec2(30, 0) }),
kb.anchor("botleft"),
kb.body(),
kb.offscreen({ destroy: true }),
kb.move(kb.LEFT, 240 + Math.floor(time)),
"hunter",
]);

enemyHunter.flipX = false;

enemyHunter.play("walk");

kb.wait(kb.rand(1, 5), spawnEnemy);
};

spawnEnemy();

player.onCollide("hunter", (e, col) => {
if (!col?.isBottom()) {
if (col?.isLeft()) {
} else {
kb.burp();
kb.go("gameover");
}
} else {
player.jump(JUMP_FORCE * 0.75);
player.play("jump");
kb.shake(4);
kb.destroy(e);
kb.wait(kb.rand(1, 5), spawnEnemy);
};

score += 100;
}
});
spawnEnemy();

player.onGround(() => {
player.play("walk");
});

kb.onKeyPress("space", () => {
if (player.isGrounded()) {
player.jump(JUMP_FORCE);
player.play("jump");
player.onCollide("hunter", (e, col) => {
if (!col?.isBottom()) {
if (col?.isLeft()) {
} else {
player.doubleJump(JUMP_FORCE * 0.8);
player.play("jump");
kb.burp();
kb.go("gameover");
}
});

const scoreLabel = kb.add([
kb.text(`Score: ${score}`, {
font: "monospace",
size: 24,
align: "right",
}),
kb.pos(24, 24),
]);

kb.debug.inspect = true;

// increment score every frame
kb.onUpdate(() => {
score++;
time += kb.dt();
scoreLabel.text = `Score: ${Math.floor(score)} / Time: ${Math.floor(
time
)}`;
});
} else {
player.jump(JUMP_FORCE * 0.75);
player.play("jump");
kb.shake(4);
kb.destroy(e);

score += 100;
}
});

kb.scene("gameover", () => {
kb.add([
kb.text("Game Over", {
font: "monospace",
}),
kb.pos(kb.width() / 2, kb.height() / 2),
kb.anchor("center"),
]);
player.onGround(() => {
player.play("walk");
});

kb.add([
kb.text("Press space to restart", {
font: "monospace",
}),
kb.pos(kb.width() / 2, kb.height() / 2 + 32),
kb.anchor("center"),
]);
kb.onKeyPress("space", () => {
if (player.isGrounded()) {
player.jump(JUMP_FORCE);
player.play("jump");
} else {
player.doubleJump(JUMP_FORCE * 0.8);
player.play("jump");
}
});

kb.onKeyPress("space", () => {
kb.go("game");
});
const scoreLabel = kb.add([
kb.text(`Score: ${score}`, {
font: "monospace",
size: 24,
align: "right",
}),
kb.pos(24, 24),
]);

kb.debug.inspect = true;

// increment score every frame
kb.onUpdate(() => {
score++;
time += kb.dt();
scoreLabel.text = `Score: ${Math.floor(score)} / Time: ${Math.floor(
time
)}`;
});
});

kb.scene("gameover", () => {
kb.add([
kb.text("Game Over", {
font: "monospace",
}),
kb.pos(kb.width() / 2, kb.height() / 2),
kb.anchor("center"),
]);

kb.add([
kb.text("Press space to restart", {
font: "monospace",
}),
kb.pos(kb.width() / 2, kb.height() / 2 + 32),
kb.anchor("center"),
]);

kb.onKeyPress("space", () => {
kb.go("game");
});
});

kb.go("gameover");
kb.go("gameover");
}

0 comments on commit 8b718f6

Please sign in to comment.