adding blue orb interactions

This commit is contained in:
ad044 2020-10-11 22:02:06 +04:00
parent 1e3a33bef5
commit d991f84850
10 changed files with 205 additions and 82 deletions

View file

@ -1,6 +1,6 @@
import React, { memo, useMemo, useRef } from "react"; import React, { memo, useMemo, useRef } from "react";
import { useFrame, useLoader } from "react-three-fiber"; import { useFrame, useLoader } from "react-three-fiber";
import { a } from "@react-spring/three"; import { useSpring, a } from "@react-spring/three";
import * as THREE from "three"; import * as THREE from "three";
import Cou from "../../static/sprites/Cou.png"; import Cou from "../../static/sprites/Cou.png";
import CouActive from "../../static/sprites/Cou_active.png"; import CouActive from "../../static/sprites/Cou_active.png";
@ -17,6 +17,13 @@ import LdaActive from "../../static/sprites/Lda_active.png";
import MULTI from "../../static/sprites/MULTI.png"; import MULTI from "../../static/sprites/MULTI.png";
import MULTIActive from "../../static/sprites/MULTI_active.png"; import MULTIActive from "../../static/sprites/MULTI_active.png";
import level_y_values from "../../resources/level_y_values.json"; import level_y_values from "../../resources/level_y_values.json";
import { useRecoilValue } from "recoil";
import {
currentBlueOrbAnimatingAtom,
currentBlueOrbPosXAtom,
currentBlueOrbPosYAtom,
currentBlueOrbPosZAtom,
} from "./CurrentBlueOrbAtom";
type BlueOrbContructorProps = { type BlueOrbContructorProps = {
sprite: string; sprite: string;
@ -39,6 +46,11 @@ const BlueOrb = memo((props: BlueOrbContructorProps) => {
// dynamically importnig them would be worse for performance, // dynamically importnig them would be worse for performance,
// so we import all of them here and then use this function to // so we import all of them here and then use this function to
// associate a sprite with the path // associate a sprite with the path
const currentBlueOrbAnimating = useRecoilValue(currentBlueOrbAnimatingAtom);
const currentBlueOrbPosX = useRecoilValue(currentBlueOrbPosXAtom);
const currentBlueOrbPosY = useRecoilValue(currentBlueOrbPosYAtom);
const currentBlueOrbPosZ = useRecoilValue(currentBlueOrbPosZAtom);
const spriteToPath = (sprite: string) => { const spriteToPath = (sprite: string) => {
if (sprite.includes("S")) { if (sprite.includes("S")) {
return [SSkn, SSKnActive]; return [SSkn, SSKnActive];
@ -116,10 +128,31 @@ const BlueOrb = memo((props: BlueOrbContructorProps) => {
} }
}); });
const currentBlueOrbState = useSpring({
currentBlueOrbPosX: currentBlueOrbPosX,
currentBlueOrbPosY: currentBlueOrbPosY,
currentBlueOrbPosZ: currentBlueOrbPosZ,
config: { duration: 900 },
});
return ( return (
<group position={[0, (level_y_values as LevelYValues)[props.level], 0]}> <group position={[0, (level_y_values as LevelYValues)[props.level], 0]}>
<a.mesh <a.mesh
position={props.position as [number, number, number]} position-x={
props.active && currentBlueOrbAnimating
? currentBlueOrbState.currentBlueOrbPosX
: props.position[0]
}
position-y={
props.active && currentBlueOrbAnimating
? currentBlueOrbState.currentBlueOrbPosY
: props.position[1]
}
position-z={
props.active && currentBlueOrbAnimating
? currentBlueOrbState.currentBlueOrbPosZ
: props.position[2]
}
rotation-y={props.rotation[1]} rotation-y={props.rotation[1]}
scale={[0.36, 0.18, 0.36]} scale={[0.36, 0.18, 0.36]}
renderOrder={1} renderOrder={1}

View file

@ -1,6 +1,26 @@
import { atom } from 'recoil' import { atom } from "recoil";
export const currentBlueOrbAtom = atom({ export const currentBlueOrbAtom = atom({
key: 'currentBlueOrbAtom', key: "currentBlueOrbAtom",
default: "0422" default: "0422",
}) });
export const currentBlueOrbAnimatingAtom = atom({
key: "currentBlueOrbAnimatingAtom",
default: false,
});
export const currentBlueOrbPosXAtom = atom({
key: "currentBlueOrbPosXAtom",
default: 0,
});
export const currentBlueOrbPosYAtom = atom({
key: "currentBlueOrbPosYAtom",
default: 0,
});
export const currentBlueOrbPosZAtom = atom({
key: "currentBlueOrbPosZAtom",
default: 0,
});

View file

@ -14,17 +14,17 @@ export const hudVisibilityAtom = atom({
export const currentHUDAtom = atom({ export const currentHUDAtom = atom({
key: "currentHUDAtom", key: "currentHUDAtom",
default: (blue_orb_huds as BlueOrbHuds)["bg_hud_3"], default: (blue_orb_huds as BlueOrbHuds)["fg_hud_1"],
}); });
export const bigLetterPosYAtom = atom({ export const bigLetterPosYAtom = atom({
key: "bigLetterPosYAtom", key: "bigLetterPosYAtom",
default: (blue_orb_huds as BlueOrbHuds)["bg_hud_3"]["big_text"][1], default: (blue_orb_huds as BlueOrbHuds)["fg_hud_1"]["big_text"][1],
}); });
export const bigLetterPosXAtom = atom({ export const bigLetterPosXAtom = atom({
key: "bigLetterPosXAtom", key: "bigLetterPosXAtom",
default: (blue_orb_huds as BlueOrbHuds)["bg_hud_3"]["big_text"][0], default: (blue_orb_huds as BlueOrbHuds)["fg_hud_1"]["big_text"][0],
}); });
export const bigHudTextAtom = atom({ export const bigHudTextAtom = atom({

View file

@ -5,7 +5,8 @@ import {
LainMoveRight, LainMoveRight,
LainMoveUp, LainMoveUp,
LainStanding, LainStanding,
} from "./Lain/Lain"; LainThrowBlueOrb,
} from "../Lain/Lain";
import { useRecoilState, useSetRecoilState } from "recoil"; import { useRecoilState, useSetRecoilState } from "recoil";
import { import {
bigHudTextAtom, bigHudTextAtom,
@ -14,14 +15,21 @@ import {
currentHUDAtom, currentHUDAtom,
hudActiveAtom, hudActiveAtom,
mediumHudTextAtom, mediumHudTextAtom,
} from "./HUD/HUDElementAtom"; } from "../HUD/HUDElementAtom";
import { currentBlueOrbAtom } from "./BlueOrb/CurrentBlueOrbAtom"; import {
import lain_animations from "../resources/lain_animations.json"; currentBlueOrbAnimatingAtom,
import blue_orb_huds from "../resources/blue_orb_huds.json"; currentBlueOrbAtom,
import blue_orb_directions from "../resources/blue_orb_directions.json"; currentBlueOrbPosXAtom,
import site_a from "../resources/site_a.json"; currentBlueOrbPosYAtom,
import { lainMoveStateAtom, lainMovingAtom } from "./Lain/LainAtom"; currentBlueOrbPosZAtom,
import { BlueOrbHudData, BlueOrbHuds } from "./HUD/HUDElement"; } from "../BlueOrb/CurrentBlueOrbAtom";
import lain_animations from "../../resources/lain_animations.json";
import blue_orb_huds from "../../resources/blue_orb_huds.json";
import blue_orb_directions from "../../resources/blue_orb_directions.json";
import blue_orb_positions from "../../resources/blue_orb_positions.json";
import site_a from "../../resources/site_a.json";
import { lainMoveStateAtom, lainMovingAtom } from "../Lain/LainAtom";
import { BlueOrbHudData, BlueOrbHuds } from "../HUD/HUDElement";
import { import {
middleRingAnimDurationAtom, middleRingAnimDurationAtom,
middleRingNoiseAtom, middleRingNoiseAtom,
@ -30,14 +38,15 @@ import {
middleRingRotZAtom, middleRingRotZAtom,
middleRingPosYAtom, middleRingPosYAtom,
middleRingWobbleStrengthAtom, middleRingWobbleStrengthAtom,
} from "./MiddleRing/MiddleRingAtom"; } from "../MiddleRing/MiddleRingAtom";
import { bigLetterOffsetXCoeffAtom } from "./TextRenderer/TextRendererAtom"; import { bigLetterOffsetXCoeffAtom } from "../TextRenderer/TextRendererAtom";
import { SiteData } from "./Site/Site"; import { SiteData } from "../Site/Site";
import { import {
isSiteYChangingAtom, isSiteYChangingAtom,
sitePosYAtom, sitePosYAtom,
siteRotYAtom, siteRotYAtom,
} from "./Site/SiteAtom"; } from "../Site/SiteAtom";
import { sleep } from "./inputHandlerHelpers";
type KeyCodeAssociations = { type KeyCodeAssociations = {
[keyCode: number]: string; [keyCode: number]: string;
@ -75,6 +84,7 @@ const getKeyCodeAssociation = (keyCode: number): string => {
37: "left", 37: "left",
38: "up", 38: "up",
39: "right", 39: "right",
88: "x",
} as KeyCodeAssociations)[keyCode]; } as KeyCodeAssociations)[keyCode];
}; };
@ -82,6 +92,13 @@ const InputHandler = () => {
const [currentBlueOrb, setCurrentBlueOrb] = useRecoilState( const [currentBlueOrb, setCurrentBlueOrb] = useRecoilState(
currentBlueOrbAtom currentBlueOrbAtom
); );
const setCurrentBlueOrbAnimating = useSetRecoilState(
currentBlueOrbAnimatingAtom
);
const setCurrentBlueOrbPosX = useSetRecoilState(currentBlueOrbPosXAtom);
const setCurrentBlueOrbPosY = useSetRecoilState(currentBlueOrbPosYAtom);
const setCurrentBlueOrbPosZ = useSetRecoilState(currentBlueOrbPosZAtom);
const [lainMoving, setLainMoving] = useRecoilState(lainMovingAtom); const [lainMoving, setLainMoving] = useRecoilState(lainMovingAtom);
const setLainMoveState = useSetRecoilState(lainMoveStateAtom); const setLainMoveState = useSetRecoilState(lainMoveStateAtom);
@ -379,6 +396,9 @@ const InputHandler = () => {
rotateMiddleRing("right"); rotateMiddleRing("right");
break; break;
case "throw_blue_orb":
setLainMoveState(<LainThrowBlueOrb />);
break;
default: default:
break; break;
} }
@ -493,7 +513,16 @@ const InputHandler = () => {
(event) => { (event) => {
const { keyCode } = event; const { keyCode } = event;
const moveDirection = getKeyCodeAssociation(keyCode); const keyCodeAssoc = getKeyCodeAssociation(keyCode);
let moveDirection;
let action;
if (keyCodeAssoc !== "x") {
moveDirection = keyCodeAssoc;
} else {
action = "throw_blue_orb";
}
if (moveDirection && !lainMoving && !spriteUpdateCooldown) { if (moveDirection && !lainMoving && !spriteUpdateCooldown) {
const targetBlueOrb = getTargetFrom(currentBlueOrb, moveDirection); const targetBlueOrb = getTargetFrom(currentBlueOrb, moveDirection);
@ -528,6 +557,29 @@ const InputHandler = () => {
targetBlueOrbHudId targetBlueOrbHudId
); );
} }
} else if (action && !lainMoving && !spriteUpdateCooldown) {
const currentBlueOrbPosId = currentBlueOrb.substr(2);
const currentBlueOrbPos =
blue_orb_positions[
currentBlueOrbPosId as keyof typeof blue_orb_positions
].position;
setAnimationState(action);
setCurrentBlueOrbPosX(currentBlueOrbPos[0]);
setCurrentBlueOrbPosY(currentBlueOrbPos[1]);
setCurrentBlueOrbPosZ(currentBlueOrbPos[2]);
setTimeout(() => {
setCurrentBlueOrbAnimating(true);
setCurrentBlueOrbPosX(0.5);
setCurrentBlueOrbPosY(0);
setCurrentBlueOrbPosZ(0);
}, 1500);
setTimeout(() => {
setCurrentBlueOrbAnimating(false);
}, 4200);
} }
}, },
[ [
@ -536,6 +588,11 @@ const InputHandler = () => {
currentBlueOrb, currentBlueOrb,
moveAndChangeBlueOrbFocus, moveAndChangeBlueOrbFocus,
changeBlueOrbFocus, changeBlueOrbFocus,
setAnimationState,
setCurrentBlueOrbPosX,
setCurrentBlueOrbPosY,
setCurrentBlueOrbPosZ,
setCurrentBlueOrbAnimating,
] ]
); );

View file

@ -0,0 +1,2 @@
export const sleep = (ms: number) =>
new Promise((resolve) => setTimeout(resolve, ms));

View file

@ -8,6 +8,7 @@ import moveLeftSpriteSheet from "../../static/sprites/move_left.png";
import moveRightSpriteSheet from "../../static/sprites/move_right.png"; import moveRightSpriteSheet from "../../static/sprites/move_right.png";
import standingSpriteSheet from "../../static/sprites/standing.png"; import standingSpriteSheet from "../../static/sprites/standing.png";
import introSpriteSheet from "../../static/sprites/intro.png"; import introSpriteSheet from "../../static/sprites/intro.png";
import throwBlueOrbSpriteSheet from "../../static/sprites/throw_blue_orb.png";
import { useRecoilValue } from "recoil"; import { useRecoilValue } from "recoil";
import { lainMoveStateAtom, lainMovingAtom } from "./LainAtom"; import { lainMoveStateAtom, lainMovingAtom } from "./LainAtom";
@ -46,68 +47,67 @@ const LainConstructor = (props: LainConstructorProps) => {
); );
}; };
export const LainIntro = () => { export const LainIntro = () => (
return ( <LainConstructor
<LainConstructor sprite={introSpriteSheet}
sprite={introSpriteSheet} frameCount={50}
frameCount={50} framesHorizontal={10}
framesHorizontal={10} framesVertical={5}
framesVertical={5} />
/> );
);
};
export const LainStanding = () => { export const LainStanding = () => (
return ( <LainConstructor
<LainConstructor sprite={standingSpriteSheet}
sprite={standingSpriteSheet} frameCount={3}
frameCount={3} framesHorizontal={3}
framesHorizontal={3} framesVertical={1}
framesVertical={1} />
/> );
);
};
export const LainMoveDown = () => { export const LainMoveDown = () => (
return ( <LainConstructor
<LainConstructor sprite={moveDownSpriteSheet}
sprite={moveDownSpriteSheet} frameCount={36}
frameCount={36} framesHorizontal={6}
framesHorizontal={6} framesVertical={6}
framesVertical={6} />
/> );
);
};
export const LainMoveLeft = () => { export const LainMoveLeft = () => (
<LainConstructor
sprite={moveLeftSpriteSheet}
frameCount={47}
framesHorizontal={8}
framesVertical={6}
/>
);
export const LainMoveRight = () => (
<LainConstructor
sprite={moveRightSpriteSheet}
frameCount={47}
framesHorizontal={8}
framesVertical={6}
/>
);
export const LainMoveUp = () => (
<LainConstructor
sprite={moveUpSpriteSheet}
frameCount={36}
framesHorizontal={6}
framesVertical={6}
/>
);
export const LainThrowBlueOrb = () => {
return ( return (
<LainConstructor <LainConstructor
sprite={moveLeftSpriteSheet} sprite={throwBlueOrbSpriteSheet}
frameCount={47} frameCount={47}
framesHorizontal={8} framesHorizontal={7}
framesVertical={6} framesVertical={7}
/>
);
};
export const LainMoveRight = () => {
return (
<LainConstructor
sprite={moveRightSpriteSheet}
frameCount={47}
framesHorizontal={8}
framesVertical={6}
/>
);
};
export const LainMoveUp = () => {
return (
<LainConstructor
sprite={moveUpSpriteSheet}
frameCount={36}
framesHorizontal={6}
framesVertical={6}
/> />
); );
}; };

View file

@ -8,7 +8,7 @@ import OrthoCamera from "../OrthoCamera/OrthoCamera";
import Preloader from "../Preloader"; import Preloader from "../Preloader";
import { useRecoilValue, useSetRecoilState } from "recoil"; import { useRecoilValue, useSetRecoilState } from "recoil";
import { lainMoveStateAtom, lainMovingAtom } from "../Lain/LainAtom"; import { lainMoveStateAtom, lainMovingAtom } from "../Lain/LainAtom";
import InputHandler from "../InputHandler"; import InputHandler from "../InputHandler/InputHandler";
import MainSceneIntro from "./MainSceneIntro"; import MainSceneIntro from "./MainSceneIntro";
import { import {
mainGroupPosYAtom, mainGroupPosYAtom,

View file

@ -10,6 +10,7 @@ import longHudSpriteSheet from "../static/sprites/long_hud.png";
import longHudMirroredSpriteSheet from "../static/sprites/long_hud_mirrored.png"; import longHudMirroredSpriteSheet from "../static/sprites/long_hud_mirrored.png";
import boringHudSpriteSheet from "../static/sprites/long_hud_boring.png"; import boringHudSpriteSheet from "../static/sprites/long_hud_boring.png";
import boringHudMirroredSpriteSheet from "../static/sprites/long_hud_boring_mirrored.png"; import boringHudMirroredSpriteSheet from "../static/sprites/long_hud_boring_mirrored.png";
import throwBlueOrbSpriteSheet from "../static/sprites/throw_blue_orb.png";
import * as THREE from "three"; import * as THREE from "three";
import { useLoader, useThree } from "react-three-fiber"; import { useLoader, useThree } from "react-three-fiber";
@ -24,6 +25,7 @@ const Preloader = () => {
const moveLeft = useLoader(THREE.TextureLoader, moveLeftSpriteSheet); const moveLeft = useLoader(THREE.TextureLoader, moveLeftSpriteSheet);
const moveRight = useLoader(THREE.TextureLoader, moveRightSpriteSheet); const moveRight = useLoader(THREE.TextureLoader, moveRightSpriteSheet);
const stand = useLoader(THREE.TextureLoader, standingSpriteSheet); const stand = useLoader(THREE.TextureLoader, standingSpriteSheet);
const throwBlueOrb = useLoader(THREE.TextureLoader, throwBlueOrbSpriteSheet);
const bigHud = useLoader(THREE.TextureLoader, bigHudSpriteSheet); const bigHud = useLoader(THREE.TextureLoader, bigHudSpriteSheet);
const bigHudMirrored = useLoader( const bigHudMirrored = useLoader(
THREE.TextureLoader, THREE.TextureLoader,
@ -54,6 +56,7 @@ const Preloader = () => {
gl.initTexture(longHudMirrored); gl.initTexture(longHudMirrored);
gl.initTexture(boringHud); gl.initTexture(boringHud);
gl.initTexture(boringHudMirrored); gl.initTexture(boringHudMirrored);
gl.initTexture(throwBlueOrb);
}, [ }, [
moveDown, moveDown,
moveUp, moveUp,
@ -68,6 +71,7 @@ const Preloader = () => {
longHud, longHud,
longHudMirrored, longHudMirrored,
intro, intro,
throwBlueOrb,
]); ]);
return null; return null;
}; };

View file

@ -51,7 +51,10 @@
"0417_right": { "0417_right": {
"id": "0413", "id": "0413",
"hud": "fg_hud_5" "hud": "fg_hud_5"
},
"0506_down": {
"id": "+0422",
"hud": "fg_hud_1"
} }
} }

View file

@ -18,5 +18,9 @@
"right": { "right": {
"frame_count": 47, "frame_count": 47,
"duration": 3903.704 "duration": 3903.704
},
"throw_blue_orb": {
"frame_count": 47,
"duration": 3903.704
} }
} }