added huds for all 4 current sprites, cleaned up some code

This commit is contained in:
ad044 2020-09-01 01:39:25 +04:00
parent 9d7e17bf8f
commit 01a62a05d0
10 changed files with 253 additions and 100 deletions

View file

@ -1,24 +1,23 @@
import { a, useSpring, update } from "@react-spring/three"; import { a, useSpring } from "@react-spring/three";
//import Orb from "./Orb"; //import Orb from "./Orb";
import { OrbitControls } from "drei"; import { OrbitControls } from "drei";
import React, { import React, {
Suspense, Suspense,
useCallback, useCallback,
useEffect, useEffect,
useState, useState
useRef,
} from "react"; } from "react";
import { Canvas } from "react-three-fiber"; import { Canvas } from "react-three-fiber";
import lain_animations from "../resources/lain_animations.json"; import lain_animations from "../resources/lain_animations.json";
import level_sprite_directions from "../resources/level_sprite_directions.json"; import level_sprite_directions from "../resources/level_sprite_directions.json";
import level_sprite_huds from "../resources/level_sprite_huds.json"; import level_sprite_huds from "../resources/level_sprite_huds.json";
import Hub, { PositionAndScaleProps } from "./Hub"; import Hub from "./Hub";
import Lain, { import Lain, {
LainMoveDown, LainMoveDown,
LainMoveLeft, LainMoveLeft,
LainMoveRight, LainMoveRight,
LainMoveUp, LainMoveUp,
LainStanding, LainStanding
} from "./Lain"; } from "./Lain";
import Lights from "./Lights"; import Lights from "./Lights";
import OrthoCamera from "./OrthoCamera"; import OrthoCamera from "./OrthoCamera";
@ -45,18 +44,44 @@ const Game = () => {
const [isLainMoving, setLainMoving] = useState(false); const [isLainMoving, setLainMoving] = useState(false);
const [lainMoveState, setLainMoveState] = useState(<LainStanding />); const [lainMoveState, setLainMoveState] = useState(<LainStanding />);
const [currentSprite, setCurrentSprite] = useState("043"); const [currentSprite, setCurrentSprite] = useState("0422");
const [currentSpriteHUD, setCurrentSpriteHUD] = useState<SpriteHuds>( const [currentSpriteHUD, setCurrentSpriteHUD] = useState<SpriteHuds>(
(level_sprite_huds as SpriteHuds)[currentSprite] (level_sprite_huds as SpriteHuds)[currentSprite]
); );
const [longHUDActive, setLongHUDActive] = useState(1); const [HUDActive, setHUDActive] = useState(1);
const { longHUDPositionX } = useSpring({ const { bigHUDPositionX } = useSpring({
longHUDPositionX: longHUDActive, bigHUDPositionX: HUDActive,
config: { duration: 500 }, config: { duration: 500 },
}); });
const { longHUDPositionX } = useSpring({
longHUDPositionX: HUDActive,
config: { duration: 500 },
});
const { boringHUDPositionX } = useSpring({
boringHUDPositionX: HUDActive,
config: { duration: 500 },
});
const bigHUDPosX = bigHUDPositionX.to(
[0, 1],
[
currentSpriteHUD["big"]["initial_position"][0],
currentSpriteHUD["big"]["position"][0],
]
);
const boringHUDPosX = boringHUDPositionX.to(
[0, 1],
[
currentSpriteHUD["boring"]["initial_position"][0],
currentSpriteHUD["boring"]["position"][0],
]
);
const longHUDPosX = longHUDPositionX.to( const longHUDPosX = longHUDPositionX.to(
[0, 1], [0, 1],
[ [
@ -181,8 +206,8 @@ const Game = () => {
); );
const updateHUD = useCallback(() => { const updateHUD = useCallback(() => {
setLongHUDActive((prev: number) => Number(!prev)); setHUDActive((prev: number) => Number(!prev));
}, [setLongHUDActive]); }, [setHUDActive]);
const moveDispatcher = useCallback( const moveDispatcher = useCallback(
(move: string, key: string) => { (move: string, key: string) => {
@ -262,20 +287,27 @@ const Game = () => {
<Hub currentSprite={currentSprite} /> <Hub currentSprite={currentSprite} />
<Lights /> <Lights />
<OrthoCamera <OrthoCamera
// bigHudPosition={bigHudPosition!}
// boringHudPosition={boringHudPosition!}
longHUDPosX={longHUDPosX} longHUDPosX={longHUDPosX}
longHudPosition={[ bigHUDPosX={bigHUDPosX}
currentSpriteHUD!["long"]["position"][0], boringHUDPosX={boringHUDPosX}
longHUDPosYZ={[
currentSpriteHUD!["long"]["position"][1], currentSpriteHUD!["long"]["position"][1],
currentSpriteHUD!["long"]["position"][2], currentSpriteHUD!["long"]["position"][2],
]} ]}
longHudType={currentSpriteHUD!["long"]["type"]} boringHUDPosYZ={[
boringHudType={currentSpriteHUD!["boring"]["type"]} currentSpriteHUD!["boring"]["position"][1],
bigHudType={currentSpriteHUD!["big"]["type"]} currentSpriteHUD!["boring"]["position"][2],
longHudScale={currentSpriteHUD!["long"]["scale"]} ]}
boringHudScale={currentSpriteHUD!["boring"]["scale"]} bigHUDPosYZ={[
bigHudScale={currentSpriteHUD!["big"]["scale"]} currentSpriteHUD!["big"]["position"][1],
currentSpriteHUD!["big"]["position"][2],
]}
longHUDType={currentSpriteHUD!["long"]["type"]}
boringHUDType={currentSpriteHUD!["boring"]["type"]}
bigHUDType={currentSpriteHUD!["big"]["type"]}
longHUDScale={currentSpriteHUD!["long"]["scale"]}
boringHUDScale={currentSpriteHUD!["boring"]["scale"]}
bigHUDScale={currentSpriteHUD!["big"]["scale"]}
id={currentSpriteHUD!["id"]} id={currentSpriteHUD!["id"]}
/> />
</Suspense> </Suspense>

View file

@ -2,25 +2,32 @@ import React from "react";
import { useLoader } from "react-three-fiber"; import { useLoader } from "react-three-fiber";
import * as THREE from "three"; import * as THREE from "three";
import bigHud from "../static/sprites/big_hud.png"; import bigHud from "../static/sprites/big_hud.png";
import bigHudMirrored from "../static/sprites/big_hud_mirrored.png";
import longHud from "../static/sprites/long_hud.png"; import longHud from "../static/sprites/long_hud.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 { PositionAndScaleProps } from "./Hub"; import { PositionAndScaleProps } from "./Hub";
import { a, Interpolation } from "@react-spring/three"; import { a, Interpolation } from "@react-spring/three";
export type HUDElementProps = { export type HUDElementProps = {
longHudType: string; longHUDType: string;
boringHudType: string; boringHUDType: string;
bigHudType: string; bigHUDType: string;
longHudPosition: PositionAndScaleProps; longHUDPosYZ: [number, number];
longHUDPosX: Interpolation<number, any>; longHUDPosX: Interpolation<number, any>;
longHudScale: PositionAndScaleProps; longHUDScale: PositionAndScaleProps;
// boringHudPosition: PositionAndScaleProps; // boringHudPosition: PositionAndScaleProps;
boringHudScale: PositionAndScaleProps; boringHUDPosX: Interpolation<number, any>;
boringHUDPosYZ: [number, number];
boringHUDScale: PositionAndScaleProps;
// bigHudPosition: PositionAndScaleProps; // bigHudPosition: PositionAndScaleProps;
bigHudScale: PositionAndScaleProps; bigHUDPosX: Interpolation<number, any>;
bigHUDPosYZ: [number, number];
bigHUDScale: PositionAndScaleProps;
}; };
const HUDElement = (props: HUDElementProps) => { const HUDElement = (props: HUDElementProps) => {
@ -38,30 +45,41 @@ const HUDElement = (props: HUDElementProps) => {
case "big": case "big":
return bigHud; return bigHud;
} }
break;
case "mirrored":
switch (hudElement) {
case "big":
return bigHudMirrored;
case "long":
return longHudMirrored;
case "boring":
return boringHudMirrored;
}
} }
}; };
const longHudTexture: any = useLoader( const longHudTexture: any = useLoader(
THREE.TextureLoader, THREE.TextureLoader,
spriteTypeToSprite(props.longHudType, "long")! spriteTypeToSprite(props.longHUDType, "long")!
); );
const longHudBoringTexture: any = useLoader( const longHudBoringTexture: any = useLoader(
THREE.TextureLoader, THREE.TextureLoader,
spriteTypeToSprite(props.boringHudType, "boring")! spriteTypeToSprite(props.boringHUDType, "boring")!
); );
const bigHudTexture: any = useLoader( const bigHudTexture: any = useLoader(
THREE.TextureLoader, THREE.TextureLoader,
spriteTypeToSprite(props.bigHudType, "big")! spriteTypeToSprite(props.bigHUDType, "big")!
); );
return ( return (
<> <>
<a.sprite <a.sprite
position={props.longHudPosition} position-y={props.longHUDPosYZ[0]}
position-z={props.longHUDPosYZ[1]}
position-x={props.longHUDPosX} position-x={props.longHUDPosX}
scale={props.longHudScale} scale={props.longHUDScale}
> >
<spriteMaterial <spriteMaterial
attach="material" attach="material"
@ -69,20 +87,30 @@ const HUDElement = (props: HUDElementProps) => {
transparent={true} transparent={true}
/> />
</a.sprite> </a.sprite>
{/* <sprite position={props.boringHudPosition} scale={props.boringHudScale}> <a.sprite
position-x={props.boringHUDPosX}
position-y={props.boringHUDPosYZ[0]}
position-z={props.boringHUDPosYZ[1]}
scale={props.boringHUDScale}
>
<spriteMaterial <spriteMaterial
attach="material" attach="material"
map={longHudBoringTexture} map={longHudBoringTexture}
transparent={true} transparent={true}
/> />
</sprite> </a.sprite>
<sprite position={props.bigHudPosition} scale={props.bigHudScale}> <a.sprite
position-x={props.bigHUDPosX}
position-y={props.bigHUDPosYZ[0]}
position-z={props.bigHUDPosYZ[1]}
scale={props.bigHUDScale}
>
<spriteMaterial <spriteMaterial
attach="material" attach="material"
map={bigHudTexture} map={bigHudTexture}
transparent={true} transparent={true}
/> />
</sprite> */} </a.sprite>
</> </>
); );
}; };

View file

@ -13,7 +13,7 @@ const Hub = (props: any) => {
<Suspense fallback={<>loading...</>}> <Suspense fallback={<>loading...</>}>
<PurpleRing /> <PurpleRing />
<GrayRing /> <GrayRing />
{Object.values(level_sprites.level04).map((sprite) => { {Object.values(level_sprites).map((sprite) => {
return ( return (
<LevelSprite <LevelSprite
position={sprite.position as PositionAndScaleProps} position={sprite.position as PositionAndScaleProps}

View file

@ -48,9 +48,9 @@ const LevelSprite = (props: LevelSpriteConstructorProps) => {
() => ({ () => ({
tex1: { type: "t", value: nonActiveTexture }, tex1: { type: "t", value: nonActiveTexture },
tex2: { type: "t", value: activeTexture }, tex2: { type: "t", value: activeTexture },
timeMSeconds: { value: Date.now() }, timeMSeconds: { value: (Date.now() % (Math.PI * 2000)) / 1000.0 },
}), }),
[] [nonActiveTexture, activeTexture]
); );
const vertexShader = ` const vertexShader = `

View file

@ -29,16 +29,18 @@ const OrthoCamera = (props: OrthoCameraProps) => {
position={[0, 0, 10]} position={[0, 0, 10]}
> >
<HUDElement <HUDElement
longHudType={props.longHudType} longHUDType={props.longHUDType}
boringHudType={props.boringHudType} boringHUDType={props.boringHUDType}
bigHudType={props.bigHudType} bigHUDType={props.bigHUDType}
longHudPosition={props.longHudPosition} longHUDPosYZ={props.longHUDPosYZ}
longHUDPosX={props.longHUDPosX} longHUDPosX={props.longHUDPosX}
longHudScale={props.longHudScale} longHUDScale={props.longHUDScale}
// boringHudPosition={props.boringHudPosition} boringHUDPosYZ={props.boringHUDPosYZ}
boringHudScale={props.boringHudScale} boringHUDPosX={props.boringHUDPosX}
// bigHudPosition={props.bigHudPosition} boringHUDScale={props.boringHUDScale}
bigHudScale={props.bigHudScale} bigHUDPosYZ={props.bigHUDPosYZ}
bigHUDPosX={props.bigHUDPosX}
bigHUDScale={props.bigHUDScale}
key={props.id} key={props.id}
/> />
</OrthographicCamera> </OrthographicCamera>

View file

@ -3,11 +3,17 @@ import moveUpSpriteSheet from "../static/sprites/jump_up.png";
import standingSpriteSheet from "../static/sprites/standing.png"; import standingSpriteSheet from "../static/sprites/standing.png";
import moveLeftSpriteSheet from "../static/sprites/move_left.png"; 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 bigHudSpriteSheet from "../static/sprites/big_hud.png";
import bigHudMirroredSpriteSheet from "../static/sprites/big_hud_mirrored.png";
import longHudSpriteSheet from "../static/sprites/long_hud.png";
import longHudMirroredSpriteSheet from "../static/sprites/long_hud_mirrored.png";
import boringHudSpriteSheet from "../static/sprites/long_hud_boring.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";
// this function just preloads lain's spritesheets 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 moveDown = useLoader(THREE.TextureLoader, moveDownSpriteSheet); const moveDown = useLoader(THREE.TextureLoader, moveDownSpriteSheet);
@ -15,6 +21,22 @@ 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 bigHud = useLoader(THREE.TextureLoader, bigHudSpriteSheet);
const bigHudMirrored = useLoader(
THREE.TextureLoader,
bigHudMirroredSpriteSheet
);
const longHud = useLoader(THREE.TextureLoader, longHudSpriteSheet);
const longHudMirrored = useLoader(
THREE.TextureLoader,
longHudMirroredSpriteSheet
);
const boringHud = useLoader(THREE.TextureLoader, boringHudSpriteSheet);
const boringHudMirrored = useLoader(
THREE.TextureLoader,
boringHudMirroredSpriteSheet
);
const { gl } = useThree(); const { gl } = useThree();
useLayoutEffect(() => { useLayoutEffect(() => {
gl.initTexture(moveDown); gl.initTexture(moveDown);
@ -22,7 +44,26 @@ const Preloader = () => {
gl.initTexture(moveLeft); gl.initTexture(moveLeft);
gl.initTexture(moveRight); gl.initTexture(moveRight);
gl.initTexture(stand); gl.initTexture(stand);
}, [moveDown, moveUp, moveLeft, moveRight, stand, gl]); gl.initTexture(longHud);
gl.initTexture(bigHud);
gl.initTexture(bigHudMirrored);
gl.initTexture(longHudMirrored);
gl.initTexture(boringHud);
gl.initTexture(boringHudMirrored);
}, [
moveDown,
moveUp,
moveLeft,
moveRight,
stand,
gl,
bigHud,
bigHudMirrored,
boringHud,
boringHudMirrored,
longHud,
longHudMirrored,
]);
return null; return null;
}; };

View file

@ -29,7 +29,7 @@ const PurpleRing = (props: JSX.IntrinsicElements["group"]) => {
useFrame(() => { useFrame(() => {
setPurpleRingRotationY(() => ({ setPurpleRingRotationY(() => ({
purpleRingRotationY: purpleRingRotationY.get() + 0.04, purpleRingRotationY: purpleRingRotationY.get() + 0.15,
})); }));
}); });

View file

@ -1,20 +1,26 @@
{ {
"043": { "0422": {
"up": "+", "up": "+",
"down": "042", "down": "0414",
"left": "+", "left": "+",
"right": "" "right": ""
}, },
"042": { "0414": {
"up": "043", "up": "0422",
"down": "", "down": "",
"left": "", "left": "",
"right": "0413"
},
"0413": {
"up": "0422",
"down": "0405",
"left": "0414",
"right": "041" "right": "041"
}, },
"041": { "0405": {
"up": "043", "up": "0413",
"down": "", "down": "",
"left": "042", "left": "0414",
"right": "041" "right": "041"
} }
} }

View file

@ -1,6 +1,6 @@
{ {
"043": { "0422": {
"id": "043hud", "id": "0422hud",
"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],
@ -10,31 +10,77 @@
"boring": { "boring": {
"position": [0.48, 0.174, -8.6], "position": [0.48, 0.174, -8.6],
"scale": [1, 0.03, 1], "scale": [1, 0.03, 1],
"type": "normal" "type": "normal",
"initial_position": [1.48, 0.174, -8.6]
}, },
"big": { "big": {
"position": [0.36, 0.13, -8.6], "position": [0.36, 0.13, -8.6],
"scale": [0.5, 0.06, 1], "scale": [0.5, 0.06, 1],
"type": "normal" "type": "normal",
"initial_position": [1.36, 0.13, -8.6]
} }
}, },
"042": { "0414": {
"id": "042hud", "id": "0414hud",
"long": { "long": {
"position": [-0.45, -0.15, -8.6], "position": [-0.45, -0.09, -8.6],
"scale": [1, 0.03, 1], "scale": [1, 0.03, 1],
"type": "normal", "type": "normal",
"initial_position": [-1.45, -0.15, -8.6] "initial_position": [-1.45, -0.09, -8.6]
}, },
"boring": { "boring": {
"position": [0.48, 0.174, -8.6], "position": [0.5, -0.07, -8.6],
"scale": [1, 0.03, 1], "scale": [1, 0.03, 1],
"type": "normal" "type": "normal",
"initial_position": [1.48, -0.07, -8.6]
}, },
"big": { "big": {
"position": [0.36, 0.13, -8.6], "position": [0.35, -0.12, -8.6],
"scale": [0.5, 0.06, 1], "scale": [0.5, 0.06, 1],
"type": "normal" "type": "normal",
"initial_position": [1.36, -0.12, -8.6]
}
},
"0413": {
"id": "0413hud",
"long": {
"position": [0.85, -0.09, -8.6],
"scale": [1, 0.03, 1],
"type": "mirrored",
"initial_position": [1.45, -0.09, -8.6]
},
"boring": {
"position": [-0.11, -0.07, -8.6],
"scale": [1, 0.03, 1],
"type": "mirrored",
"initial_position": [-1.48, -0.07, -8.6]
},
"big": {
"position": [-0.35, -0.12, -8.6],
"scale": [0.5, 0.06, 1],
"type": "mirrored",
"initial_position": [-1.48, -0.12, -8.6]
}
},
"0405": {
"id": "0405hud",
"long": {
"position": [0.85, -0.32, -8.6],
"scale": [1, 0.03, 1],
"type": "mirrored",
"initial_position": [1.45, -0.3, -8.6]
},
"boring": {
"position": [-0.11, -0.30, -8.6],
"scale": [1, 0.03, 1],
"type": "mirrored",
"initial_position": [-1.48, -0.30, -8.6]
},
"big": {
"position": [-0.25, -0.28, -8.6],
"scale": [0.5, 0.06, 1],
"type": "mirrored",
"initial_position": [-1.48, -0.12, -8.6]
} }
} }
} }

View file

@ -1,32 +1,30 @@
{ {
"level04": {
"0": { "0": {
"position": [0.4, -0.25, 1.3], "position": [0.4, -0.25, 1.3],
"scale": [0.25, 0.15, 0.25], "scale": [0.25, 0.15, 0.25],
"rotation": [0, 0.2, 0], "rotation": [0, 0.2, 0],
"sprite": "movie", "sprite": "movie",
"id": "040" "id": "0405"
}, },
"1": { "1": {
"position": [0.4, 0, 1.3], "position": [0.4, 0, 1.3],
"scale": [0.25, 0.15, 0.25], "scale": [0.25, 0.15, 0.25],
"rotation": [0, 0.09, 0], "rotation": [0, 0.09, 0],
"sprite": "s", "sprite": "s",
"id": "041" "id": "0413"
}, },
"2": { "2": {
"position": [-0.35, 0, 1.3], "position": [-0.35, 0, 1.3],
"scale": [0.25, 0.15, 0.25], "scale": [0.25, 0.15, 0.25],
"rotation": [0, -0.1, 0], "rotation": [0, -0.1, 0],
"sprite": "copland", "sprite": "copland",
"id": "042" "id": "0414"
}, },
"3": { "3": {
"position": [-0.35, 0.25, 1.3], "position": [-0.35, 0.25, 1.3],
"scale": [0.25, 0.15, 0.25], "scale": [0.25, 0.15, 0.25],
"rotation": [0, -0.1, 0], "rotation": [0, -0.1, 0],
"sprite": "touko", "sprite": "touko",
"id": "043" "id": "0422"
}
} }
} }