게임에서 Time Stop 또는 Bullet Time을 코딩하는 방법은 무엇입니까?


11

XNA 4.0에서 싱글 플레이어 RPG 플랫 포머를 개발 중입니다. 시간을 "중지"하거나 느리게하는 능력을 추가하고, 플레이어 캐릭터 만 원래 속도로 움직입니다 (Baldur 's Gate 시리즈의 Time Stop 주문과 유사). 정확한 구현이 아니라 일반적인 아이디어와 디자인 패턴을 찾고 있습니다.

편집 : 좋은 의견을 보내 주셔서 감사합니다. 나는 다음과 같은 해결책을 생각해 냈습니다.

    public void Update(GameTime gameTime)
        {

            GameTime newGameTime = new GameTime(gameTime.TotalGameTime,
 new TimeSpan(gameTime.ElapsedGameTime.Ticks / DESIRED_TIME_MODIFIER));
            gameTime = newGameTime;

또는 이러한 선을 따라 뭔가. 이 방법으로 플레이어 구성 요소에 대해 다른 시간을 설정하고 나머지에 대해 다른 시간을 설정할 수 있습니다. 이와 같은 워핑 시간이 중심 요소가 될 게임에서 작동하기에 충분히 보편적 인 것은 아니지만이 경우에는 효과가 있기를 바랍니다. 나는 그것이 주요 업데이트 루프를 어지럽 힌다는 사실을 싫어하지만 확실히 그것을 구현하는 가장 쉬운 방법입니다. 나는 그것이 테셀로 드가 제안한 것과 본질적으로 같을 것이라고 생각합니다. 그래서 나는 그에게 녹색 진드기를 줄 것입니다 :)

답변:


8

이것은 나쁜 해결책 일 수도 있지만 반드시 그런 것은 아닙니다. 델타 시간을 사용하는 경우 특정 시간의 속도를 변경하도록 시간을 변경할 수 있습니다.

예를 들면 다음과 같습니다.

player.update(dt)
dt = dt * .5 --half speed
enemy.update(dt)

물론 이것은 다른 것보다는 적을 업데이트 할 때 알 수있는 경우에만 작동합니다. 모든 것에 속도 값을 부여하고 다음과 같은 작업을 수행 할 수도 있습니다.

x = x + xspeed * dt * speed

첫 번째 부분은 완벽하게 이해되고 두 번째 부분은 명확하지 않습니다
AturSams

2
변경할 수있는 속도 변수를 움직이는 각 객체를 제공하고 (예를 들어 x의) 변형이있을 때 속도 변수에 크기를 곱하십시오.
테셀로 드

이제 말이 되네요 :)
AturSams

두 번째 아이디어는 ... off입니다. "속도"요소로 움직임을 조정하는 것만으로도 물리 중심의 물체에는 효과가있을 수 있지만 AI는 움직임이 느려지거나 손상되어 정상적인 속도로 반응 할 수 있습니다.

AI가 정상 속도로 반응 할 수 있다는 것은 무엇을 의미합니까? AI에 속도 변수를 적용 할 수없는 코드는 무엇입니까?
테셀로드

3

델타 시간 (마지막 프레임 이후에 경과 한 밀리 초)을 사용하는 것만으로는 적을 둔화시킬 수 없습니다. 공격 속도와 같은 것은 마지막 공격 시간에 따라 구현 될 수 있습니다. 시간이 지나면 이동 속도가 느려지지만 공격 속도, 주문 시전 및 기타 효과 (건강 재생, 주문 효과 지속 시간)를 늦추는 것은 무시합니다.

단일 플레이어 게임에서 대규모 게임 요소 그룹을 느리게하려면 각 생물에 대해 두 번째 내부 시계를 만들면 생물이 나타날 때 현재 시간에 시계가 시작됩니다. 느린 주문이 발동 될 때, 매 프레임마다 시계는 실제로 지난 시간의 x % 씩 증가합니다. 모든 몬스터의 행동은 내부 시계에 의해 결정됩니다. 다양한 몬스터가 느리게 저항하는 경우 자신의 시계를 사용할 수 있으며 기본적으로 많은 공간이나 계산이 필요하지 않은 정수입니다.

느린 효과가 멈추더라도 시계는 여전히 사용 중이며 실제로 지나간 시간의 100 % 씩 증가합니다.

이것은 또한 빠른 주문에도 효과적입니다.

@Sidar : 두 가지 선택이 있습니다.

  1. 생물 당 내부 시계. 생물이 다시 공격 할 준비가되었는지 확인하려면 각 공격이 마지막으로 사용 된 시간 + 충전 시간을 저장하고 내부 시계가 이미 그 시간을 지 났는지 확인하십시오.

  2. 공격 당 하나의 타이머 : 공격이 재충전되는 데 걸리는 시간을 알고 있으며 타이머를 설정하고 매 턴마다 * (1-slowdown %)를 통과 한 시간을 빼면됩니다.

개인적으로 처리 시간과 복잡성을 줄이기 위해 여러 개의 개별 타이머와 사용자 하나의 내부 시계를 빼는 것을 선호하지 않습니다.

실제로 선호도에 달려 있습니다 (성능에는 그다지 영향을 미치지 않습니다).


내부 시계가 필요하지 않습니다. 그것은 단순히 당신의 dt (델타 시간)의 곱을 증가 또는 감소시키는 객체에 (어쨌든) 링크 할 수있는 승수에 달려 있습니다. 그룹이나 다른 방법으로 객체를 관리 할 수 ​​있습니다. 나는 당신의 방법이 약간 과도하다고 생각합니다. 그러나 그것이 작동한다면 ... 그런 다음 작동합니다.
Sidar

@Sidar 이것을 피한다면, 당신은 아마 공격 재충전 시간, 철자 지속 시간 등을 위해 공격 당 시계가 필요할 것입니다. 최소한이 방법으로 하나의 시계 만 업데이트하고 속성 재설정을 위해 '마지막 활성화'시간을 유지하면됩니다.
AturSams

그러나 그의 질문은 플레이어를 제외한 환경을 늦추는 것에 관한 것입니다. 저에게 그것은 dt에 1보다 작은 숫자를 곱하는 가장 간단한 형태처럼 들립니다. 플레이어는 그대로 유지하십시오.
Sidar

글쎄, 환경을 늦추는 것은 공격 속도와 다른 능력 (RPG이기 때문에)을 늦추는 것을 포함하며, 재충전 시간에 의존하는 다양한 몹 능력이있을 수 있습니다. 활성화 시간은 말할 것도없고 치유, 버프, 디버프, 스펠 등.
AturSams

2

테셀 로이드 또는 Mr Beast에 의해 노출 된 간단한 솔루션으로 시작할 수 있습니다. 그러나 둔화 주문이 발동 되는 동안 총알 시간과 같은 복잡한 것들을 혼합하기 시작 하면 막힐 것입니다.

시계 계층 구조 를 구현하는 것이 좋습니다 .

.
├── Main clock
│   └── UI clock
│   └── 3D clock
│       ├── GFX clock
│       └── Gameplay clock
│           └── Slowdown spell clock 01
│           └── Slowdown spell clock 02

게임의 모든 것은 시계 중 하나에서 델타 시간을 사용해야합니다 .GFX 시계에서 실행되는 그래픽 효과, 게임 플레이 시계에서 AI 및 애니메이션 실행, 일시적인 Slowdown 철자 시계에서 느린 철자가 실행되는 생물 등 다양한 것들 계층 구조의 다른 부분에 영향을줍니다. 둔화 주문은 사용자 정의 시계를 만들고 영향을 미칩니다. 총알 시간은 전체 3D 시계 계층에 영향을 미칩니다.


감사합니다. 이것은 중요한 통찰력입니다. 그러나 나는 여러 가지 감속 효과가 동시에 발생한다는 것이 특별한 경우에는 의미가 없기 때문에 생각을 단순하게 유지한다고 생각합니다.
David Miler

1

하나는 게임 플레이와 관련된 시간과 "진정한"시간과 같은 두 개의 시계가 필요합니다.

currentGameTime = 0;
gameSpeed = 1.0f;
[...]
currentApplicationTime = GetTime():
timeDelta = (currentApplicationTime - lastApplicationTime)*gameSpeed;
currentGameTime += timeDelta;
lastApplicationTime = currentApplicationTime;

그런 다음 gameSpeed를 변경하여 속도를 높이거나 (> 1) 속도를 늦추십시오 (<1). 플레이어가 다른 속도로 움직이려면 시간이 느려지는지 여부를 확인하십시오.

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