authorize user text movement done

This commit is contained in:
ad044 2020-11-21 20:55:01 +04:00
parent c522cfd48c
commit 2f5153fd2b
3 changed files with 142 additions and 26 deletions

View file

@ -1,12 +1,15 @@
import React, { useRef } from "react"; import React, { useCallback, useMemo, useRef } from "react";
import authorizeHeaderUnderline from "../../static/sprite/authorize_header_underline.png"; import authorizeHeaderUnderline from "../../static/sprite/authorize_header_underline.png";
import authorizeGlass from "../../static/sprite/authorize_glass.png"; import authorizeGlass from "../../static/sprite/authorize_glass.png";
import authorizeGlassUnderline from "../../static/sprite/authorize_glass_underline.png"; import authorizeGlassUnderline from "../../static/sprite/authorize_glass_underline.png";
import authorizeOrangeSquare from "../../static/sprite/authorize_orange_square.png"; import authorizeOrangeSquare from "../../static/sprite/authorize_orange_square.png";
import authorizeStartToFinish from "../../static/sprite/authorize_start_to_finish.png"; import authorizeStartToFinish from "../../static/sprite/authorize_start_to_finish.png";
import authorizeInactiveLetters from "../../static/sprite/authorize_inactive_letters.png"; import authorizeInactiveLetters from "../../static/sprite/authorize_inactive_letters.png";
import authorizeActiveLetters from "../../static/sprite/authorize_active_letters.png";
import { useFrame, useLoader } from "react-three-fiber"; import { useFrame, useLoader } from "react-three-fiber";
import * as THREE from "three"; import * as THREE from "three";
import { useBootStore } from "../../store";
import { OrbitControls } from "@react-three/drei";
type BootAuthorizeUserProps = { type BootAuthorizeUserProps = {
visible: boolean; visible: boolean;
@ -34,17 +37,29 @@ const BootAuthorizeUser = (props: BootAuthorizeUserProps) => {
THREE.TextureLoader, THREE.TextureLoader,
authorizeInactiveLetters authorizeInactiveLetters
); );
const authorizeActiveLettersTex = useLoader(
THREE.TextureLoader,
authorizeActiveLetters
);
const backgroundLetterRef = useRef<THREE.Object3D>(); const backgroundLettersPos = useBootStore((state) => state.lettersPos);
const activeLetterTextureOffset = useBootStore(
(state) => state.activeLetterTextureOffset
);
useFrame(() => { const authorizeActiveLettersMap = useMemo(() => {
if (backgroundLetterRef.current) { authorizeActiveLettersTex.wrapT = authorizeActiveLettersTex.wrapS =
// backgroundLetterRef.current.position.x += 0.01 THREE.RepeatWrapping;
} authorizeActiveLettersTex.repeat.set(0.06, 0.2);
}); authorizeActiveLettersTex.offset.x = activeLetterTextureOffset.x;
authorizeActiveLettersTex.offset.y = activeLetterTextureOffset.y;
return authorizeActiveLettersTex;
}, [activeLetterTextureOffset, authorizeActiveLettersTex]);
return ( return (
<> <>
<OrbitControls />
{props.visible ? ( {props.visible ? (
<> <>
<sprite <sprite
@ -112,8 +127,7 @@ const BootAuthorizeUser = (props: BootAuthorizeUserProps) => {
<mesh <mesh
scale={[4, 1.28, 0]} scale={[4, 1.28, 0]}
renderOrder={-1} renderOrder={-1}
position={[-0.45, -0.6, 0]} position={[backgroundLettersPos.x, backgroundLettersPos.y, 0]}
ref={backgroundLetterRef}
> >
<planeBufferGeometry attach="geometry" /> <planeBufferGeometry attach="geometry" />
<meshBasicMaterial <meshBasicMaterial
@ -122,6 +136,28 @@ const BootAuthorizeUser = (props: BootAuthorizeUserProps) => {
transparent={true} transparent={true}
/> />
</mesh> </mesh>
<mesh
scale={[0.35, 0.45, 0]}
position={[1.51, -0.12, 0]}
renderOrder={2}
>
<planeBufferGeometry attach="geometry" />
<meshBasicMaterial
map={authorizeActiveLettersMap}
attach="material"
transparent={true}
depthTest={false}
/>
</mesh>
<mesh position={[1.54, -0.13, 0]} renderOrder={1}>
<circleBufferGeometry attach="geometry" args={[0.221, 32]} />
<meshBasicMaterial
attach="material"
transparent={true}
depthTest={false}
color={0x000000}
/>
</mesh>
</group> </group>
</> </>
) : ( ) : (

View file

@ -7,6 +7,9 @@ const BootManager = (props: StateManagerProps) => {
(state) => state.toggleComponentMatrixIdx (state) => state.toggleComponentMatrixIdx
); );
const setBootSubscene = useBootStore((state) => state.setSubscene); const setBootSubscene = useBootStore((state) => state.setSubscene);
const moveAuthorizeUserLetters = useBootStore(
(state) => state.moveAuthorizeUserLetters
);
const dispatchObject = useCallback( const dispatchObject = useCallback(
(event: string) => { (event: string) => {
@ -34,11 +37,31 @@ const BootManager = (props: StateManagerProps) => {
action: setBootSubscene, action: setBootSubscene,
value: "authorize_user", value: "authorize_user",
}; };
case "authorize_user_right":
return {
action: moveAuthorizeUserLetters,
value: "right",
};
case "authorize_user_left":
return {
action: moveAuthorizeUserLetters,
value: "left",
};
case "authorize_user_up":
return {
action: moveAuthorizeUserLetters,
value: "up",
};
case "authorize_user_down":
return {
action: moveAuthorizeUserLetters,
value: "down",
};
case "load_data_select": case "load_data_select":
return { action: setBootSubscene, value: "load_data" }; return { action: setBootSubscene, value: "load_data" };
} }
}, },
[setBootSubscene, toggleComponentMatrixIdx] [moveAuthorizeUserLetters, setBootSubscene, toggleComponentMatrixIdx]
); );
useEffect(() => { useEffect(() => {

View file

@ -454,22 +454,13 @@ export const useBootStore = create(
load_data: ["load_data_yes", "load_data_no"], load_data: ["load_data_yes", "load_data_no"],
authorize_user: ["authorize_user_letters"], authorize_user: ["authorize_user_letters"],
}, },
authorizeUserLetterMatrix: { lettersPos: {
xIndices: [ x: 3.35,
3.35, y: -0.7,
3.05, },
2.75, activeLetterTextureOffset: {
2.45, x: 0,
2.15, y: -0.2,
1.85,
1.55,
1.25,
0.75,
0.45,
0.15,
-0.15,
-0.45,
],
}, },
componentMatrixIndices: { componentMatrixIndices: {
// 0 or 1 // 0 or 1
@ -491,6 +482,72 @@ export const useBootStore = create(
}, },
})), })),
setSubscene: (to: string) => set(() => ({ subscene: to })), setSubscene: (to: string) => set(() => ({ subscene: to })),
moveAuthorizeUserLetters: (direction: string) =>
set((state) => {
let initialPos = state.lettersPos;
let initialActiveLetterTextureOffset =
state.activeLetterTextureOffset;
let axis: string;
let finalPosVal: number;
let finalTextureOffsetVal: number;
switch (direction) {
case "right":
axis = "x";
if (initialPos.x - 0.3 < -0.25) {
finalPosVal = -0.25;
finalTextureOffsetVal = 0.93;
} else {
finalPosVal = initialPos.x - 0.3;
finalTextureOffsetVal =
initialActiveLetterTextureOffset.x + 0.0775;
}
break;
case "left":
axis = "x";
if (initialPos.x + 0.3 > 3.35) {
finalPosVal = 3.35;
finalTextureOffsetVal = 0;
} else {
finalPosVal = initialPos.x + 0.3;
finalTextureOffsetVal =
initialActiveLetterTextureOffset.x - 0.0775;
}
break;
case "up":
axis = "y";
if (initialPos.y - 0.25 < -0.7) {
finalPosVal = -0.7;
finalTextureOffsetVal = -0.2;
} else {
finalPosVal = initialPos.y - 0.25;
finalTextureOffsetVal =
initialActiveLetterTextureOffset.y + 0.2;
}
break;
case "down":
axis = "y";
if (initialPos.y + 0.25 > 0.3) {
finalPosVal = 0.3;
finalTextureOffsetVal = -1;
} else {
finalPosVal = initialPos.y + 0.25;
finalTextureOffsetVal =
initialActiveLetterTextureOffset.y - 0.2;
}
break;
}
return {
lettersPos: {
...state.lettersPos,
[axis!]: finalPosVal!,
},
activeLetterTextureOffset: {
...state.activeLetterTextureOffset,
[axis!]: finalTextureOffsetVal!,
},
};
}),
}) })
) )
); );