mirror of
https://github.com/ad044/lainTSX.git
synced 2024-10-22 23:19:06 +00:00
reverted some stuff, fixed a couple bugs
This commit is contained in:
parent
40545c74a5
commit
c6040ba5cb
10 changed files with 156 additions and 82 deletions
|
@ -342,7 +342,6 @@ const Pause = (props: { visible: boolean }) => {
|
||||||
depthTest={false}
|
depthTest={false}
|
||||||
/>
|
/>
|
||||||
</mesh>
|
</mesh>
|
||||||
<MainSceneEventManager loaded={!exit} />
|
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
) : (
|
) : (
|
||||||
|
|
|
@ -7,6 +7,8 @@ import Starfield from "./SyncedComponents/Starfield";
|
||||||
import Site from "./SyncedComponents/Site";
|
import Site from "./SyncedComponents/Site";
|
||||||
import MiddleRing from "./SyncedComponents/MiddleRing";
|
import MiddleRing from "./SyncedComponents/MiddleRing";
|
||||||
import MainSceneEventManager from "../../core/StateManagers/MainSceneEventManager";
|
import MainSceneEventManager from "../../core/StateManagers/MainSceneEventManager";
|
||||||
|
import Pause from "./PauseSubscene/Pause";
|
||||||
|
import { a } from "@react-spring/three";
|
||||||
|
|
||||||
type SyncedComponentLoaderProps = {
|
type SyncedComponentLoaderProps = {
|
||||||
paused: boolean;
|
paused: boolean;
|
||||||
|
@ -46,11 +48,15 @@ const SyncedComponentLoader = (props: SyncedComponentLoaderProps) => {
|
||||||
<GrayPlanes />
|
<GrayPlanes />
|
||||||
</group>
|
</group>
|
||||||
<Starfield
|
<Starfield
|
||||||
|
visible={!props.paused}
|
||||||
shouldIntro={props.shouldIntro}
|
shouldIntro={props.shouldIntro}
|
||||||
introFinished={introFinished}
|
introFinished={introFinished}
|
||||||
/>
|
/>
|
||||||
|
<Pause visible={props.paused} />
|
||||||
<Site shouldIntro={props.shouldIntro} introFinished={introFinished} />
|
<Site shouldIntro={props.shouldIntro} introFinished={introFinished} />
|
||||||
<MainSceneEventManager loaded={visible} />
|
<MainSceneEventManager
|
||||||
|
loaded={props.shouldIntro ? introFinished : true}
|
||||||
|
/>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,6 +2,7 @@ import React, { useEffect, useState } from "react";
|
||||||
import Star from "./Starfield/Star";
|
import Star from "./Starfield/Star";
|
||||||
|
|
||||||
type StarfieldProps = {
|
type StarfieldProps = {
|
||||||
|
visible: boolean;
|
||||||
shouldIntro: boolean;
|
shouldIntro: boolean;
|
||||||
introFinished: boolean;
|
introFinished: boolean;
|
||||||
};
|
};
|
||||||
|
@ -52,7 +53,7 @@ const Starfield = (props: StarfieldProps) => {
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<group visible={props.visible}>
|
||||||
<group
|
<group
|
||||||
position={[0, -1, 2]}
|
position={[0, -1, 2]}
|
||||||
visible={props.shouldIntro ? mainVisible : true}
|
visible={props.shouldIntro ? mainVisible : true}
|
||||||
|
@ -125,7 +126,7 @@ const Starfield = (props: StarfieldProps) => {
|
||||||
) : (
|
) : (
|
||||||
<></>
|
<></>
|
||||||
)}
|
)}
|
||||||
</>
|
</group>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -5,13 +5,13 @@ import * as THREE from "three";
|
||||||
import { useLoader } from "react-three-fiber";
|
import { useLoader } from "react-three-fiber";
|
||||||
import orange_font_json from "../../resources/font_data/big_font.json";
|
import orange_font_json from "../../resources/font_data/big_font.json";
|
||||||
import { a, useSpring } from "@react-spring/three";
|
import { a, useSpring } from "@react-spring/three";
|
||||||
import React, { useEffect, useMemo } from "react";
|
import React, { useMemo } from "react";
|
||||||
import { useBigTextStore } from "../../store";
|
|
||||||
|
|
||||||
const BigLetter = (props: {
|
const BigLetter = (props: {
|
||||||
color: string;
|
color: string;
|
||||||
letter: string;
|
letter: string;
|
||||||
letterIdx: number;
|
letterIdx: number;
|
||||||
|
xOffsetCoeff: number;
|
||||||
}) => {
|
}) => {
|
||||||
const colorToTexture = (color: string) => {
|
const colorToTexture = (color: string) => {
|
||||||
const colorTexture = {
|
const colorTexture = {
|
||||||
|
@ -89,23 +89,15 @@ const BigLetter = (props: {
|
||||||
return geometry;
|
return geometry;
|
||||||
}, [letterData, lineYOffsets, props.letter]);
|
}, [letterData, lineYOffsets, props.letter]);
|
||||||
|
|
||||||
const [{ letterOffsetX }, set] = useSpring(() => ({
|
const textRendererState = useSpring({
|
||||||
letterOffsetX: props.letterIdx + 0.3 + (props.letterIdx + 0.3),
|
letterOffsetXCoeff:
|
||||||
|
props.letterIdx + 0.3 + (props.letterIdx + 0.3) * props.xOffsetCoeff,
|
||||||
config: { duration: 200 },
|
config: { duration: 200 },
|
||||||
}));
|
});
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
useBigTextStore.subscribe(set, (state) => ({
|
|
||||||
letterOffsetX:
|
|
||||||
props.letterIdx +
|
|
||||||
0.3 +
|
|
||||||
(props.letterIdx + 0.3) * state.transformState.xOffset,
|
|
||||||
}));
|
|
||||||
}, [props.letterIdx, set]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<a.mesh
|
<a.mesh
|
||||||
position-x={letterOffsetX}
|
position-x={textRendererState.letterOffsetXCoeff}
|
||||||
position-y={-letterData[4] / 12.5}
|
position-y={-letterData[4] / 12.5}
|
||||||
scale={[1, 1, 0]}
|
scale={[1, 1, 0]}
|
||||||
geometry={geom}
|
geometry={geom}
|
||||||
|
|
|
@ -1,24 +1,17 @@
|
||||||
import React, { useEffect, useRef } from "react";
|
import React from "react";
|
||||||
import { useMediaBigTextStore } from "../../store";
|
import { useMediaBigTextStore } from "../../store";
|
||||||
import { a, useTrail } from "@react-spring/three";
|
import { a, useTrail } from "@react-spring/three";
|
||||||
import BigLetter from "./BigLetter";
|
import BigLetter from "./BigLetter";
|
||||||
|
|
||||||
const MediaYellowTextAnimator = () => {
|
const MediaYellowTextAnimator = () => {
|
||||||
const textArrRef = useRef(useMediaBigTextStore.getState().text.split(""));
|
const transformState = useMediaBigTextStore((state) => state.transformState);
|
||||||
|
const textArr = useMediaBigTextStore((state) => state.text).split("");
|
||||||
|
|
||||||
const [trail, set] = useTrail(textArrRef.current.length, () => ({
|
const trail = useTrail(textArr.length, {
|
||||||
posX: 0,
|
posX: transformState.posX,
|
||||||
posY: 0,
|
posY: transformState.posY,
|
||||||
xOffset: 0,
|
config: { duration: 280 },
|
||||||
config: { duration: 200 },
|
});
|
||||||
}));
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
useMediaBigTextStore.subscribe(set, (state) => ({
|
|
||||||
posX: state.transformState.posX,
|
|
||||||
posY: state.transformState.posY,
|
|
||||||
}));
|
|
||||||
}, [set]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<group position={[0, 0, 10]}>
|
<group position={[0, 0, 10]}>
|
||||||
|
@ -32,7 +25,8 @@ const MediaYellowTextAnimator = () => {
|
||||||
>
|
>
|
||||||
<BigLetter
|
<BigLetter
|
||||||
color={"yellow"}
|
color={"yellow"}
|
||||||
letter={textArrRef.current[idx]}
|
xOffsetCoeff={transformState.xOffset}
|
||||||
|
letter={textArr[idx]}
|
||||||
letterIdx={idx}
|
letterIdx={idx}
|
||||||
key={idx}
|
key={idx}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -1,30 +1,66 @@
|
||||||
import React, { useEffect, useRef } from "react";
|
import React, { useEffect, useRef } from "react";
|
||||||
import { BigTextState, useBigTextStore, useNodeStore } from "../../store";
|
import { BigTextState, useBigTextStore } from "../../store";
|
||||||
import { a, useSpring, useTrail } from "@react-spring/three";
|
import { a, useSpring, useTrail } from "@react-spring/three";
|
||||||
import BigLetter from "./BigLetter";
|
import BigLetter from "./BigLetter";
|
||||||
|
|
||||||
const YellowTextRenderer = () => {
|
const YellowTextRenderer = (props: { visible?: boolean }) => {
|
||||||
|
const disableTrail = useBigTextStore((state) => state.disableTrail);
|
||||||
|
const transformState = useBigTextStore((state) => state.transformState);
|
||||||
|
|
||||||
const visible = useBigTextStore((state) => state.visible);
|
const visible = useBigTextStore((state) => state.visible);
|
||||||
const color = useBigTextStore((state) => state.color);
|
const color = useBigTextStore((state) => state.color);
|
||||||
|
|
||||||
const textArrRef = useRef(useBigTextStore.getState().text.split(""));
|
const textArrRef = useRef(useBigTextStore.getState().text.split(""));
|
||||||
|
|
||||||
const [trail, set] = useTrail(textArrRef.current.length, () => ({
|
const transformRef = useRef(useBigTextStore.getState().transformState);
|
||||||
posX: 0,
|
|
||||||
posY: 0,
|
|
||||||
config: { duration: 280 },
|
|
||||||
}));
|
|
||||||
|
|
||||||
useEffect(() => {
|
// this is used to animate the letters moving one after another
|
||||||
useBigTextStore.subscribe(set, (state) => ({
|
const trail = useTrail(textArrRef.current.length, {
|
||||||
posX: state.transformState.posX,
|
posX: transformRef.current.posX,
|
||||||
posY: state.transformState.posY,
|
posY: transformRef.current.posY,
|
||||||
}));
|
config: { duration: 280 },
|
||||||
}, [set]);
|
});
|
||||||
|
|
||||||
|
// this is used when the whole GROUP itself needs to be animated
|
||||||
|
const spring = useSpring({
|
||||||
|
posX: transformState.posX,
|
||||||
|
posY: transformState.posY,
|
||||||
|
config: { duration: 1200 },
|
||||||
|
});
|
||||||
|
|
||||||
|
useEffect(
|
||||||
|
() =>
|
||||||
|
useBigTextStore.subscribe(
|
||||||
|
(state) => {
|
||||||
|
transformRef.current = (state as BigTextState).transformState;
|
||||||
|
textArrRef.current = (state as BigTextState).text.split("");
|
||||||
|
},
|
||||||
|
(state) => state
|
||||||
|
),
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<group position={[0, 0, 10]} visible={visible}>
|
<group position={[0, 0, 10]} visible={props.visible && visible}>
|
||||||
{trail.map(({ posX, posY }, idx) => (
|
{disableTrail
|
||||||
|
? textArrRef.current.map((letter, idx) => (
|
||||||
|
<a.group
|
||||||
|
key={idx}
|
||||||
|
position-x={spring.posX}
|
||||||
|
position-y={spring.posY}
|
||||||
|
position-z={-8.7}
|
||||||
|
scale={[0.04, 0.06, 0.04]}
|
||||||
|
>
|
||||||
|
<BigLetter
|
||||||
|
color={color}
|
||||||
|
xOffsetCoeff={0}
|
||||||
|
letter={textArrRef.current[idx]}
|
||||||
|
letterIdx={idx}
|
||||||
|
key={idx}
|
||||||
|
/>
|
||||||
|
</a.group>
|
||||||
|
))
|
||||||
|
: trail.map(({ posX, posY }, idx) => (
|
||||||
<a.group
|
<a.group
|
||||||
key={idx}
|
key={idx}
|
||||||
position-x={posX}
|
position-x={posX}
|
||||||
|
@ -34,6 +70,7 @@ const YellowTextRenderer = () => {
|
||||||
>
|
>
|
||||||
<BigLetter
|
<BigLetter
|
||||||
color={color}
|
color={color}
|
||||||
|
xOffsetCoeff={transformRef.current.xOffset}
|
||||||
letter={textArrRef.current[idx]}
|
letter={textArrRef.current[idx]}
|
||||||
letterIdx={idx}
|
letterIdx={idx}
|
||||||
key={idx}
|
key={idx}
|
||||||
|
|
|
@ -23,6 +23,7 @@ import PauseComponentManager from "./MainSceneManagers/PauseComponentManager";
|
||||||
import GameSaver from "./GameManagers/GameSaver";
|
import GameSaver from "./GameManagers/GameSaver";
|
||||||
import GameLoader from "./GameManagers/GameLoader";
|
import GameLoader from "./GameManagers/GameLoader";
|
||||||
import IdleManager from "./MainSceneManagers/IdleManager";
|
import IdleManager from "./MainSceneManagers/IdleManager";
|
||||||
|
import { useFrame } from "react-three-fiber";
|
||||||
|
|
||||||
type MainSceneEventManagerProps = {
|
type MainSceneEventManagerProps = {
|
||||||
loaded: boolean;
|
loaded: boolean;
|
||||||
|
@ -49,6 +50,48 @@ const MainSceneEventManager = (props: MainSceneEventManagerProps) => {
|
||||||
|
|
||||||
const [eventState, setEventState] = useState<any>();
|
const [eventState, setEventState] = useState<any>();
|
||||||
|
|
||||||
|
useFrame(() => {
|
||||||
|
const now = Date.now();
|
||||||
|
if (
|
||||||
|
timePassedSinceLastKeyPress.current > -1 &&
|
||||||
|
mainSubscene !== "pause" &&
|
||||||
|
mainSubscene !== "level_selection"
|
||||||
|
) {
|
||||||
|
if (now > timePassedSinceLastKeyPress.current + 5000) {
|
||||||
|
setEventState({
|
||||||
|
event: "play_idle_media",
|
||||||
|
scene: "idle_media",
|
||||||
|
site: currentSite,
|
||||||
|
});
|
||||||
|
timePassedSinceLastKeyPress.current = -1;
|
||||||
|
} else if (now > timePassedSinceLastKeyPress.current + 10000) {
|
||||||
|
const moves = [
|
||||||
|
"prayer",
|
||||||
|
"touch_sleeve",
|
||||||
|
"thinking",
|
||||||
|
"stretch_2",
|
||||||
|
"stretch",
|
||||||
|
"spin",
|
||||||
|
"scratch_head",
|
||||||
|
"blush",
|
||||||
|
"hands_behind_head",
|
||||||
|
"hands_on_hips",
|
||||||
|
"hands_on_hips_2",
|
||||||
|
"hands_together",
|
||||||
|
"lean_forward",
|
||||||
|
"lean_left",
|
||||||
|
"lean_right",
|
||||||
|
"look_around",
|
||||||
|
"play_with_hair",
|
||||||
|
];
|
||||||
|
|
||||||
|
const event = moves[Math.floor(Math.random() * moves.length)];
|
||||||
|
setEventState({ event: event });
|
||||||
|
timePassedSinceLastKeyPress.current = now - 2500;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const handleKeyPress = useCallback(
|
const handleKeyPress = useCallback(
|
||||||
(event) => {
|
(event) => {
|
||||||
const { keyCode } = event;
|
const { keyCode } = event;
|
||||||
|
@ -70,6 +113,7 @@ const MainSceneEventManager = (props: MainSceneEventManagerProps) => {
|
||||||
gameProgress: gameProgress,
|
gameProgress: gameProgress,
|
||||||
currentSite: currentSite,
|
currentSite: currentSite,
|
||||||
});
|
});
|
||||||
|
|
||||||
setEventState(event);
|
setEventState(event);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -102,6 +102,7 @@ const YellowTextManager = (props: StateManagerProps) => {
|
||||||
// unshrink text
|
// unshrink text
|
||||||
setTransformState(0, "xOffset");
|
setTransformState(0, "xOffset");
|
||||||
}, 1200);
|
}, 1200);
|
||||||
|
|
||||||
},
|
},
|
||||||
[setText, setTransformState, siteData]
|
[setText, setTransformState, siteData]
|
||||||
);
|
);
|
||||||
|
|
|
@ -30,7 +30,6 @@ const MainScene = () => {
|
||||||
<Suspense fallback={null}>
|
<Suspense fallback={null}>
|
||||||
<a.group>
|
<a.group>
|
||||||
<Preloader />
|
<Preloader />
|
||||||
<Pause visible={isPaused} />
|
|
||||||
<LevelSelection />
|
<LevelSelection />
|
||||||
<SyncedComponentLoader paused={isPaused} shouldIntro={shouldIntro} />
|
<SyncedComponentLoader paused={isPaused} shouldIntro={shouldIntro} />
|
||||||
<OrbitControls />
|
<OrbitControls />
|
||||||
|
|
|
@ -75,22 +75,23 @@ const MediaScene = () => {
|
||||||
))}
|
))}
|
||||||
</group>
|
</group>
|
||||||
<MediaYellowTextAnimator />
|
<MediaYellowTextAnimator />
|
||||||
{activeNodeMedia.includes("XA") || idleMedia.includes("XA") ? (
|
|
||||||
<>
|
<group
|
||||||
{currentScene !== "idle_media" ? (
|
visible={
|
||||||
<>
|
currentScene !== "idle_media" && activeNodeMedia.includes("XA")
|
||||||
|
}
|
||||||
|
>
|
||||||
<RightSide activeMediaComponent={activeMediaComponent} />
|
<RightSide activeMediaComponent={activeMediaComponent} />
|
||||||
<Lof />
|
<Lof />
|
||||||
<AudioVisualizer />
|
<AudioVisualizer />
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
<></>
|
|
||||||
)}
|
|
||||||
<Images />
|
<Images />
|
||||||
</>
|
</group>
|
||||||
) : (
|
|
||||||
<></>
|
<group
|
||||||
)}
|
visible={currentScene === "idle_media" && idleMedia.includes("XA")}
|
||||||
|
>
|
||||||
|
<Images />
|
||||||
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<MediaSceneEventManager />
|
<MediaSceneEventManager />
|
||||||
</perspectiveCamera>
|
</perspectiveCamera>
|
||||||
|
|
Loading…
Reference in a new issue