Skip to content

Commit

Permalink
add pause play feature (#18)
Browse files Browse the repository at this point in the history
  • Loading branch information
yhattav authored Nov 22, 2024
1 parent bcde050 commit 9040a17
Showing 1 changed file with 22 additions and 2 deletions.
24 changes: 22 additions & 2 deletions src/components/GravitySimulator/GravitySimulator.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import "../../styles/global.scss";
import { MdFullscreen, MdFullscreenExit } from "react-icons/md";
import { BiReset } from "react-icons/bi";
import { motion } from "framer-motion";
import { BsPlayFill, BsPauseFill } from "react-icons/bs";

interface ParticleMechanics {
position: Point2D;
Expand Down Expand Up @@ -71,6 +72,7 @@ export const GravitySimulator: React.FC<GravitySimulatorProps> = ({
const { settings: physicsConfig, updateSettings } = useSettings();
const [isFullscreen, setIsFullscreen] = useState(false);
const [throttledPointerPos, setThrottledPointerPos] = useState(pointerPos);
const [isPaused, setIsPaused] = useState(false);
const toggleFullscreen = useCallback(() => {
if (!document.fullscreenElement) {
gravityRef.current?.requestFullscreen();
Expand Down Expand Up @@ -191,7 +193,7 @@ export const GravitySimulator: React.FC<GravitySimulatorProps> = ({
);

useEffect(() => {
if (!isSimulationStarted) return;
if (!isSimulationStarted || isPaused) return;

let animationFrameId: number;
//const lastTime = performance.now();
Expand All @@ -218,7 +220,12 @@ export const GravitySimulator: React.FC<GravitySimulatorProps> = ({

animationFrameId = requestAnimationFrame(updateParticles);
return () => cancelAnimationFrame(animationFrameId);
}, [isSimulationStarted, updateParticleMechanics, physicsConfig.DELTA_TIME]);
}, [
isSimulationStarted,
isPaused,
updateParticleMechanics,
physicsConfig.DELTA_TIME,
]);

const createParticle = useCallback(
(
Expand Down Expand Up @@ -380,6 +387,19 @@ export const GravitySimulator: React.FC<GravitySimulatorProps> = ({
alignItems: "center",
}}
>
<motion.button
onClick={(e) => {
e.stopPropagation();
setIsPaused(!isPaused);
}}
className="floating-panel floating-button"
whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
title={isPaused ? "Resume Simulation" : "Pause Simulation"}
>
{isPaused ? <BsPlayFill size={20} /> : <BsPauseFill size={20} />}
</motion.button>

<motion.button
onClick={(e) => {
e.stopPropagation();
Expand Down

0 comments on commit 9040a17

Please sign in to comment.