게임으로 여행하는 시간을 구현하는 방법?


10

게임에 시간 여행을 구현하는 방법이 궁금합니다. 사용자가 30 초 정도 뒤로 감거나 빨리 감을 수있는 Braid와 같이 시간이 거꾸로되는 매우 복잡한 것은 없습니다.

웹을 많이 검색했지만 결과는 일반적으로 "3시"또는 타이머와 같은 시간을 사용하는 것을 말합니다.

내가 생각할 수있는 유일한 것은 2 개의 배열을 사용하는 것입니다. 하나는 플레이어의 x 위치에 대한 것이고 다른 하나는 플레이어의 y 위치에 대한 것입니다. 그런 다음 배열을 반복하고 되감기 / 빨리 감기 시간에 해당 위치에 캐릭터를 배치합니다. 작동 할 수 있습니까? 작동한다면 배열의 크기는 얼마이며 플레이어의 x와 y를 얼마나 자주 저장해야합니까? 작동하지 않으면 다른 방법을 시도해 볼 수 있습니까?

미리 감사드립니다!


11
뉴스 ( ust.hk/eng/news/press_20110719-893.html ) 를 읽지 않습니까? 그들은 단지 시간 여행이 불가능하다는 것을 보여주었습니다. 따라서 코딩이 불가능합니다.

시간 여행에 대해 가능한 의미론을 생각해야하며, 이후에만 구현에 대해 생각할 수 있습니다.
Paŭlo Ebermann


2
자신에게 몇 가지 벡터 수학을 배우십시오 . 두 가지 별도의 배열을 제안하는 경우 결코 사용하지 않았다는 것을 암시합니다. 게임 프로그래머가 물건을 단순화 할 수있는 양 때문에 알아야 할 것이 중요하다고 생각합니다.
doppelgreener

5
import universal.back2future.FluxCapacitor;
jhocking

답변:


6

배열 아이디어는 Braid에서 구현 된 방식과 거의 같습니다. 캐릭터에 작용하는 유일한 것이 중력, 키보드 / 조이패드 입력 및 기타 캐릭터 인 경우, 해당 캐릭터에 대해 중요한 모든 것을 알기 위해 각 단계에서 위치와 속도 만 저장하면됩니다. 문자 당 초당 10 개의 스냅 샷을 저장하면 한 문자의 이력 분 동안 여전히 50K 미만으로 대부분의 시스템에서 쉽게 관리 할 수 ​​있으며 그보다 더 효율적인 방법을 찾을 수 있습니다.


이것이 올바른 길입니다. 예를 들어 store active commands : 타임 스탬프가있는 키 누르기. 시스템이 결정적인 경우 대부분의 다른 동작을 추정 할 수 있습니다. 10fps 트래커는 되감기 시스템에 적합하지만 실제 명령이 유지되는 한 사실상 개체의 상태 또는 상태 변경이 허용되는 경우는 더 적습니다.
karmington

4

명령 패턴을 읽으십시오 . 실행 취소 조치 (나중에 다시 실행하기위한 조치)를 제공합니다. 이는 선박의 위치뿐만 아니라 플레이어가 취하는 모든 조치를 처리합니다.

그러나 배열 아이디어도 적절하다고 생각합니다.


아마도 좋은 생각은 아닙니다-메모리를 많이 사용하는 것 외에도 (엔티티의 속도를 위치에 추가 할 때마다 "액션"으로 저장해야 함) 부동 소수점을 사용하기 때문에 고정 소수점 수학이 거의 필요합니다 위치 / 속도에 대한-포인트 (x+v)-v가 같지 않을 수 있습니다 x.
BlueRaja-대니 Pflughoeft

1
@BlueRaja-그 방법이 메모리를 많이 사용하는 곳을 보지 마십시오. 100 FPS에서 마지막 10 초를 저장하면 1000 개의 n- 튜플 명령을 저장해야합니다. 여기서 n은 최대 5 정도입니다. 또는 각 프레임에 절대 위치 만 저장하고 되감기의 경우 해당 경로를 따라 캐릭터를 뒤로 애니메이션하면됩니다. 또한 가능한 부동 소수점 문제를 제거하고 시작 위치로 정확하게 돌아갈 수 있습니다.
Hackworth

3

두 개의 개별 배열이 아닌 플레이어의 위치를 ​​설명하는 하나의 클래스가 있어야합니다 (Java에 이미 Point 클래스가있을 것입니다 ... 저는 최근 C # 사람입니다). 하나의 단일 배열을 사용하여 과거 위치를 유지하십시오.

"링 버퍼"를 설정해야합니다. 즉, 배열의 끝에 도달하면 가장 오래된 항목을 덮어 쓰면서 배열의 시작 부분으로 돌아갑니다. 당신이 시간을 거슬러 여행한다면, 그 반대가 사실입니다 (처음에 도착하면 끝까지 동그라미를 치십시오).

30 초 분량의 과거 데이터를 유지하려면 공간을 미리 할당하고 고정 크기 배열을 사용하려면 프레임 속도를 알아야합니다. 게임을 30 초에 10 프레임 / 초로 렌더링하면 300 요소입니다.


2

GDCVaultBraid 제작자 인 Jon Blow 의 사이트 에서 Braid에서의 되감기 구현 이라는 강의를 진행했습니다. $ 3.95에 대한 . 나는 이것이 당신이 원하는 정보를 가지고 있다고 확신합니다;)

편집 : 아마도 Java에는 없지만 아이디어는 유지해야합니다.


그들이 성적표를 판매하는지 아니면 오디오 만 판매하는지 아십니까?
o0 '.

사이트를 빠르게 검색하여 찾을 수 없습니다. 아마도 당신은 일부 전사 소프트웨어를 사용할 수 있습니까?
NoobsArePeople2

1

추천 에릭 J는 상기 포인트들의 집합 합리적인 링 버퍼 소리의 개체로서, 플레이어의 과거 위치를 저장한다.

그러나 를 사용 하여 버퍼를 구현하는 것이 좋습니다 . 어레이보다 업데이트하는 것이 훨씬 저렴하며 프레임 속도를 미리 알 필요가 없습니다.

update():
   time_queue.push(player.positions)
   if current_time() - start_time > n:
       queue.pop()

아직 프레임 속도 변경이나 실제로 시간 여행을 할 경우 어떻게되는지 고려하지 않으므로 각 항목에 타임 스탬프를 저장하고 대신 확인하십시오.

update():
    time_queue.push({
        'pos': player.positions,
        'time': current_time()
    })
    first_entry = queue.peek()
    while current_time() - first_entry['time'] > n:
       queue.pop()
       first_entry = queue.peek()

도움이 되었기를 바랍니다!


1

Memento 라는 디자인 패턴이 있습니다. Braid와 같은 게임의 시작점이라고 생각합니다.

메멘토 패턴은 객체를 이전 상태 (롤백을 통해 실행 취소)로 복원하는 기능을 제공하는 소프트웨어 디자인 패턴입니다.

메멘토 패턴은 발신자와 관리인이라는 두 개체에 의해 사용됩니다. 발신자는 내부 상태를 갖는 일부 개체입니다. 관리인이 작성자에게 무언가를하려고하지만 변경 사항을 취소 할 수 있기를 원합니다. 관리인은 먼저 발신자에게 메멘토 객체를 요청합니다. 그런 다음 수행하려는 모든 작업 (또는 일련의 작업)을 수행합니다. 조작 전에 상태로 롤백하기 위해 메멘토 오브젝트를 작성자에게 리턴합니다. 메멘토 개체 자체는 불투명 개체 (관리자가 변경할 수 없거나 변경해서는 안되는 개체)입니다. 이 패턴을 사용할 때 발신자가 다른 오브젝트 나 자원을 변경할 수있는 경우주의를 기울여야합니다. 메멘토 패턴은 단일 오브젝트에서 작동합니다.

http://en.wikipedia.org/wiki/Memento_pattern

추가 정보 : http://dofactory.com/Patterns/PatternMemento.aspx


2
이것이 어떻게 도움이되는지 알지 못합니다. OP가 Braid의 것과 같은 매끄러운 것을 요구하는 동안 그것은 "인스턴트 롤백"인 것 같습니다. 어쩌면 내가 뭔가를 잘못 읽었 을까?
o0 '.

이 패턴은 단일 롤백을 의미하지 않습니다. 예를 들어 "타임 라인"작업을 만들 수 있습니다. 다음은이 패턴의 사용법에 대한 브라질 리안 블로그 게시물입니다. abrindoojogo.com.br/padroes-de-projeto-memento 다음은 Flash에서 작성된 예제입니다. abrindoojogo.com.br/files/fasteroids.swf Move : Arrows | 촬영 : 우주 | 되감기 작업 : 백 스페이스
Marcelo Assis

1

시간 조작과 관련된 XBox360 용 게임이 출시되었습니다. 평범 했으므로 현재 제목을 기억할 수 없습니다. 어쨌든 개발자와의 인터뷰에서 그들은 시간 조작을 관리하는 방법을 설명했습니다.

모든 X 프레임 (X 값이 낮을수록 세밀한 조작으로 이어짐)에서 해당 시점에서 게임 월드의 "스냅 샷"을 찍어 게임 내 시간과 연결합니다.

시간이지나면서 정상적으로 게임을 진행하는 동안, 모든 반응은 나중에 언젠가 설정 한 스냅 샷에 기여합니다.

그런 다음 게임 세계는 현재 시간의 스냅 샷과 향후 스냅 샷 X 프레임간에 반복됩니다.

그런 다음 시간을 되돌리려는 경우 시간 방향을 뒤로 설정하여 과거의 현재와 스냅 샷 X 프레임간에 반복되도록합니다 (미래의 스냅 샷 생성 기능은 비활성화).


스냅 샷의 세분성에 대한 포인트는 +1입니다.
Omar Kooheji

0

단순히 게임의 가상 시간을 다른 공간과 같은 차원으로 취급 할 수 있습니다. 따라서 외부에서 시간 여행은 게임의 가상 세계에서 간단한 n + 1 차원 움직임입니다.

사용자 입력이 없을 때 유니버스의 동작을 결정하는 일부 사용자 상호 작용 및 일종의 물리 시스템을 가정 할 때 사용자 상호 작용의 영향 만 기록하면됩니다 (예 : n + 1 차원 속도 / 가속 벡터 변경) 물리는 시간을 되돌릴 수 있어야합니다.

이렇게하면 주어진 시간 좌표에서 게임 유니버스의 상태를 계산하기 위해 훨씬 적은 메모리가 필요합니다.


내가 다른 코멘트에서 언급 한 바와 같이, 비디오 게임의 물리학은 일반적으로 하지 부동 소수점 숫자를 사용하는 경우, 때문에, 시간을 되돌릴 수 (x+v)-v와 동일하지 않을 수 있습니다x
대니 Pflughoeft - BlueRaja

0

엔터티에 속도, 회전, x 및 y 위치가 있다고 가정합니다. 이것들은 가속과 함께 기본 이동 상태, 값 등 무엇이든 호출합니다. 두 가지 방법으로 데이터를 저장할 수 있습니다.
1. 회전, x 및 y 위치
저장 2. 회전, x 속도 및 y 속도 저장

고정 속도가있는 경우 회전 만 저장하거나 두 축에 대해 하나의 속도 만 저장할 수도 있습니다.

엔터티에 정적 로테이션이없는 한 게임에서 로테이션 저장이 필요합니다. 대부분의 경우에는 그렇지 않습니다.

즉, 여러 값에 객체 목록을 사용해야합니다. 예를 들어 업데이트 방법을 1 초에 20 회 호출하고 fps와 독립적 인 멋진 타이머 시스템이있는 경우 지난 30 초 동안 필요한 이동 값을 저장하기 위해 20 * 30 개의 객체 배열을 만들 수 있습니다. . 간단한 배열을 사용하는 것은 권장되지 않습니다. 모든 요소를 ​​한 번에 하나씩 업데이트 호출마다 이동해야하기 때문입니다.

이를 기반으로 목록을 보거나 뒤로 갈 수 있습니다. "현실적인"효과를 얻으려면 움직이는 모든 객체에이 기술을 사용하십시오. 그러나 이것은 게임 디자인과 관련이 있습니다.

당신이 물건을 파괴하는 경우, 당신이 깔끔한 친구 Mr. Garbage에게 스트레스를주지 않도록하기 위해 그것들을 모으는 것을 기억하십시오;)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.