From 3f5eeec7c5ffd8cec7dab905577203a597178533 Mon Sep 17 00:00:00 2001 From: Tim Glasgow Date: Fri, 5 Aug 2022 22:49:20 -0500 Subject: [PATCH] game screen timer --- squarenotsquare/src/screens/Game.js | 59 ++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/squarenotsquare/src/screens/Game.js b/squarenotsquare/src/screens/Game.js index a9faaf8..63f9426 100644 --- a/squarenotsquare/src/screens/Game.js +++ b/squarenotsquare/src/screens/Game.js @@ -1,7 +1,7 @@ import React from "react"; import { Text, TouchableOpacity, View, SafeAreaView } from "react-native"; import { ScrollView } from "react-native-gesture-handler"; -import { useState, useEffect } from "react"; +import { useState, useEffect, useRef, useMemo } from "react"; import {genSquareChallenge} from '../libs/Random'; import {shapes} from '../libs/ShapeEnum'; import { styles } from "./styles/AppStyles"; @@ -12,13 +12,59 @@ import Metrics from "../themes/Metrics"; function Game(props){ - const squareChallenge = genSquareChallenge(); - const [startTime, setStartTime] = useState(Date.now()); + const squareChallenge = useRef(genSquareChallenge()); + const squareMemo = useMemo(renderPairs, [squareChallenge]); + const [timerState, setTimerState] = useState(0); + const localTimer = useRef(null); + const startTime = useRef(0); const [headerText, setHeaderText] = useState('Ready?'); const [headerColor, setHeaderColor] = useState(styles.green); const [headerTextColor, setHeaderTextColor] = useState(styles.darkText); - useEffect + useEffect(() => { + let headerTimeout = null; + + switch(timerState){ + case 0: + headerTimeout = setTimeout(() => { + setHeaderColor(styles.yellow); + setHeaderText('Set'); + setTimerState(1); + }, 1000); + break; + case 1: + headerTimeout = setTimeout(() => { + setHeaderColor(styles.red); + setHeaderTextColor(styles.lightText); + setHeaderText('Go!'); + setTimerState(2); + }, 1000); + break; + case 2: + headerTimeout = setTimeout(() => { + setHeaderColor(styles.dark); + startTime.current = (Date.now()); + setHeaderText(0 + ' s'); + setTimerState(3); + }, 1000); + break; + case 3: + headerTimeout = setInterval(() => { + let elapsed = Math.round((Date.now() - startTime.current) / (1000)); + setHeaderText(elapsed + ' s'); + }, 1000); + break; + default: + break; + } + + localTimer.current = (headerTimeout); + + return () => { + clearTimeout(localTimer.current); + clearInterval(localTimer.current); + } + }, [timerState]); function generateSquare(){ return ( @@ -63,7 +109,7 @@ function Game(props){ } function renderPairs(){ - return squareChallenge.map((pair, index) => { + return squareChallenge.current.map((pair, index) => { return generatePair(pair.squarePos, pair.shapeType, index); }); } @@ -76,7 +122,8 @@ function Game(props){ - {renderPairs()} + + {squareMemo} );