Anonymous
Есть ли способ выстроить компонентные анимации в React?
Сообщение
Anonymous » 14 сен 2025, 01:50
В настоящее время я делаю игру, в которой используется анимированная марионетка, занимающаяся марширующей анимацией. Я хочу, чтобы этот компонент руки и ноги перемещался друг с другом, но когда один должен быть остановлен, он становится вне синхронизации с другой.
Код: Выделить всё
import { useEffect, useState } from 'react';
import Body from './Body';
import Arm from './Arm';
import Leg from './Leg';
function SillySoldier(props){
const [silly, isSilly] = useState(false);
const [caught, isCaught] = useState(false);
const [hidden, hide] = useState(false);
var caution = Math.floor(Math.random() * (6 - 1 + 1)) + 1;;
useEffect(() => {
let timer = setTimeout(() => {
if(props.inspecting === false) {
isSilly(() => true)
}
}, caution*1000);
return () => clearTimeout(timer)
});
useEffect(() => {
if(props.inspecting && silly){
isCaught(true);
}
}, [props.inspecting, silly]);
useEffect(() => {
let timer = setTimeout(() => {
isSilly(() => false);
if(caught) {
hide(true);
props.soldier.caught = hide;
}
}, 1000);
return () => clearTimeout(timer)
});
var standard = {
body: "/soldiers/Silly_Soldier1.png",
leg1: "/soldiers/Soldier_Leg_Left1.png",
leg2: "/soldiers/Soldier_Leg_Right1.png",
arm1: "/soldiers/Soldier_Arm1.png"
}
var fooling = {
body: "/soldiers/Silly_Soldier2.png",
leg1: "/soldiers/Soldier_Leg_Left1.png",
leg2: "/soldiers/Soldier_Leg_Right1.png",
arm1: "/soldiers/Soldier_Arm2.png"
}
var loss = {
body: "/soldiers/Silly_Soldier3.png",
leg1: "/soldiers/Soldier_Leg_Left1.png",
leg2: "/soldiers/Soldier_Leg_Right1.png",
arm1: "/soldiers/Soldier_Arm2.png"
}
const status = caught ? (loss) : (silly ? (fooling) : (standard))
return (
hidden ? () :
(
)
)
}
export default SillySoldier
< /code>
arm.js
function Arm(props) {
return (
[img]{props.img} alt=[/img]
)
}
export default Arm;
< /code>
leg.js
function Leg(props) {
return (
[img]{props.img} alt=[/img]
)
}
export default Leg;
< /code>
css < /p>
.arm {
position: absolute;
display: inline-block;
top: 55%;
padding-left: 6.25%;
transform-origin:65% 40%;
}
.leg {
outline-color: blue;
position: absolute;
display: inline-block;
top: 72%;
padding-left: 6.25%;
transform-origin:60% 30%;
}
#left{
animation: march_left 3s linear infinite;
}
#right{
animation: march_right 3s linear infinite;
}
@keyframes march_left {
from {
transform: rotate(0deg);
transition: transform 150ms ease;
} 16% {
transform: rotate(-70deg);
transition: transform 150ms ease;
} 32% {
transform: rotate(-70deg);
transition: transform 150ms ease;
} 48% {
transform: rotate(0deg);
transition: transform 150ms ease;
} to {
transform: rotate(0deg);
transition: transform 150ms ease;
}
}
@keyframes march_right {
from {
transform: rotate(0deg);
transition: transform 150ms ease;
} 48% {
transform: rotate(0deg);
transition: transform 150ms ease;
} 64% {
transform: rotate(-70deg);
transition: transform 150ms ease;
} 80% {
transform: rotate(-70deg);
transition: transform 150ms ease;
} to {
transform: rotate(0deg);
transition: transform 150ms ease;
}
}
Я ищу способ связать анимации для левой/правой руки и ног, чтобы они всегда синхронизировались?
Подробнее здесь:
https://stackoverflow.com/questions/797 ... s-in-react
1757803825
Anonymous
В настоящее время я делаю игру, в которой используется анимированная марионетка, занимающаяся марширующей анимацией. Я хочу, чтобы этот компонент руки и ноги перемещался друг с другом, но когда один должен быть остановлен, он становится вне синхронизации с другой.[code]import { useEffect, useState } from 'react'; import Body from './Body'; import Arm from './Arm'; import Leg from './Leg'; function SillySoldier(props){ const [silly, isSilly] = useState(false); const [caught, isCaught] = useState(false); const [hidden, hide] = useState(false); var caution = Math.floor(Math.random() * (6 - 1 + 1)) + 1;; useEffect(() => { let timer = setTimeout(() => { if(props.inspecting === false) { isSilly(() => true) } }, caution*1000); return () => clearTimeout(timer) }); useEffect(() => { if(props.inspecting && silly){ isCaught(true); } }, [props.inspecting, silly]); useEffect(() => { let timer = setTimeout(() => { isSilly(() => false); if(caught) { hide(true); props.soldier.caught = hide; } }, 1000); return () => clearTimeout(timer) }); var standard = { body: "/soldiers/Silly_Soldier1.png", leg1: "/soldiers/Soldier_Leg_Left1.png", leg2: "/soldiers/Soldier_Leg_Right1.png", arm1: "/soldiers/Soldier_Arm1.png" } var fooling = { body: "/soldiers/Silly_Soldier2.png", leg1: "/soldiers/Soldier_Leg_Left1.png", leg2: "/soldiers/Soldier_Leg_Right1.png", arm1: "/soldiers/Soldier_Arm2.png" } var loss = { body: "/soldiers/Silly_Soldier3.png", leg1: "/soldiers/Soldier_Leg_Left1.png", leg2: "/soldiers/Soldier_Leg_Right1.png", arm1: "/soldiers/Soldier_Arm2.png" } const status = caught ? (loss) : (silly ? (fooling) : (standard)) return ( hidden ? () : ( ) ) } export default SillySoldier < /code> arm.js function Arm(props) { return ( [img]{props.img} alt=[/img] ) } export default Arm; < /code> leg.js function Leg(props) { return ( [img]{props.img} alt=[/img] ) } export default Leg; < /code> css < /p> .arm { position: absolute; display: inline-block; top: 55%; padding-left: 6.25%; transform-origin:65% 40%; } .leg { outline-color: blue; position: absolute; display: inline-block; top: 72%; padding-left: 6.25%; transform-origin:60% 30%; } #left{ animation: march_left 3s linear infinite; } #right{ animation: march_right 3s linear infinite; } @keyframes march_left { from { transform: rotate(0deg); transition: transform 150ms ease; } 16% { transform: rotate(-70deg); transition: transform 150ms ease; } 32% { transform: rotate(-70deg); transition: transform 150ms ease; } 48% { transform: rotate(0deg); transition: transform 150ms ease; } to { transform: rotate(0deg); transition: transform 150ms ease; } } @keyframes march_right { from { transform: rotate(0deg); transition: transform 150ms ease; } 48% { transform: rotate(0deg); transition: transform 150ms ease; } 64% { transform: rotate(-70deg); transition: transform 150ms ease; } 80% { transform: rotate(-70deg); transition: transform 150ms ease; } to { transform: rotate(0deg); transition: transform 150ms ease; } } [/code] Я ищу способ связать анимации для левой/правой руки и ног, чтобы они всегда синхронизировались? Подробнее здесь: [url]https://stackoverflow.com/questions/79762878/is-there-a-way-to-line-up-component-animations-in-react[/url]