diff --git a/src/scenes/DetailScene.ts b/src/scenes/DetailScene.ts
index b75c99a..936c0bc 100644
--- a/src/scenes/DetailScene.ts
+++ b/src/scenes/DetailScene.ts
@@ -21,7 +21,9 @@ export class DetailScene {
(contributor) => new Contributor(100, 200, 100)
);
this.legacy = state.currLegacy.map((legacy) => new Legacy(200, 300, 100));
- this.packages = state.currPackages.map((currPackage) => new Package(400, 300, 50));
+ this.packages = state.currPackages.map(
+ (currPackage) => new Package(400, 300, 50, 'react', '
Test
')
+ );
});
}
@@ -47,5 +49,9 @@ export class DetailScene {
onSceneClick() {
// store.setState({ currentScene: Scenes.OVERVIEW });
this.player.reveal();
+
+ this.packages.forEach((packageObj) => {
+ packageObj.onClick();
+ });
}
}
diff --git a/src/sketchObjects/Package.ts b/src/sketchObjects/Package.ts
index dfe7255..49f1cd8 100644
--- a/src/sketchObjects/Package.ts
+++ b/src/sketchObjects/Package.ts
@@ -2,6 +2,7 @@ import { combineLatest, map } from 'rxjs';
import { mp5 } from '../../main';
import { playerHead$, areasColliding, revealedArea$ } from '../area';
import { colors } from '../constants/colors';
+import store from '../store';
enum PackageStates {
HIDDEN = 'HIDDEN',
@@ -16,19 +17,30 @@ export class Package {
size: number;
name: string;
url: string;
+ messageContents: string;
corners: number = 10;
startSize: number = 5;
currentSize: number;
wasTouched: boolean = false;
+ wasInteractedWith: boolean = false;
+ hover: boolean = false;
packageState: PackageStates = PackageStates.HIDDEN;
- constructor(x: number, y: number, size: number, name?: string, packageURL?: string) {
+ constructor(
+ x: number,
+ y: number,
+ size: number,
+ name?: string,
+ messageContents?: string,
+ packageURL?: string
+ ) {
this.x = x;
this.y = y;
this.size = size;
this.name = name;
this.url = packageURL;
this.currentSize = this.startSize;
+ this.messageContents = messageContents;
combineLatest([revealedArea$, playerHead$]).subscribe(([revealedArea, playerHead]) => {
const isRevealed = areasColliding(
@@ -37,16 +49,31 @@ export class Package {
);
const isTouched = areasColliding({ x: this.x, y: this.y, w: this.size }, playerHead, true);
- if (this.wasTouched) {
- this.packageState = PackageStates.ACTIVE;
- } else if (isRevealed && !this.wasTouched) {
- this.packageState = PackageStates.REVEALED;
+ console.log('Revealed', isRevealed);
+ console.log('isTouched', isTouched);
+ console.log('wasTouched', this.wasTouched);
+ console.log('wasInteractedWith', this.wasInteractedWith);
- if (isTouched) {
+ if (isRevealed) {
+ if (this.packageState !== PackageStates.ACTIVE) {
+ this.packageState = PackageStates.REVEALED;
+ }
+ if (this.wasInteractedWith) {
+ this.packageState = PackageStates.INACTIVE;
+ }
+
+ if (isTouched && !this.wasTouched) {
+ this.packageState = PackageStates.ACTIVE;
this.wasTouched = true;
}
} else {
- this.packageState = PackageStates.HIDDEN;
+ if (this.wasInteractedWith) {
+ this.packageState = PackageStates.INACTIVE;
+ } else if (this.wasTouched && !this.wasInteractedWith) {
+ this.packageState = PackageStates.ACTIVE;
+ } else {
+ this.packageState = PackageStates.HIDDEN;
+ }
}
// console.log(this.packageState);
@@ -55,6 +82,8 @@ export class Package {
public draw() {
mp5.noStroke();
+ mp5.rectMode('center');
+ mp5.ellipseMode('center');
if (this.packageState === PackageStates.HIDDEN) {
// Scale down after it was revealed or active
@@ -62,7 +91,7 @@ export class Package {
this.currentSize--;
}
- mp5.square(this.x, this.y, this.currentSize, this.corners);
+ /*mp5.square(this.x, this.y, this.currentSize, this.corners);*/
} else if (this.packageState === PackageStates.REVEALED) {
// Scale up if not large enough
if (this.currentSize < this.size) {
@@ -77,6 +106,47 @@ export class Package {
mp5.square(this.x, this.y, this.currentSize, this.corners);
mp5.square(this.x - this.size - 10, this.y, this.currentSize, this.corners);
mp5.square(this.x, this.y - this.size - 10, this.currentSize, this.corners);
+
+ // Check if mouse is over the squares, if so animate and enable click
+ const mouseOverShape = areasColliding(
+ { x: mp5.mouseX, y: mp5.mouseY, w: 70 },
+ { x: this.x, y: this.y, w: this.currentSize }
+ );
+
+ if (mouseOverShape) {
+ this.hover = true;
+ mp5.square(this.x, this.y, this.currentSize + mp5.random(-5, 5), this.corners);
+ mp5.square(
+ this.x - this.size - 10,
+ this.y,
+ this.currentSize + mp5.random(-5, 5),
+ this.corners
+ );
+ mp5.square(
+ this.x,
+ this.y - this.size - 10,
+ this.currentSize + mp5.random(-5, 5),
+ this.corners
+ );
+ } else {
+ this.hover = false;
+ }
+ } else if (this.packageState === PackageStates.INACTIVE) {
+ mp5.fill(mp5.color(colors.greyLight));
+ mp5.square(this.x, this.y, this.currentSize, this.corners);
+ mp5.square(this.x - this.size - 10, this.y, this.currentSize, this.corners);
+ mp5.square(this.x, this.y - this.size - 10, this.currentSize, this.corners);
+ }
+ }
+
+ public onClick() {
+ if (this.hover && !this.wasInteractedWith) {
+ console.log('click on shape');
+ this.wasInteractedWith = true;
+ store.getState().addInfoMessage({
+ headline: this.name,
+ innerHTML: this.messageContents,
+ });
}
}
}