blackBudha

Untitled

May 23rd, 2020
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import React, { useState, useEffect } from 'react';
  2. import styled from 'styled-components';
  3.  
  4. // Styles
  5. import { StyledTetrisContainer, StyledTetris} from './styles/StyledTetris';
  6.  
  7. // Stage Creator
  8. import { createStage, detectCollision } from '../gameParams';
  9.  
  10.  
  11.  
  12. // Custom Hooks
  13. import { usePlayer } from '../hooks/usePlayer';
  14. import { useStage } from  '../hooks/useStage';
  15. import { useInterval } from '../hooks/useInterval';
  16. import { useGameStats } from '../hooks/useGameStats'
  17.  
  18.  
  19. // Components
  20. import Stage from './Stage';
  21. import Display from './Display';
  22. import StartButton from './StartButton';
  23.  
  24. const Tetris = ({ loadLocalStorage }) => {
  25.  
  26.     const [dropTime, setDropTime] = useState(null);
  27.     const [gameOver, setGameOver] = useState(false);
  28.  
  29.     // Custom Hook usage
  30.     let [player, updatePlayerPosition, resetPlayer, rotatePlayer] = usePlayer();
  31.     // resetPlayer, needed to be accessed by useStage
  32.     let [stage, setStage, rowsCleared] = useStage(player, resetPlayer);
  33.     const [score, setScore, rows, setRows, level, setLevel] =
  34.         useGameStats(rowsCleared);
  35.  
  36.     console.log('re-render');
  37.  
  38.  
  39.    
  40.     // More like ComponentDidMount() / ComponentDidUpdate() in class based component
  41.     // useEffect(() => {
  42.     //     localStorage.setItem("dropTimeStored", JSON.stringify(dropTime));
  43.     //     localStorage.setItem("stageStored", JSON.stringify(stage));
  44.     //     localStorage.setItem("playerStored", JSON.stringify(player));
  45.     //     localStorage.setItem("rowsClearedStored", JSON.stringify(rowsCleared));
  46.     //     localStorage.setItem("scoreStored", JSON.stringify(score));
  47.     //     localStorage.setItem("rowsStored", JSON.stringify(rows));
  48.     //     localStorage.setItem("levelStored", JSON.stringify(level));
  49.     //     localStorage.setItem("gameOverStored", JSON.stringify(gameOver));
  50.     // }, [dropTime, stage, player, rowsCleared, score, rows, level, gameOver])
  51.     // JSON.parse(localStorage.getItem("playerStored")); <- get data outside
  52.  
  53.    
  54.     // function takes parameter - direction
  55.     // Responsible to move player left or right
  56.     const movePlayer = (direction) => {
  57.         if(!detectCollision(player, stage, {x: direction, y: 0})){
  58.             updatePlayerPosition({x:direction, y:0});
  59.         }
  60.     }
  61.    
  62.     const updateLocalStorage = (key, value) => {
  63.         localStorage.setItem(key, value);
  64.     }  
  65.  
  66.     const startGame = () => {
  67.         console.log(loadLocalStorage);
  68.         if (loadLocalStorage){
  69.             setDropTime(JSON.parse(localStorage.getItem("dropTimeStored")));
  70.             setStage(JSON.parse(localStorage.getItem("stageStored")));
  71.             player = JSON.parse(localStorage.getItem("playerStored"));
  72.             rowsCleared = JSON.parse(localStorage.getItem("rowsClearedStored"));
  73.             setScore(JSON.parse(localStorage.getItem("scoreStored")));
  74.             setRows(JSON.parse(localStorage.getItem("rowsStored")));
  75.             setLevel(JSON.parse(localStorage.getItem("levelStored")));
  76.             setGameOver(JSON.parse(localStorage.getItem("gameOverStored")));
  77.         } else {
  78.             localStorage.clear();
  79.             setStage(createStage());
  80.             setDropTime(1000);
  81.             resetPlayer();
  82.             setGameOver(false);
  83.             setScore(0);
  84.             setRows(0);
  85.             setLevel(0);
  86.         }        
  87.     }
  88.  
  89.     const drop = () => {
  90.         // Increase level when player has cleared 10 rows
  91.         if (rows > (level + 1) * 10){
  92.         setLevel(previous => previous + 1);
  93.         // Increase speed formula
  94.         const dropTime = 1000 / (level + 1) + 200;
  95.         setDropTime(dropTime);
  96.         updateLocalStorage('dropTimeStored', dropTime);
  97.         }
  98.         if(!detectCollision(player, stage, {x: 0, y:1})){
  99.             // Droping element down, we increase y axisi coordinate by one
  100.             updatePlayerPosition({x:0, y:1, collided: false})
  101.         } else {
  102.             if(player.position.y < 1){
  103.                 setGameOver(true);
  104.                 setDropTime(null);
  105.                 updateLocalStorage('dropTimeStored', null);
  106.             }
  107.             updatePlayerPosition({ x:0, y:0, collided: true});
  108.         }
  109.     }
  110.  
  111.     // Stop interval when palyer presses downkey
  112.     const dropPlayer = () => {
  113.         setDropTime(null);
  114.         updateLocalStorage('dropTimeStored', null);
  115.         drop();
  116.     }
  117.  
  118.     // Start interval again after user release downkey
  119.     const keyUp = ({keyCode}) => {
  120.         const dropTime = 1000 / (level + 1) + 200;
  121.         if (!gameOver){
  122.             if (keyCode === 40) {
  123.                 setDropTime(dropTime);
  124.                 updateLocalStorage('dropTimeStored', dropTime);
  125.             }
  126.         }
  127.     }
  128.    
  129.  
  130.     const move = ({ keyCode }) => {
  131.         // We dont want to move if the game is over
  132.         if (!gameOver) {
  133.             // Move block to the left
  134.             if (keyCode === 37){
  135.                 movePlayer(-1);
  136.             // Move block to the right
  137.             } else if (keyCode === 39) {
  138.                 movePlayer(1);
  139.             // Move block down - dropDown    
  140.             } else if (keyCode === 40) {
  141.                 dropPlayer();
  142.             } else if (keyCode === 38) {
  143.                 // Adding only rightwise rotation. top arrow
  144.                 rotatePlayer(stage, 1);
  145.             }
  146.         }
  147.  
  148.     }
  149.  
  150.     useInterval(() => {
  151.         drop();
  152.     }, dropTime)
  153.  
  154.     return (
  155.        
  156.             <StyledTetrisContainer role="button" tabIndex="0" onKeyDown={e => move(e)} onKeyUp = {keyUp}>
  157.                 <StyledTetris>
  158.                             <Stage stage={stage}/>
  159.                        
  160.                         <aside>
  161.                         {gameOver ? (
  162.                             <Display gameOver={gameOver} text="Game Over" />
  163.                         ) : (
  164.                         <div>
  165.                             <Display text={`Score: ${score}`}/>
  166.                             <Display text={`Rows: ${rows}`}/>
  167.                             <Display text={`Level: ${level}`}/>
  168.                         </div>)}
  169.                         <StartButton callback={startGame}/>
  170.                     </aside>
  171.                 </StyledTetris>
  172.             </StyledTetrisContainer>
  173.     );
  174. };
  175.  
  176.  
  177. export default Tetris;
Add Comment
Please, Sign In to add comment