我对脚本编写相当陌生,并且我有一个关于如何做某事的高级问题。
我想设计一个类似于太空侵略者的简单游戏,目前有以下两个主要功能:
- 子弹每秒从屏幕顶部落下。
- 用户可以在屏幕底线移动本舰并躲避子弹。
问题是我找不到一种方法来不断向下移动项目符号,同时仍然获得输入。
主循环中的大部分代码:
while true #gets user input and updates screen.
do
read -r -sn1 -t 1 USERIN
case $USERIN in
D) moveleft ;;
C) moveright ;;
esac
updatescreen #(my code makes sure that at least a second has passed since the last "updatescreen" execution before running this)
done
我希望屏幕每秒更新一次,独立于用户输入。现在,程序更新时会断断续续,因为有时需要等待更长的时间才能输入超时。如果读取超时值较低就好了,但如果我降低它,则会收到错误:“无效的超时规范”。
有没有办法解决这个问题,或者可能是一个完全不同的程序组织?
答案1
你需要多线程。看一下GNU 并行
答案2
我找到了解决方案。基本上,您在后台运行更新循环,并在前台运行主循环。它们可以使用 trap/kill 命令相互通信。
以下是其工作原理的修改后的概述:
注意:你必须使用ctrl-c来逃脱。
#!/bin/bash
update()
{
trap "move_left;" $LEFT
trap "move_right;" $RIGHT
while true; do
#output whatever needed
done
}
read_in()
{
trap "return;" SIGINT SIGQUIT
while true; do
read -s -n 1 key
case key in
C) kill -$RIGHT $game_pid ;;
D) kill -$LEFT $game_pid ;;
esac
done
}
move_left()
{
#update position variable
}
move_right()
{
#update position variable
}
update &
game_pid=$!
read_in
kill -9 $game_pid
使用上面链接的示例脚本作为工作示例版本,但您已经拥有了!只是对程序架构进行了一些修改。