객체 지향 언어로 게임 엔진을 설계하는 방법은 무엇입니까? [닫은]


26

객체 지향 언어로 게임을 작성하려고 할 때마다, 내가 항상 직면하는 첫 번째 문제는 (어떤 종류의 게임을 작성해야하는지 생각한 후) 엔진을 설계하는 방법입니다. SDL과 같은 기존 라이브러리 나 프레임 워크를 사용하더라도 상태 머신을 사용하여 메뉴를 관리할지, 리소스로드에 어떤 종류의 클래스를 사용할지 등 모든 게임에 대해 특정 결정을 내려야한다는 것을 여전히 알고 있습니다.

좋은 디자인이란 무엇이며 어떻게 구현됩니까? 어떤 상충 관계와 장단점은 무엇입니까?


12
분석 마비를 겪지 않고 충동을 겪고 거기에서 리팩토링하는 데 어떤 문제가 있습니까?
공산주의 오리

7
@TheCommunistDuck 임펄스를 진행하는 것이 이전의 모든 프로젝트에서 취한 접근 방식이기 때문에 새로운 기능을 추가하려면 엄청난 노력과 복잡성이 필요하다는 사실을 알게되었을 때 몇 개월이 지나면 모든 프로젝트가 벽에 부딪칩니다. 지금은 게임 자체를 작성하는 것보다 엔진을 다시 작성하는 데 더 많은 시간을 소비하므로 약간의 예측과 계획으로 장기적으로 시간을 절약 할 수 있기를 바랍니다.
extropic-engine

3
@chuzzum, 좋은 지적입니다. 내가 추천 할 한 가지는 C4 엔진의 아키텍처를 확인하는 것입니다. terathon.com/c4engine/images/architecture.png 그것은 당신이 필요로하는 것보다 훨씬 높은 수준 일지 모르지만 몇 가지 아이디어를 줄 수 있습니다 ;-)
The Communist Duck


3
또한이 질문은 모호합니다. 아마도 귀하의 예 중 하나를 취하여 더 깊이 질문하십시오.
Tetrad

답변:


24

누군가가 '패턴 X를 사용 하여이 작업을 수행해야합니다.

그러나 유용한 리소스 :
Enginuity – Gamedev.net에있는 일련의 엔진 제작 기사.
Game Coding Complete- 이 책을 소유하고 있으며, 게임 프로그래밍의 모든 측면을 잘 다룹니다. 또한 책 전체에 엔진이 내장되어 있습니다.
게임 엔진 아키텍처 -엔진 디자인을위한 훌륭한 책입니다.
C4 엔진 레이아웃 -내 의견에서 가져온 것이지만 엔진의 각 부분을 함께 맞추는 높은 수준의 방법을 보여줍니다.

이것들은 당신이 필요로하는 것에 대해 너무 많을 수도 있지만, 당신은 무언가에 대해 너무 많이 알 수 없으며, 그들로부터 좋은 계획을 얻을 것이라고 확신합니다.

편집 : Gamedev 기사가 새 사이트 이후에 보관 된 것을 잊었습니다. :)


Enginuity 링크가 끊어졌고 기사를 인터넷 검색하면 더 이상 웹에 있지 않은 것으로 나타났습니다. (?) 책은 좋은 자료처럼 보이지만, 나는 더 많은 프로그래밍 책을 항상 주시하고 있습니다.)
extropic-engine

또한 첫 번째 의견과 관련하여 모든 게임에 맞는 마스터 플랜을 제안 할 사람은 없습니다. 방금 몇 가지 게임을 개발하는 과정에서 일반적인 패턴이 많이 나오는 경향이 있음을 알았으므로 다른 사람들이 자신의 게임에서 사용한 것이 무엇인지 궁금했습니다.
extropic-engine

1
링크를 수정했습니다.
공산주의 오리

열정의 경우 +1 @chuzzum 몇 개의 게임 엔진을 살펴보고 영감을 얻고 자신에게 가장 적합한 아키텍처를 도출하십시오. 또한 : 게임 엔진 구성 요소를 계층 구조보다 기반으로 만드는 것이 더 좋습니다. cowboyprogramming.com/2007/01/05/evolve-your-heirachy
Dave O.

1
나는 그것이 엔터티 프레임 워크 부분, 더 집계되어야 하는 엔진 이라고 말하지 않을 것입니다 .
공산주의 오리

7

예를 들어, 현재 악성 로그 프로젝트가 Java로 어떻게 구성되어 있는지 보여줍니다. 2D 그래픽 엔진을 사용하므로 많은 렌더링 코드가 이미 처리되었습니다. 비판을 환영합니다.

class Game
이 클래스는 게임의 현재 상태를 관리하는 상태 머신을 설정합니다. (메뉴에서 새 게임 시작 및 저장된 게임 재생)

interface State
각 State 클래스에는 두 가지 루프 (논리 업데이트를위한 루프와 렌더링을위한 루프)가 있습니다. 또한 Game클래스 를 호출하고 다른 상태로 변경을 요청하기 위한 코드가 포함되어 있습니다 .

class ResourceManager
Game필요한 모든 리소스를로드하고 액세스 할 수 있는 클래스 로 초기화 된 싱글 톤입니다 . 예를 들어,이 레벨이 다른 레벨에서 리소스를로드 / 언로드하기 어렵 기 때문에이 디자인이 마음에 들지 않습니다. 내가 다시 시작한다면 아마도 이것을 다르게 디자인 할 것입니다.

class Map
지도에는 타일 배열과지도에있는 모든 생물과 아이템의 목록이 있습니다. 꽤 기본적인 수업입니다.

class Creature
생물체는 움직임 계산을 포함하여 자신에 대한 정보를 포함합니다 (자신이 어떤 맵에 있는지 알고 장애물을 찾기 위해 쿼리 할 수 ​​있어야 함). 이것을 할 것인지, 어떤 종류의 관리자 클래스가 모든 피조물을 돌봐야하는지 결정하는 것은 내가 고투하는 것입니다.

interface AITask
생물체는 생물체의 논리 루프가 실행될 때마다 실행되는 AITask 목록을 가질 수 있습니다. AITask에는 생물체에 명령을 내리는 자체 논리 루프와 작업이 성공적으로 완료되었는지 여부를 결정하는 종료 조건이 있습니다.

interface UIElement
이 엔진에 대한 자체 UI를 구현했습니다. 각 UIElement에는 렌더링 루프와 논리 루프가 있습니다. 또한 키보드 / 마우스 입력 처리를위한 루프가 있습니다. 모든 요소는 여러 하위 요소를 가질 수 있으며, 부모 요소 다음에 렌더링되며 키보드 / 마우스 입력을 대신합니다. 예를 들어 하위 메뉴가있는 메뉴를 만들 수 있습니다.


이 문제가 정확히 무엇입니까? 그것은 나에게 완벽하게 보인다.
공산주의 오리

@TheCommunistDuck 내가 선택한 예제에서는 실제로 나오지 않지만이 코드에는 많은 문제가 있습니다. ResourceManager 클래스는 그중 하나이지만 상태에 문제가 있습니다. 많이 확산되어 많은 코드를 복사합니다. 특히 플레이어가 한 번에 많은 선택을 할 수있는 RPG에서는 매우 복잡한 상태 그래프로 끝날 수 있습니다. 예 : 주문을 시전합니다. NormalState-> SelectSpellState-> SelectTargetState-> InvalidTargetState (실패한 경우)-> DoSpellAnimationState-> NormalState에서 이동합니다. 그리고 그것은 단지 하나의 행동입니다.
extropic-engine

1
아니 아니. 아니요 . 아니. 안돼 당신이 그것을 좋아하지 않는다고 말했다.
Bartek Banachewicz

6

가장 먼저해야 할 중요한 점은이 질문에 대한 '좋은'답변이 없다는 것입니다.

정답에 가장 가까운 것은 다음과 같습니다. 게임 유형, 대상 플랫폼, 제약 조건 (시간) 등에 따라 크게 다릅니다.

그것은 다른 사람들 이이 문제에 대답하기 위해 어떻게 노력했는지 보여줄 좋은 기사가 있다고 말했습니다.
공산주의 오리 가 게임 개발에 대한 열정 기사를 언급하면서 게임 아키텍처의 일부를 이해하는 데 도움이되었습니다.

내 현재 디자인은 Quake3 / Doom3 의 하이브리드이며 약간의 .NET 클래스 라이브러리입니다. :)

나는 두 개의 라이브러리 (정적 또는 동적 당신이 / 건설 제공하는 방법에 따라 달라짐)이 Framework과를 Library.

라이브러리에는 게임 소프트웨어 제작에 도움이되는 모든 도우미 클래스가 포함되어 있지만 이러한 종류의 제품에만 국한되지는 않습니다. 즉, 게임 코드에 최적화되어 있지만 링크 된 목록의 서비스가 필요한 모든 것이 사용될 수있는 링크 된 목록의 구현이 있습니다.

프레임 워크는 '엔진'의 내장입니다. 이 중 많은 부분이 Quake3의 디자인 철학 (보다 객체 지향적 인 방식)을 따릅니다. 여기에는 CLI , 타이밍 관리, OS 특정 코드 및 결국 네트워킹 계층 등이 포함됩니다.

그런 다음이 두 개는 생산중인 실제 앱과 연결됩니다. Game당신은 게임의 특정 코드를 포함하는, 좋아합니다. Quake3는 재생중인 'mod'에 따라 DLL을로드하는 것과 거의 같은 방식입니다.

여기에 구조에 대한 아이디어를 제공하기 위해 각 라이브러리에 대한 폴더와 내용을 빠르게 분석했습니다.


  • 뼈대
    • IO (전문가 파일 관리 클래스, 텍스트 인쇄 클래스 (예 : CLI) 및 로깅 등)
    • 회로망
      • 클라이언트 (Framework에서 '게임을하는 사람 / 게임하는 사람'으로 간주하는 것을 나타내는 클래스)
      • 서버 (프레임 워크에 대한 연결을 관리하고 플레이어를 관리하는 클래스)
    • 플랫폼 (키보드 / 마우스 / 컨트롤러 처리 클래스, getTime ()과 같은 OS 특정 루틴)
    • 시스템 (오류 메시지, 타이밍 클래스 및 CLI 자체의 인쇄를 지원하는 오류 클래스와 같은 매우 낮은 수준의 클래스)
    • 렌더러 (자체 설명)
    • 기타

  • 도서관
    • 콜렉션 (데이터 콜렉션, 링크 된 목록 / 해시 테이블 등을 나타내는 클래스)
    • 수학 (벡터 및 행렬과 같은 기본 수학 도우미 클래스)
    • 기타

HTH! 당신에게 몇 가지 조언을 주어야합니다 ...



-3

고려할 사항

  • 객체 지향 언어는 일반적으로 일급 함수가 없거나 모든 데이터가 객체 (Java의 정수 또는 부동 소수점)가 아니기 때문에 문제가 있습니다. 디자인 패턴은 여러 패턴으로 이러한 문제를 해결합니다. 일반적으로 코딩하는 것이 더 빠르며 언어를 사용할 수있는 언어를 사용하는 것이 더 쉽습니다 (일등 객체). 예를 들어 Python (객체 지향 디자인도 가능)의 경우 속도가 느려집니다.
  • AI에 이벤트 미적분학
  • Hoare 논리, 전제 조건 및 사후 조건을 사용하여 최소한 코드 테스트
  • 요원, Quake 엔터티를보십시오
  • 관계형 데이터베이스, 데이터를 저장하는 강력한 방법

좋은 디자인

  • 응급실 다이어그램 만들기
  • 올바르게 해
  • 데이터베이스, 객체 또는 데이터 구조를 생성하십시오

데이터는 프로그래밍의 핵심입니다. 데이터를 잘 이해하면 일반적으로 알고리즘이 나타납니다 (컴퓨팅 결정과 같은 수치 알고리즘을 계산하지 않는 경우).


이 답변은 매우 모호하고 혼동되기 때문에 -1입니다. 관계형 데이터베이스는 OO 엔진과 전혀 관련이 없습니다. 영어가 모국어가 아니라는 것을 이해할 수 있지만 첫 번째 단락에서 의미하는 바를 설명해 줄 수 있습니까? 모순적 인 것처럼 보입니다 (OO 언어에는 문제가 있지만 디자인 패턴이 거의 항상 OO 구조이지만 디자인 패턴이있는 언어로 프로그래밍하는 것이 더 쉽습니다).
공산주의 오리

@ 덕 모순? OO는 다른 언어로는 존재하지 않는 문제가 있습니다. DP는 c2.com/cgi/wiki?DesignPatternsInDynamicProgramming 참조하십시오 .
user712092

@ 덕 1) C ++에서 SQL을 사용할 수 있습니다. 2) ER에서 객체의 속성을 유추 할 수 있습니다 (권장하지는 않지만 권장 사항은 아닙니다) 3) 관계에서 structer를 데이터화 할 수 있습니다 (이것은 목록에서 elemenents를 임의로 정렬해야하기 때문에 목록입니다) 이것은 빠른 조회가 필요하기 때문에 해시입니다)
user712092

@Duck 죄송합니다. 재주문로 실수했습니다. 나는 "DP가 XY보다 쉽다"고 주장하고 싶지 않았지만 "일등석을 할 수있는 언어는 ..." :)
user712092

예, 기능적 언어에는 장점이있을 수 있습니다. 그러나 공평하게도 OO 접근 방식은 gamedev 관점에서 논리적으로 의미가 있다고 생각합니다. 또한 관계형 데이터베이스 가 필요한 이유는 없습니다 . 물론 유용 할 수 있습니다. 그러나 어디에서나 필요한 구성 요소가되지는 않습니다.
공산주의 오리
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.