mirror of
https://github.com/ad044/lainTSX.git
synced 2024-10-22 23:19:06 +00:00
fixed more typing.
This commit is contained in:
parent
42e73badde
commit
1fae1488b7
9 changed files with 86 additions and 49 deletions
|
@ -25,27 +25,46 @@ import OrthoCamera from "./OrthoCamera";
|
||||||
import Preloader from "./Preloader";
|
import Preloader from "./Preloader";
|
||||||
import Starfield from "./Starfield";
|
import Starfield from "./Starfield";
|
||||||
import * as THREE from "three";
|
import * as THREE from "three";
|
||||||
import Orb from "./Orb";
|
|
||||||
|
|
||||||
type KeyCodeAssociations = {
|
type KeyCodeAssociations = {
|
||||||
[keyCode: number]: string;
|
[keyCode: number]: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type SpriteDirectionData = {
|
||||||
|
[direction: string]: string;
|
||||||
|
};
|
||||||
|
|
||||||
type SpriteDirections = {
|
type SpriteDirections = {
|
||||||
[key: string]: Record<string, string>;
|
[sprite_id: string]: SpriteDirectionData;
|
||||||
|
};
|
||||||
|
|
||||||
|
type HudShapeData = {
|
||||||
|
position: number[];
|
||||||
|
scale: number[];
|
||||||
|
type: string;
|
||||||
|
initial_position: number[];
|
||||||
|
};
|
||||||
|
|
||||||
|
type SpriteHudData = {
|
||||||
|
long: HudShapeData;
|
||||||
|
boring: HudShapeData;
|
||||||
|
big: HudShapeData;
|
||||||
};
|
};
|
||||||
|
|
||||||
// will fix the typing on this later
|
|
||||||
type SpriteHuds = {
|
type SpriteHuds = {
|
||||||
[key: string]: Record<string, any> | any;
|
[sprite_hud_id: string]: SpriteHudData;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type LainAnimationData = {
|
||||||
|
frame_count: number;
|
||||||
|
duration: number;
|
||||||
|
};
|
||||||
type LainAnimations = {
|
type LainAnimations = {
|
||||||
[key: string]: Record<string, number>;
|
[sprite: string]: LainAnimationData;
|
||||||
};
|
};
|
||||||
|
|
||||||
const Game = () => {
|
const Game = () => {
|
||||||
const [isIntro, setIsIntro] = useState(true);
|
const [isIntro, setIsIntro] = useState(false);
|
||||||
|
|
||||||
const [isLainMoving, setLainMoving] = useState(false);
|
const [isLainMoving, setLainMoving] = useState(false);
|
||||||
const [lainMoveState, setLainMoveState] = useState(<LainStanding />);
|
const [lainMoveState, setLainMoveState] = useState(<LainStanding />);
|
||||||
|
@ -53,7 +72,7 @@ const Game = () => {
|
||||||
const [orthoCameraPosY, setOrthoCameraPosY] = useState(0);
|
const [orthoCameraPosY, setOrthoCameraPosY] = useState(0);
|
||||||
|
|
||||||
const [currentSprite, setCurrentSprite] = useState("0422");
|
const [currentSprite, setCurrentSprite] = useState("0422");
|
||||||
const [currentSpriteHUD, setCurrentSpriteHUD] = useState<SpriteHuds>(
|
const [currentSpriteHUD, setCurrentSpriteHUD] = useState<SpriteHudData>(
|
||||||
(level_sprite_huds as SpriteHuds)[currentSprite.substr(2)]
|
(level_sprite_huds as SpriteHuds)[currentSprite.substr(2)]
|
||||||
);
|
);
|
||||||
const [spriteUpdateCooldown, setSpriteUpdateCooldown] = useState(false);
|
const [spriteUpdateCooldown, setSpriteUpdateCooldown] = useState(false);
|
||||||
|
@ -313,19 +332,6 @@ const Game = () => {
|
||||||
[isLainMoving, currentSprite, moveDispatcher]
|
[isLainMoving, currentSprite, moveDispatcher]
|
||||||
);
|
);
|
||||||
|
|
||||||
const doIntro = useCallback(() => {
|
|
||||||
setLainMoving(true);
|
|
||||||
setLainMoveState(<LainIntro />);
|
|
||||||
updateHUD();
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
setLainMoving(false);
|
|
||||||
setLainMoveState(<LainStanding />);
|
|
||||||
setIsIntro(false);
|
|
||||||
updateHUD();
|
|
||||||
}, (lain_animations as LainAnimations)["intro"]["duration"]);
|
|
||||||
}, [updateHUD]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
window.addEventListener("keydown", handleKeyPress);
|
window.addEventListener("keydown", handleKeyPress);
|
||||||
|
|
||||||
|
@ -351,13 +357,30 @@ const Game = () => {
|
||||||
if (groupRef.current!.position.y > 0) {
|
if (groupRef.current!.position.y > 0) {
|
||||||
groupRef.current!.position.y -= 0.015;
|
groupRef.current!.position.y -= 0.015;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (groupRef.current!.position.z < 0) {
|
if (groupRef.current!.position.z < 0) {
|
||||||
groupRef.current!.position.z += 0.04;
|
groupRef.current!.position.z += 0.04;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if the rotation hits this value that means that the intro is finished.
|
||||||
|
// using a settimeout or something similar resulted in clunkiness, since it was dependant
|
||||||
|
// on load times.
|
||||||
|
if (parseFloat(groupRef.current!.rotation.x.toPrecision(2)) === -0.005) {
|
||||||
|
updateHUD();
|
||||||
|
setLainMoving(false);
|
||||||
|
setLainMoveState(<LainStanding />);
|
||||||
|
setIsIntro(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
useEffect(doIntro, []);
|
// on load, move the hud to the right (out of vision), and set lain sprite to intro
|
||||||
|
useEffect(() => {
|
||||||
|
setIsIntro(true);
|
||||||
|
updateHUD();
|
||||||
|
setLainMoving(true);
|
||||||
|
setLainMoveState(<LainIntro />);
|
||||||
|
}, [updateHUD]);
|
||||||
|
|
||||||
// pos-z ? => 3
|
// pos-z ? => 3
|
||||||
// rot-x 1.5 => 0
|
// rot-x 1.5 => 0
|
||||||
|
@ -391,12 +414,19 @@ const Game = () => {
|
||||||
longHUDType={currentSpriteHUD!["long"]["type"]}
|
longHUDType={currentSpriteHUD!["long"]["type"]}
|
||||||
boringHUDType={currentSpriteHUD!["boring"]["type"]}
|
boringHUDType={currentSpriteHUD!["boring"]["type"]}
|
||||||
bigHUDType={currentSpriteHUD!["big"]["type"]}
|
bigHUDType={currentSpriteHUD!["big"]["type"]}
|
||||||
longHUDScale={currentSpriteHUD!["long"]["scale"]}
|
longHUDScale={
|
||||||
boringHUDScale={currentSpriteHUD!["boring"]["scale"]}
|
currentSpriteHUD!["long"]["scale"] as [number, number, number]
|
||||||
bigHUDScale={currentSpriteHUD!["big"]["scale"]}
|
}
|
||||||
|
boringHUDScale={
|
||||||
|
currentSpriteHUD!["boring"]["scale"] as [number, number, number]
|
||||||
|
}
|
||||||
|
bigHUDScale={
|
||||||
|
currentSpriteHUD!["big"]["scale"] as [number, number, number]
|
||||||
|
}
|
||||||
orthoCameraPosY={orthoCameraPosY}
|
orthoCameraPosY={orthoCameraPosY}
|
||||||
id={currentSpriteHUD!["id"]}
|
id={currentSprite}
|
||||||
orbVisibility={!isIntro}
|
orbVisibility={!isIntro}
|
||||||
|
hudVisibility={!isIntro}
|
||||||
/>
|
/>
|
||||||
<Starfield starfieldPosY={starfieldPosY} />
|
<Starfield starfieldPosY={starfieldPosY} />
|
||||||
<Lights />
|
<Lights />
|
||||||
|
|
|
@ -7,7 +7,6 @@ import longHud from "../static/sprites/long_hud.png";
|
||||||
import longHudMirrored from "../static/sprites/long_hud_mirrored.png";
|
import longHudMirrored from "../static/sprites/long_hud_mirrored.png";
|
||||||
import boringHud from "../static/sprites/long_hud_boring.png";
|
import boringHud from "../static/sprites/long_hud_boring.png";
|
||||||
import boringHudMirrored from "../static/sprites/long_hud_boring_mirrored.png";
|
import boringHudMirrored from "../static/sprites/long_hud_boring_mirrored.png";
|
||||||
import { PositionAndScaleProps } from "./Hub";
|
|
||||||
import { a, Interpolation } from "@react-spring/three";
|
import { a, Interpolation } from "@react-spring/three";
|
||||||
|
|
||||||
export type HUDElementProps = {
|
export type HUDElementProps = {
|
||||||
|
@ -17,17 +16,19 @@ export type HUDElementProps = {
|
||||||
|
|
||||||
longHUDPosYZ: [number, number];
|
longHUDPosYZ: [number, number];
|
||||||
longHUDPosX: Interpolation<number, number>;
|
longHUDPosX: Interpolation<number, number>;
|
||||||
longHUDScale: PositionAndScaleProps;
|
longHUDScale: [number, number, number];
|
||||||
|
|
||||||
// boringHudPosition: PositionAndScaleProps;
|
// boringHudPosition: [number, number, number];
|
||||||
boringHUDPosX: Interpolation<number, number>;
|
boringHUDPosX: Interpolation<number, number>;
|
||||||
boringHUDPosYZ: [number, number];
|
boringHUDPosYZ: [number, number];
|
||||||
boringHUDScale: PositionAndScaleProps;
|
boringHUDScale: [number, number, number];
|
||||||
|
|
||||||
// bigHudPosition: PositionAndScaleProps;
|
// bigHudPosition: [number, number, number];
|
||||||
bigHUDPosX: Interpolation<number, number>;
|
bigHUDPosX: Interpolation<number, number>;
|
||||||
bigHUDPosYZ: [number, number];
|
bigHUDPosYZ: [number, number];
|
||||||
bigHUDScale: PositionAndScaleProps;
|
bigHUDScale: [number, number, number];
|
||||||
|
|
||||||
|
hudVisibility: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
const HUDElement = memo((props: HUDElementProps) => {
|
const HUDElement = memo((props: HUDElementProps) => {
|
||||||
|
@ -74,7 +75,7 @@ const HUDElement = memo((props: HUDElementProps) => {
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<group visible={props.hudVisibility}>
|
||||||
<a.sprite
|
<a.sprite
|
||||||
position-y={props.longHUDPosYZ[0]}
|
position-y={props.longHUDPosYZ[0]}
|
||||||
position-z={props.longHUDPosYZ[1]}
|
position-z={props.longHUDPosYZ[1]}
|
||||||
|
@ -111,7 +112,7 @@ const HUDElement = memo((props: HUDElementProps) => {
|
||||||
transparent={true}
|
transparent={true}
|
||||||
/>
|
/>
|
||||||
</a.sprite>
|
</a.sprite>
|
||||||
</>
|
</group>
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,6 @@ import GrayRing from "./GrayRing";
|
||||||
import LevelSprite from "./LevelSprite";
|
import LevelSprite from "./LevelSprite";
|
||||||
import PurpleRing from "./PurpleRing";
|
import PurpleRing from "./PurpleRing";
|
||||||
|
|
||||||
export type PositionAndScaleProps = [number, number, number];
|
|
||||||
export type RotationProps = [number, number, number, (string | undefined)?];
|
|
||||||
|
|
||||||
type HubProps = {
|
type HubProps = {
|
||||||
currentSprite: string;
|
currentSprite: string;
|
||||||
};
|
};
|
||||||
|
@ -23,9 +20,16 @@ const Hub = (props: HubProps) => {
|
||||||
{Object.values(level_sprites).map((sprite) => {
|
{Object.values(level_sprites).map((sprite) => {
|
||||||
return (
|
return (
|
||||||
<LevelSprite
|
<LevelSprite
|
||||||
position={sprite.position as PositionAndScaleProps}
|
position={sprite.position as [number, number, number]}
|
||||||
scale={sprite.scale as PositionAndScaleProps}
|
scale={sprite.scale as [number, number, number]}
|
||||||
rotation={sprite.rotation as RotationProps}
|
rotation={
|
||||||
|
sprite.rotation as [
|
||||||
|
number,
|
||||||
|
number,
|
||||||
|
number,
|
||||||
|
(string | undefined)?
|
||||||
|
]
|
||||||
|
}
|
||||||
sprite={sprite.sprite}
|
sprite={sprite.sprite}
|
||||||
key={sprite.id}
|
key={sprite.id}
|
||||||
active={sprite.id === props.currentSprite}
|
active={sprite.id === props.currentSprite}
|
||||||
|
|
|
@ -23,6 +23,7 @@ type LainConstructorProps = {
|
||||||
framesHorizontal: number;
|
framesHorizontal: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
const LainConstructor = (props: LainConstructorProps) => {
|
const LainConstructor = (props: LainConstructorProps) => {
|
||||||
// any here temporarily
|
// any here temporarily
|
||||||
const lainSpriteTexture: any = useLoader(THREE.TextureLoader, props.sprite);
|
const lainSpriteTexture: any = useLoader(THREE.TextureLoader, props.sprite);
|
||||||
|
|
|
@ -40,8 +40,8 @@ const LevelSprite = memo((props: LevelSpriteConstructorProps) => {
|
||||||
|
|
||||||
const spriteSheet = spriteToPath(props.sprite);
|
const spriteSheet = spriteToPath(props.sprite);
|
||||||
|
|
||||||
const nonActiveTexture: any = useLoader(THREE.TextureLoader, spriteSheet[0]);
|
const nonActiveTexture = useLoader(THREE.TextureLoader, spriteSheet[0]);
|
||||||
const activeTexture: any = useLoader(THREE.TextureLoader, spriteSheet[1]);
|
const activeTexture = useLoader(THREE.TextureLoader, spriteSheet[1]);
|
||||||
|
|
||||||
const uniforms = useMemo(
|
const uniforms = useMemo(
|
||||||
() => ({
|
() => ({
|
||||||
|
|
|
@ -16,7 +16,7 @@ const Orb = memo((props: OrbProps) => {
|
||||||
const [orbDirection, setOrbDirection] = useState("left");
|
const [orbDirection, setOrbDirection] = useState("left");
|
||||||
const [currentCurve, setCurrentCurve] = useState("first");
|
const [currentCurve, setCurrentCurve] = useState("first");
|
||||||
|
|
||||||
const orbSpriteTexture: any = useLoader(THREE.TextureLoader, orbSprite);
|
const orbSpriteTexture = useLoader(THREE.TextureLoader, orbSprite);
|
||||||
|
|
||||||
// first one goes from up to down left to right
|
// first one goes from up to down left to right
|
||||||
const firstCurve = new THREE.QuadraticBezierCurve3(
|
const firstCurve = new THREE.QuadraticBezierCurve3(
|
||||||
|
|
|
@ -7,7 +7,7 @@ import Orb from "./Orb";
|
||||||
interface OrthoCameraProps extends HUDElementProps {
|
interface OrthoCameraProps extends HUDElementProps {
|
||||||
id: string;
|
id: string;
|
||||||
orthoCameraPosY: number;
|
orthoCameraPosY: number;
|
||||||
orbVisibility:boolean;
|
orbVisibility: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
const OrthoCamera = (props: OrthoCameraProps) => {
|
const OrthoCamera = (props: OrthoCameraProps) => {
|
||||||
|
@ -43,8 +43,9 @@ const OrthoCamera = (props: OrthoCameraProps) => {
|
||||||
bigHUDPosX={props.bigHUDPosX}
|
bigHUDPosX={props.bigHUDPosX}
|
||||||
bigHUDScale={props.bigHUDScale}
|
bigHUDScale={props.bigHUDScale}
|
||||||
key={props.id}
|
key={props.id}
|
||||||
|
hudVisibility={props.hudVisibility}
|
||||||
/>
|
/>
|
||||||
<Orb orbVisibility={props.orbVisibility}/>
|
<Orb orbVisibility={props.orbVisibility} />
|
||||||
</orthographicCamera>
|
</orthographicCamera>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import introSpriteSheet from "../static/sprites/intro.png";
|
||||||
import moveDownSpriteSheet from "../static/sprites/jump_down.png";
|
import moveDownSpriteSheet from "../static/sprites/jump_down.png";
|
||||||
import moveUpSpriteSheet from "../static/sprites/jump_up.png";
|
import moveUpSpriteSheet from "../static/sprites/jump_up.png";
|
||||||
import standingSpriteSheet from "../static/sprites/standing.png";
|
import standingSpriteSheet from "../static/sprites/standing.png";
|
||||||
|
@ -9,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 * as THREE from "three";
|
import * as THREE from "three";
|
||||||
import { useLoader, useThree } from "react-three-fiber";
|
import { useLoader, useThree } from "react-three-fiber";
|
||||||
import { useLayoutEffect } from "react";
|
import { useLayoutEffect } from "react";
|
||||||
|
@ -16,6 +18,7 @@ import { useLayoutEffect } from "react";
|
||||||
// this function just preloads lain's spritesheets and other assets cuz they're big and lazy loading them
|
// this function just preloads lain's spritesheets and other assets cuz they're big and lazy loading them
|
||||||
// used to make the suspense run for a couple milliseconds, resulting in flickering
|
// used to make the suspense run for a couple milliseconds, resulting in flickering
|
||||||
const Preloader = () => {
|
const Preloader = () => {
|
||||||
|
const intro = useLoader(THREE.TextureLoader, introSpriteSheet);
|
||||||
const moveDown = useLoader(THREE.TextureLoader, moveDownSpriteSheet);
|
const moveDown = useLoader(THREE.TextureLoader, moveDownSpriteSheet);
|
||||||
const moveUp = useLoader(THREE.TextureLoader, moveUpSpriteSheet);
|
const moveUp = useLoader(THREE.TextureLoader, moveUpSpriteSheet);
|
||||||
const moveLeft = useLoader(THREE.TextureLoader, moveLeftSpriteSheet);
|
const moveLeft = useLoader(THREE.TextureLoader, moveLeftSpriteSheet);
|
||||||
|
@ -39,6 +42,7 @@ const Preloader = () => {
|
||||||
|
|
||||||
const { gl } = useThree();
|
const { gl } = useThree();
|
||||||
useLayoutEffect(() => {
|
useLayoutEffect(() => {
|
||||||
|
gl.initTexture(intro);
|
||||||
gl.initTexture(moveDown);
|
gl.initTexture(moveDown);
|
||||||
gl.initTexture(moveUp);
|
gl.initTexture(moveUp);
|
||||||
gl.initTexture(moveLeft);
|
gl.initTexture(moveLeft);
|
||||||
|
@ -63,6 +67,7 @@ const Preloader = () => {
|
||||||
boringHudMirrored,
|
boringHudMirrored,
|
||||||
longHud,
|
longHud,
|
||||||
longHudMirrored,
|
longHudMirrored,
|
||||||
|
intro,
|
||||||
]);
|
]);
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
{
|
{
|
||||||
"22": {
|
"22": {
|
||||||
"id": "22hud",
|
|
||||||
"long": {
|
"long": {
|
||||||
"position": [-0.45, 0.15, -8.6],
|
"position": [-0.45, 0.15, -8.6],
|
||||||
"scale": [1, 0.03, 1],
|
"scale": [1, 0.03, 1],
|
||||||
|
@ -21,7 +20,6 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"14": {
|
"14": {
|
||||||
"id": "14hud",
|
|
||||||
"long": {
|
"long": {
|
||||||
"position": [-0.45, -0.09, -8.6],
|
"position": [-0.45, -0.09, -8.6],
|
||||||
"scale": [1, 0.03, 1],
|
"scale": [1, 0.03, 1],
|
||||||
|
@ -42,7 +40,6 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"13": {
|
"13": {
|
||||||
"id": "13hud",
|
|
||||||
"long": {
|
"long": {
|
||||||
"position": [0.85, -0.09, -8.6],
|
"position": [0.85, -0.09, -8.6],
|
||||||
"scale": [1, 0.03, 1],
|
"scale": [1, 0.03, 1],
|
||||||
|
@ -63,7 +60,6 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"05": {
|
"05": {
|
||||||
"id": "05hud",
|
|
||||||
"long": {
|
"long": {
|
||||||
"position": [0.85, -0.32, -8.6],
|
"position": [0.85, -0.32, -8.6],
|
||||||
"scale": [1, 0.03, 1],
|
"scale": [1, 0.03, 1],
|
||||||
|
@ -84,7 +80,6 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"06": {
|
"06": {
|
||||||
"id": "06hud",
|
|
||||||
"long": {
|
"long": {
|
||||||
"position": [-0.43, -0.32, -8.6],
|
"position": [-0.43, -0.32, -8.6],
|
||||||
"scale": [1, 0.03, 1],
|
"scale": [1, 0.03, 1],
|
||||||
|
|
Loading…
Reference in a new issue