【问题标题】:Stop game loop on conditional with React使用 React 有条件地停止游戏循环
【发布时间】:2023-03-05 09:59:01
【问题描述】:

条件后我无法停止循环。我可以在单击按钮后停止间隔,但在循环增量等条件后无法停止。这个简单的例子尝试在 5 次循环后停止间隔循环。

任何解决方案将不胜感激!

import React, { useState } from 'react';

let gameLoop: any;

function App() {
  const [loopCount, setLoopCount] = useState(0);
  const [running, setRunning] = useState(true);

  const gameLogic = () => {
    console.log('Game logic!')
  }

  const loop = () => {
    gameLogic();
    setLoopCount(prev => {
      const newCount = prev + 1;
      console.log(newCount)
      return newCount
    });

    // Stop the loop on a conditional
    if(loopCount >= 5){
      clearInterval(gameLoop)
    }
  }

  const handleStartButtonClick = () => {
    gameLoop = setInterval(loop, 1000)
    setRunning(true);
  }

  const handleStopButtonClick = () => {
    clearInterval(gameLoop);
    setRunning(false);
  }

  const handleResetButtonClick = () => {
    setLoopCount(0);
    console.clear();
  }

  return (
    <div className="App">
      <div>
        <button onClick={handleStartButtonClick}>Start</button>
        <button onClick={handleStopButtonClick}>Stop</button>
        <button onClick={handleResetButtonClick}>Reset</button>
      </div>
    </div>
  );
}

export default App;

【问题讨论】:

    标签: javascript node.js reactjs setinterval game-loop


    【解决方案1】:

    解决方法是将条件放在组件级别,而不是放在循环方法中。

    import React, { useState } from 'react';
    
    let gameLoop: any;
    
    function App() {
      const [loopCount, setLoopCount] = useState(0);
      const [running, setRunning] = useState(true);
    
      const gameLogic = () => {
        console.log('Game logic!')
      }
    
      const loop = () => {
        gameLogic();
        setLoopCount(prev => {
          const newCount = prev + 1;
          console.log(newCount)
          return newCount
        });
    
    
      }
        //MOVE OUTSIDE GAME LOOP
        // Stop the loop on a conditional
        if(loopCount >= 5){
          clearInterval(gameLoop)
        }
    
      const handleStartButtonClick = () => {
        gameLoop = setInterval(loop, 1000)
        setRunning(true);
      }
    
      const handleStopButtonClick = () => {
        clearInterval(gameLoop);
        setRunning(false);
      }
    
      const handleResetButtonClick = () => {
        setLoopCount(0);
        console.clear();
      }
    
      return (
        <div className="App">
          <div>
            <button onClick={handleStartButtonClick}>Start</button>
            <button onClick={handleStopButtonClick}>Stop</button>
            <button onClick={handleResetButtonClick}>Reset</button>
          </div>
        </div>
      );
    }
    
    export default App;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多