Implement basic scene manager with ability to switch between scenes
This commit is contained in:
parent
9063b45180
commit
f9079e4823
7 changed files with 75 additions and 21 deletions
17
main.ts
17
main.ts
|
|
@ -1,29 +1,24 @@
|
||||||
import p5 from 'p5';
|
import p5 from 'p5';
|
||||||
import { SCREEN_WIDTH, SCREEN_HEIGHT } from './src/constants/screen';
|
import { SCREEN_WIDTH, SCREEN_HEIGHT } from './src/constants/screen';
|
||||||
import { OverviewScene } from './src/scenes/OverviewScene';
|
import { SceneManager } from './src/scenes/SceneManager';
|
||||||
import { Scenes } from './src/scenes/scenes';
|
import { Scenes } from './src/scenes/scenes';
|
||||||
|
|
||||||
const sketch = (s) => {
|
const sketch = (s: p5) => {
|
||||||
let currentScene: Scenes = Scenes.OVERVIEW;
|
let sm: SceneManager;
|
||||||
let overviewScene: OverviewScene;
|
|
||||||
|
|
||||||
s.setup = () => {
|
s.setup = () => {
|
||||||
s.createCanvas(SCREEN_WIDTH, SCREEN_HEIGHT);
|
s.createCanvas(SCREEN_WIDTH, SCREEN_HEIGHT);
|
||||||
s.noCursor();
|
s.noCursor();
|
||||||
|
|
||||||
overviewScene = new OverviewScene();
|
sm = new SceneManager();
|
||||||
};
|
};
|
||||||
|
|
||||||
s.draw = () => {
|
s.draw = () => {
|
||||||
if (currentScene === Scenes.OVERVIEW) {
|
sm.draw();
|
||||||
overviewScene.draw();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
s.mousePressed = () => {
|
s.mousePressed = () => {
|
||||||
if (currentScene === Scenes.OVERVIEW) {
|
sm.handleClick();
|
||||||
overviewScene.onSceneClick();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,7 @@ export class Player {
|
||||||
}
|
}
|
||||||
|
|
||||||
private drawCursorIndicator(x: number, y: number, size: number) {
|
private drawCursorIndicator(x: number, y: number, size: number) {
|
||||||
|
mp5.strokeWeight(2);
|
||||||
mp5.stroke(mp5.color(colors.black));
|
mp5.stroke(mp5.color(colors.black));
|
||||||
mp5.line(x - size, y + size, x + size, y - size);
|
mp5.line(x - size, y + size, x + size, y - size);
|
||||||
mp5.line(x + size, y - size, x - size, y + size);
|
mp5.line(x + size, y - size, x - size, y + size);
|
||||||
|
|
|
||||||
16
src/scenes/LegacyScene.ts
Normal file
16
src/scenes/LegacyScene.ts
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
import { mp5 } from '../../main';
|
||||||
|
import { SceneManager } from './SceneManager';
|
||||||
|
import { Scenes } from './scenes';
|
||||||
|
|
||||||
|
export class LegacyScene {
|
||||||
|
constructor() {}
|
||||||
|
|
||||||
|
draw() {
|
||||||
|
mp5.background(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
onSceneClick(sm: SceneManager) {
|
||||||
|
console.log('Click on legacy scene');
|
||||||
|
sm.changeSceneTo(Scenes.OVERVIEW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,17 +2,19 @@ import { mp5 } from '../../main';
|
||||||
import { Player } from '../Player';
|
import { Player } from '../Player';
|
||||||
import { colors } from '../constants/colors';
|
import { colors } from '../constants/colors';
|
||||||
import { Edge } from '../Edge';
|
import { Edge } from '../Edge';
|
||||||
|
import { SceneManager } from './SceneManager';
|
||||||
|
import { Scenes } from './scenes';
|
||||||
|
|
||||||
export class OverviewScene {
|
export class OverviewScene {
|
||||||
player: Player;
|
player: Player;
|
||||||
edgeData: Array<{ x: number; y: number; r: number }>;
|
edgeData: Array<{ x: number; y: number; r: number; scene: Scenes }>;
|
||||||
edges: Edge[];
|
edges: Edge[];
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.edgeData = [
|
this.edgeData = [
|
||||||
{ x: 100, y: 100, r: 50 },
|
{ x: 100, y: 100, r: 50, scene: Scenes.LEGACY },
|
||||||
{ x: 900, y: 400, r: 100 },
|
{ x: 900, y: 400, r: 100, scene: Scenes.LEGACY },
|
||||||
{ x: 300, y: 600, r: 75 },
|
{ x: 300, y: 600, r: 75, scene: Scenes.LEGACY },
|
||||||
];
|
];
|
||||||
this.edges = this.edgeData.map((edge) => new Edge(edge.x, edge.y, edge.r));
|
this.edges = this.edgeData.map((edge) => new Edge(edge.x, edge.y, edge.r));
|
||||||
this.player = new Player();
|
this.player = new Player();
|
||||||
|
|
@ -26,12 +28,11 @@ export class OverviewScene {
|
||||||
this.player.move();
|
this.player.move();
|
||||||
}
|
}
|
||||||
|
|
||||||
public onSceneClick() {
|
public onSceneClick(sm: SceneManager) {
|
||||||
console.log('Click on scene');
|
this.edgeData.forEach((edge, i) => {
|
||||||
this.edges.forEach((edgeShape, i) => {
|
const dist = mp5.dist(mp5.mouseX, mp5.mouseY, edge.x, edge.y);
|
||||||
const dist = mp5.dist(mp5.mouseX, mp5.mouseY, edgeShape.x, edgeShape.y);
|
if (dist < edge.r) {
|
||||||
if (dist < edgeShape.r) {
|
sm.changeSceneTo(edge.scene);
|
||||||
console.log(`Click on edge ${i}`);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
39
src/scenes/SceneManager.ts
Normal file
39
src/scenes/SceneManager.ts
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
import { LegacyScene } from './LegacyScene';
|
||||||
|
import { OverviewScene } from './OverviewScene';
|
||||||
|
import { Scenes } from './scenes';
|
||||||
|
|
||||||
|
export class SceneManager {
|
||||||
|
currentScene: Scenes;
|
||||||
|
|
||||||
|
// Scenes
|
||||||
|
overviewScene: OverviewScene;
|
||||||
|
legacyScene: LegacyScene;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.currentScene = Scenes.OVERVIEW;
|
||||||
|
|
||||||
|
// Scenes
|
||||||
|
this.overviewScene = new OverviewScene();
|
||||||
|
this.legacyScene = new LegacyScene();
|
||||||
|
}
|
||||||
|
|
||||||
|
public draw() {
|
||||||
|
if (this.currentScene === Scenes.OVERVIEW) {
|
||||||
|
this.overviewScene.draw();
|
||||||
|
} else if (this.currentScene === Scenes.LEGACY) {
|
||||||
|
this.legacyScene.draw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public changeSceneTo(newScene: Scenes) {
|
||||||
|
this.currentScene = newScene;
|
||||||
|
}
|
||||||
|
|
||||||
|
public handleClick() {
|
||||||
|
if (this.currentScene === Scenes.OVERVIEW) {
|
||||||
|
this.overviewScene.onSceneClick(this);
|
||||||
|
} else if (this.currentScene === Scenes.LEGACY) {
|
||||||
|
this.legacyScene.onSceneClick(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
export enum Scenes {
|
export enum Scenes {
|
||||||
OVERVIEW = 'OVERVIEW',
|
OVERVIEW = 'OVERVIEW',
|
||||||
|
LEGACY = 'LEGACY',
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
main {
|
main {
|
||||||
|
|
|
||||||
Reference in a new issue