"게임 로직 코드"란 무엇입니까?


50

나는 C # / XNA를 사용하고 있으며 업데이트 코드와 드로우 코드를 섞지 말라고 꽤 많이 들었습니다. 그리고 확실하지 않습니다! 그러나 누구나 '논리 코드'가 정확히 무엇인지 설명해 주시겠습니까?

여기에서 볼 수 있듯이 : http://blogs.msdn.com/b/shawnhar/archive/2007/07/25/understanding-gametime.aspx

[...] 모든 게임 로직을 Update 메소드 (Draw가 아닌!)에 넣으면 모든 것이 일정한 속도로 실행됩니다.

내 게임 속도가 FPS에 비해 변동하기 때문에 이것을 묻습니다. 느린 FPS는 느리게 움직이는 물체와 같으며 그 반대도 마찬가지입니다. 그리고 예, 예상 position += speed * (float)gt.ElapsedGameTime.TotalSeconds;코드를 포함하고 있습니다.

이것은 아마도 큰 신인 질문이지만, 나는 이것의 정의에 대해 절대적으로 명확하게하고 싶습니다.


나는 당신이 의미하는 것 같아요 position = speed * ...TotalSeconds. 이 =아닙니다 +=. 이 인 경우에 +=사용자가 입력처럼, 당신의 위치는 거의 즉시 화면을 날아 것입니다.
DrZ214

'position + = direction * speed * ... TotalSeconds'와 같은 코드가 있으며 매우 잘 작동합니다. 내가 잘못 입력했을 수도 있지만 position = speed는 모든 업데이트에 할당합니다. 귀하의 방법은 효과가 있지만 내 코드는 다음과 같이 작동합니다. (방향이 정규화
됨에

gt.ElapsedGameTime.TotalSeconds프로그램 (게임)을 시작한 후 경과 된 시간 (초) 이라고 생각했습니다 . 여기에 속도를 곱하면 5 초 후에 재생 속도가 5 배 빨라집니다 (속도가 0으로 설정된 특별한 경우 제외). 당신이 무엇을 가질 수 있는지 확실하지 않지만, 나는 흥미 롭습니다.
DrZ214

1
아하, 그것은 마지막 업데이트 이후입니다. gamedev.stackexchange.com/questions/67968/…
Shyy Guy

2
매혹적인 나는 결코 그것을 추측하지 않았을 것입니다. 개인적 iii으로 몇 초 만에 원하지 않기 때문에 모든 업데이트를 수동으로 증가시키는 자체 변수를 사용하기 때문에 몇 초 만에 그런 일이 전혀 필요 하지 않았습니다. 단계 또는 프레임이 필요합니다. 그래도 당신의 길은 소프트 코딩의 유효한 방법이라는 것을 알 수 있습니다.
DrZ214

답변:


102

게임 세계의 상태를 바꾸나요? 논리 코드입니다.

게임 세계의 상태를 표시합니까? 렌더링 코드입니다.


코드를 100 % 확실하게 살펴 보겠습니다. 좋은 설명 감사합니다.
Shyy Guy

38
입력을 처리합니까? 컨트롤러 코드입니다. 다른 유형의 컨트롤과 동일한 로직을 사용할 수 있도록 컨트롤을 로직과 분리하십시오. 예 : FPSInputController + CharacterMotor vs. AIInputController + CharacterMotor vs NetworkInputController (예 : 멀티 플레이어 인스턴스의 다른 플레이어) + CharacterMotor. 모터 (로직 코드)는 지시 사항을 얻는 방법에 신경 쓰지 않고 제공된 지침 만 제공합니다 (이 종류의 분리는 플레이어에서 AI 봇 (왼쪽 4 데드 및 유휴 플레이어를 생각 함)으로 쉽게 전환하고 다시 다른 것들 사이).
Draco18s

10
Draco는 좋은 지적을 제시합니다. 코드에 넣을 수있는 여러 부서가 많이 있습니다. Nils의 나눗셈은 논리와 렌더링 사이의 전형적인 나눗셈을 고려하지만, 다른 많은 레이어가 있습니다. 레이어를 레이어로 분리하는 실제 이유는 각 레이어가 비슷한 요구 사항을 가진 유사한 스타일의 코드를 요구하는 유사한 동작으로 구성되어 있기 때문입니다. 예를 들어, 많은 게임에서 2 ~ 3 프레임의 게임 로직을 사용하여 게임 프레임을 완성 할 수 있지만 각 프레임을 렌더링하지 않으면 사용자의 시선이 빠르게 나타납니다.
Cort Ammon

그것들을 구별되게 유지하면 요구의 근원이되기 시작할 때 요구 사항을 관리하는 데 도움이됩니다.
Cort Ammon

6
MVC를 너무 많이 던지면 크롤링 속도가 느려질 수 있으므로 항상 유지 관리 성과 최적화 사이의 균형을 유지하려고 노력하십시오. 그러나 자신이하고있는 일을 절대적으로 확신하지 않는 한 너무 일찍 최적화하지 마십시오. 그리고 항상 리팩토링 할 수 있다는 것을 기억하십시오. 그리고 ... 어, 많은 게임을 만들고 실수로부터 배우십시오.
Maurycy 2012 년

24

다음과 같은 경우 분리가 정확합니다.

  • Update ()에 대한 산재 호출없이 연속으로 Draw ()를 여러 번 호출하면 호출간에 눈에 띄는 변화가 발생하지 않습니다.
  • Draw ()를 산재하지 않고 Update ()를 여러 번 연속 호출하는 것은 화면을 끈 상태에서 게임을하는 것과 같습니다.

5
Draw()시간이 지남에 따라 올바르게 쓰면 다른 그림을 그릴 수 있습니다. 예를 들어 애니메이션 스프라이트 프레임이 계속 변경 될 수 있습니다. 또한 렌더링 코드가 일반적인 트릭을 사용하고 velocity * time since last update / period of update객체의 보이는 위치에 추가 하는 경우 (실제 위치는 변경되지 않은 채) 객체가 계속 시각적으로 앞으로 나아갈 수 있습니다.
HolyBlackCat

2
iffif-and-if-if를 의미합니까?
BalinKingOfMoria

3
@HolyBlackCat : 논쟁의 여지가 있습니다. 그래픽을 일시 중지하려면 어떻게합니까? 애니메이션 프레임이 게임에 영향을 미치는 경우 (히트 박스에 해당하는 공격 애니메이션 등)? 시각적 보간법은 여전히 ​​"시간"(게임의 델타 시간에서와 같이)이 지나가고 있음을 의미하지만, 시간이 지나고 있지 않으면 Update동기화 되지 않은 다른 것은 무엇입니까? 플레이어 입력이 누락되거나 네트워크 이벤트가 처리되지 않는 등? 게임은 그 클럭에서 파생 된 게임 로직 또는 물리학에 대한 고정 된 "틱"과 함께 동일한 클럭에 의해 유도 된 파생 그래픽 상태와 함께 단일 클럭에서 벗어나야합니다.
Sean Middleditch

@SeanMiddleditch 동의합니다. 거의 항상 Draw()같은 방식으로 쓸 수 있으므로 여러 번 연속해서 호출 할 때 항상 같은 그림을 그립니다. 가능하다면 그렇게해야합니다. 그러나 어떤 주파수 Draw()를 호출 할지 모르는 경우 가 있습니다. 예를 들어, 새로운 120hz 모니터를 완벽하게 지원 (실제 120 FPS)하고 vsync를 켜려는 경우. What if I want to pause graphics?그런 다음 실제 델타 시간 대신 0을에 전달합니다 Draw().
HolyBlackCat

2
@HolyBlackCat : 내가 얻었던 것은 120hz 렌더링의 사용을 배제하지 않습니다. 나는 고정 추첨 율을 절대 추천하지 않았다. 그것은 단지 아마추어입니다. 고정 속도 게임 로직 틱에 대한 누적 값으로 공급되는 렌더 프레임의 관점에서 델타가 측정되는 글로벌 게임 클럭이 하나 있어야합니다. 이 글로벌 시계는 보간을 포함한 그래픽을 구동합니다. 클럭 스케일을로 설정하여 그래픽을 일시 정지 할 수 있습니다 0. 문자 보간이 중지되는 동안 UI가 계속 실행되고 애니메이션되는 등 계층 적 시계를 가질 수 있습니다.
Sean Middleditch 2016 년

7

여기서 중요한 것은 모델이 아닌 Model 사물을 분리하는 것입니다.

게임 로직은

이들은 모두 서로 다른 관련 소프트웨어 아키텍처 패턴입니다. 그러나 모든 경우에 Model은 동일한 논리이며 실제 상태입니다.

비즈니스 소프트웨어를 만들 때 비즈니스 로직이라고도하며 일부 비즈니스 정책을 인코딩합니다. 예를 들어 은행을 위해 무언가를 코딩하고 신용 카드 청구서를 계산하는 경우 30 일 이내에 부채를 청산하면 누군가가이자를 지불하지 않아도되는 기능은 비즈니스 논리의 일부입니다. 모델. 예를 들어 표시 레이어 중 하나에 존재하지 않습니다. 청구서를 인쇄하는 코드는 예를 들어 해당 조치에 따라 텍스트를 편집하지 않습니다. 이 예제는 코드를 구성하는 이유를 강조합니다.

게임 로직도 마찬가지입니다.

어떤 시점에서 게임이 다른 콘솔로 포팅되었다고 상상해보십시오. 현재 목표와 실제로 다른 것을 상상하는 것이 도움이 될 수 있습니다. 예를 들어 게임 패드 / 컨트롤러로 소싱을 목표로하는 경우 게임을 터치 스크린 태블릿으로 포팅한다고 가정 해보십시오. 게임 로직은 코드를 이식 할 때 변경되지 않는 코드의 일부입니다.

게임이 군사 전략 게임과 같은 게임이라면 세계에서 가장 복잡한 보드 게임으로 전환된다고 상상해보십시오. 게임 로직은 규칙 섹션의 라인에 직접 대응하는 코드 섹션입니다. (규칙 책의 모든 줄이 아니라 움직이는 부분에 대한 줄이 아니라 일부.).

게임 논리는 형식에 관계없이 절대 변하지 않는 것입니다.

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