延迟西蒙游戏的for循环
Delay in for loop for Simon game
我是 React 的新手,所以我可能没有使用最佳实践。我正在尝试构建此 "Simon Says" 游戏,但我一直试图在我的每个 for
循环之间设置延迟,它们同时 运行。我已经为此查看了其他解决方案,但它们似乎不适合我的。我也尝试过使用 setTimeout
但它只会在延迟后立即播放所有动画。这是 for
循环和我想在两者之间延迟的函数:
newRound() {
this.setState({
pcSequence: this.state.pcSequence.concat(
Math.floor(Math.random() * 4) + 1)
},() => {
this.state.pcSequence.forEach(element =>
this.startAnimations(element)
);
}
);
}
startAnimations(element) {
if (element == 1) {
this.activeBtn1(0);
} else if (element == 2) {
this.activeBtn2(1);
} else if (element == 3) {
this.activeBtn3(2);
} else if (element == 4) {
this.activeBtn4(3);
}
}
谢谢!!
你好,我喜欢你的问题并设法让它工作,我将在下面分享代码:
state = {
pcSequence: [],
}
componentDidMount() {
this.newRound();
}
newRound() {
this.setState({
pcSequence: [1,4,3,2]
},() => this.startSequence()
);
}
startSequence() {
if (this.state.pcSequence.length > 0) {
setTimeout(() => {
this.startAnimations(this.state.pcSequence.pop());
this.startSequence();
}, 1000) // 1000ms === 1 second
}
}
startAnimations(element) {
if (element === 1) {
console.log('element 1', element)
} else if (element === 2) {
console.log('element 2', element)
} else if (element === 3) {
console.log('element 3', element)
} else if (element === 4) {
console.log('element 4', element)
}
}
每次您想要重置按钮并以更好的方式填充数组时,您都可以调用 this.newRound,您只用 1 个项目而不是 4 个项目填充数组,例如 [1] 或 [4]
希望对您有所帮助!
我在其他地方找到了帮助,并想展示我所做的,以防其他人过来寻找类似的东西。我删除了 for
循环并使用了 map
:
newRound() {
this.setState({
pcSequence: this.state.pcSequence.concat(
Math.floor(Math.random() * 4) + 1),
round: this.state.round + 1
},() => {
this.state.pcSequence.map((element,index)=> {
setTimeout(() => {
this.startAnimations(element);
}, index * 1000);
})
}
);
}
startAnimations(element) {
if (element == 1) {
this.activeBtn1(0);
} else if (element == 2) {
this.activeBtn2(1);
} else if (element == 3) {
this.activeBtn3(2);
} else if (element == 4) {
this.activeBtn4(3);
}
}
我是 React 的新手,所以我可能没有使用最佳实践。我正在尝试构建此 "Simon Says" 游戏,但我一直试图在我的每个 for
循环之间设置延迟,它们同时 运行。我已经为此查看了其他解决方案,但它们似乎不适合我的。我也尝试过使用 setTimeout
但它只会在延迟后立即播放所有动画。这是 for
循环和我想在两者之间延迟的函数:
newRound() {
this.setState({
pcSequence: this.state.pcSequence.concat(
Math.floor(Math.random() * 4) + 1)
},() => {
this.state.pcSequence.forEach(element =>
this.startAnimations(element)
);
}
);
}
startAnimations(element) {
if (element == 1) {
this.activeBtn1(0);
} else if (element == 2) {
this.activeBtn2(1);
} else if (element == 3) {
this.activeBtn3(2);
} else if (element == 4) {
this.activeBtn4(3);
}
}
谢谢!!
你好,我喜欢你的问题并设法让它工作,我将在下面分享代码:
state = {
pcSequence: [],
}
componentDidMount() {
this.newRound();
}
newRound() {
this.setState({
pcSequence: [1,4,3,2]
},() => this.startSequence()
);
}
startSequence() {
if (this.state.pcSequence.length > 0) {
setTimeout(() => {
this.startAnimations(this.state.pcSequence.pop());
this.startSequence();
}, 1000) // 1000ms === 1 second
}
}
startAnimations(element) {
if (element === 1) {
console.log('element 1', element)
} else if (element === 2) {
console.log('element 2', element)
} else if (element === 3) {
console.log('element 3', element)
} else if (element === 4) {
console.log('element 4', element)
}
}
每次您想要重置按钮并以更好的方式填充数组时,您都可以调用 this.newRound,您只用 1 个项目而不是 4 个项目填充数组,例如 [1] 或 [4]
希望对您有所帮助!
我在其他地方找到了帮助,并想展示我所做的,以防其他人过来寻找类似的东西。我删除了 for
循环并使用了 map
:
newRound() {
this.setState({
pcSequence: this.state.pcSequence.concat(
Math.floor(Math.random() * 4) + 1),
round: this.state.round + 1
},() => {
this.state.pcSequence.map((element,index)=> {
setTimeout(() => {
this.startAnimations(element);
}, index * 1000);
})
}
);
}
startAnimations(element) {
if (element == 1) {
this.activeBtn1(0);
} else if (element == 2) {
this.activeBtn2(1);
} else if (element == 3) {
this.activeBtn3(2);
} else if (element == 4) {
this.activeBtn4(3);
}
}