사용자 입력을 받는 동안 명령을 실행하는 방법이 있습니까?

사용자 입력을 받는 동안 명령을 실행하는 방법이 있습니까?

저는 스크립팅을 처음 접했고 작업 방법에 대한 고급 질문이 있습니다.

저는 현재 다음 두 가지 주요 기능을 갖춘 Space Invaders와 유사한 간단한 게임을 디자인하고 싶습니다.

  1. 매초마다 화면 상단에서 총알이 떨어집니다.
  2. 사용자는 화면 하단에서 배를 움직여 총알을 피할 수 있습니다.

문제는 입력을 받는 동안 총알을 계속 아래로 움직일 수 있는 방법을 찾을 수 없다는 것입니다.

메인 루프에 있는 대부분의 코드는 다음과 같습니다.

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

해결책을 찾았습니다. 기본적으로 백그라운드에서 업데이트 루프를 실행하고 포그라운드에서 메인 루프를 실행합니다. 트랩/킬 명령을 사용하여 서로 통신할 수 있습니다.

완전한 예제를 제공하기 위해 .sh 파일을 github에 업로드했습니다.

작동 방식에 대한 수정된 개요는 다음과 같습니다.

참고: 탈출하려면 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

위에 링크된 예제 스크립트를 실제 예제 버전으로 사용하세요. 그러나 이미 가지고 있습니다! 프로그램 아키텍처에 대한 일부 수정입니다.

관련 정보