ProgramingTip

MVC 패턴에 맞게 게임 코드를 구성해야합니까?

bestdevel 2020. 10. 30. 08:17
반응형

MVC 패턴에 맞게 게임 코드를 구성해야합니까?


저는 컴퓨터 공학 학위를 받기 위해 대학 신입생입니다. 지난 몇 년 동안 프로그래밍을 많이했지만 최근에는 코드 구성, 디자인 패턴, 언어 차이에 대한 이론적 아이디어를 더 많이 보유하고 있습니다.

Java 클래스가 있으므로 C ++ 연구 / 개발을 중단하고 Java 및 JOGL (Java OpenGL)로 이동했습니다. 훌륭합니다! 그러나 그것은 요점을 벗어났습니다.

작은 롤 플레잉 게임을 만들고 싶지만이 질문은 모든 종류의 게임에 적용됩니다. 모델-뷰-컨트롤러 패턴과 같이 구조화 된 방식으로 게임 오브젝트를 어떻게 구성합니까? 그것은 매우 널리 사용되는 놀라운 패턴으로 보이며 많은 의미가 구현 방법을 구현하는 데 어려움이 있습니다.

예를 들어, 화면에 그리기 위해 GL 객체를 추적해야합니다. MouseListener, MouseMotionListener, MouseWheelListener 및 KeyListener (또는 하나의 클래스, 올인원 입력 관리자)를 구현하는 클래스가 있어야합니다. 그리고 저는이 모든 다른 클래스가 접근하고있을 수있는 곳에 게임 데이터를 넣어야합니다. 누군가 키보드의 버튼을 가리키는 입력 관리 클래스는 키가 매핑 된 작업을 수행해야합니다. 프레임을 그려야 할 때 그래픽 클래스는 모든 다른 '물건'을 반복하고 모두 그릴 방법을 찾아야합니다.

가장 큰 문제는 GUI입니다. 그것은 모두 어디에 연결되어 있습니까? 입력과 비슷하지만 정답은 아닙니다. 실제 게임 시뮬레이션에서 데이터 조각을 설정하고 가져와야합니다. 그리고 더 복잡하게 많은 것을 추가하기로 결정하는 것입니다. (GUI와 유사)) 또한 수정 및 읽기를 위해 많은 데이터에 액세스 할 수 있습니다.

오, 그냥 혼란 스러워요. 이 모든 것이 만드는 방법을 지향 방식으로 함께 작동하도록 만드는 방법을 모르겠습니다 ... 패턴에 명확하게 맞는 것을 작성하는 것은 쉽지만, 하나의 게임 루프에 묶여서 서로를 수정하는 수많은 일이 발생하면 그리고 게임 데이터 등 ... 더 이상 알지도 못합니다. 어쩌면 나는 실제보다 더 큰 거래로 만들 것입니다.

다른 사람이 그렇게 그렇게 신고합니까? 내 상황을 명확하게 설명 해주시면 어디서부터 시작 해야할지 모를 때 걱정하는 시간을 있는지 수 있습니다!

-리켓

편집 :이 모든 것을 이해하는 데 도움이 될 멋진 다이어그램을 찾았습니다 ... 출처 : (주의, PS 파일!) http://www.tucs.fi/publications/attachment.php?fname=TR553.ps. gz

http://img10.imageshack.us/img10/6278/mvcdiagramgamesbl5.png

Edit2 : 나는 그가 그의 MVC 게임을 어떻게 계획했는지 : http://interactivesection.wordpress.com/2007/11/19/dum-de-dum-drum-my-first- mvc- 게임-개발 /

Edit3 : 또 다른 훌륭한 가이드! http://dewitters.koonsolo.com/gamemvc.html


모델을 사용하지 않는 게임 API로 생각하는 데 도움이 될 수 있습니다. 처음부터 정해진 게임에 대한 UI가 전혀없는 게임이 어떻게 축소 될까요? 당신이 염두에두고있는 것이 RPG라고 언급했듯이,이 경우 플레이어 캐릭터, 그의 인벤토리, 주문, 능력, NPC, 심지어 맵과 전투 규칙 같은 것까지 모두 모델의 일부가되는 상상할 수 있습니다. . 최종 게임이 어떻게 상호 작용할 것인지 또는 사용자가 어떻게 상호 작용할 것인지에 대한 세부 사항이없는 독점의 규칙 및 조각과 가능합니다. 교차 및 충돌과 같은 수준의 수준의 레벨, 그림자 또는 음향 효과가없는 수준을 통해 이동하는 3D 오브젝트의 추상 세트 인 Quake와 가변합니다.

이 모든 것을 모델에 넣음 게임 자체는 이제 UI에 구애받지. Rogue 게임과 같은 ASCII 텍스트 인터페이스 또는 Zork와 동일한 명령 줄 UI, 웹 기반 또는 3D UI에 연결될 수 있습니다. UI 중 일부는 게임에 따라 끔찍할 수 있습니다.

보기 계층은 UI 계층입니다. 그것은 당신이 사용했던 UI의 특정 선택을 반영하며 그 기술에 매우 전념 할 것입니다. 모델의 상태를 3D, ASCII 또는 웹 페이지의 이미지와 HTML로 그리는 작업을 담당 할 수 있습니다. 또한 플레이어가 게임과 상호 작용하는 데 사용하는 제어 기술을 표시하는 역할도합니다.

컨트롤러 레이어는 둘 사이의 하나입니다. 실제 게임 운영이 있고 안 종료 뷰 레이어를 구동하는 책임도 없어야합니다. 대신 뷰 레이어에서 수행 한 작업 (버튼 클릭, 화면 영역 클릭, 조이스틱 작업 등)을 모델에서 수행 한 작업으로 변환해야합니다. 예를 들어, 아이템을 떨어 뜨리거나 NPC를 공격하는 것 등이 있습니다. 또한 데이터를 수집하고 레이어가 더 쉽게 표시 할 수 있도록 변환 또는 처리를 수행합니다.

이제 가장 많이 방식은 웹 게임에만 실제로 게임을 구동하는 매우 한 이벤트 시퀀스가있는 것처럼 보입니다. 최근에 제가 시간을 보냈기 때문입니다. 사용자의 요청과 웹과 같은 서버의 응답에 의해 구동되지 않는 게임 (예 : 사용자의 컴퓨터에서 실행되는 게임)에서 모델 계층이 Observer 패턴을 제대로 구현했는지 확인하고 싶을 것입니다. 예를 들어, 시간이 지남에 따라 모델에서 작업이 발생하는 경우 뷰 레이어가 업데이트를 위해 모델을 폴링하지 않도록 할 수 있습니다. 대신 관찰자 패턴을 사용하여 모델은 관찰자에게 모델 개체에 대한 변경 사항이 보관 될 때 알릴 수 있습니다. 이는 변경 사항을 반영하기 위해 View에 대한 신속한 업데이트를 프롬프트하는 데 수 있습니다.

그런 다음 60 초가 지나서 플레이어의 기지에 일부 수리가 발생하면 기지가 수리에 영향을 미치고 기지가 업데이트 플레이어에게 연결된 관찰자에게 즉시 알릴 수 있습니다. 뷰는 옵저버로 첨부 될 수있는 상태가 변경되었으므로 다시해야합니다. 알림 자체에 뷰를 업데이트 할 수있는 충분한 정보가 포함되어 있거나 업데이트해야 할 수있는 결과가 동일합니다.


당신은 거기에서 지내고 있습니다. 기본적으로 "프로그램의 일부를 변경해야하는 경우 어떤 코드가 변경되어야합니까?"라는 질문을 스스로에게 물어 봅니다.

기본 데이터를 변경하지 않고 모양을 변경하면됩니다. 다방면으로 볼 수있는 데이터라면 모델입니다. 그리고 그것은 당신이 플레이하는 방식이라면 그것은 컨트롤입니다.

따라서 두 개의 블레이드 블레이드 또는 하나의 블레이드로 "도끼"를 그릴 지 여부는보기입니다. 도끼로 입힌이 얼마나 많은지가 모델입니다. 그리고 "s"를 입력하거나 마우스 오른쪽 버튼을 클릭하여 도끼를 휘두르는 지 여부는 제어 할 수 있습니다.


MVC를 처음 발견했을 때 모든 것을 담아 내려고했던 때가 기억납니다. 실제로 MVC 패턴을 활용 한 게임을 만들었습니다. 나중에 발견 한 것은 내가 한 일이 과잉 이었다는 것입니다. 나는 내가 만든 거의 모든 단일 클래스를 MVC의 하나의 범주에 맞추려고 노력했습니다.

내가 제안하는 것은 4 인조의 "디자인 패턴"을 읽는 것입니다. MVC 외에 유용한 패턴이 많이 있습니다. MVC를 전혀 사용하지 않는 것이 좋습니다. 특히 게임의 경우 MVC가 좋은 아이디어 확실하지 않습니다. 그 이유는 게임 오브젝트를 다양한 방식 (뷰)으로 표시하고 싶지 않지만 다양한 유형의 게임 오브젝트에 대해 그리기 코드를 병합하고 싶기 때문입니다.

제 2D 게임 엔진의 경우 전략 패턴을 매우 적극적으로 사용했습니다. 플레이어와 내가 스프라이트 라고 부르는 몬스터와 같은 게임 오브젝트 . 나는 스프라이트의 그림을 전략 패턴으로 처리하도록했다 . 그 때 sprite.draw ()를 호출 하면 다음과 같이 할 수 있습니다.

class Sprite {
  void draw() {
    this.view.draw(this.currentPosition, this.currentOrientation);
  }

  Point  currentPosition;    // Current position of this sprite
  double currentOrientation; // Facing angle of sprite
};

이 접근 방식의 이점은 여러 스프라이트간에 뷰를 공유 할 수있는 것입니다. 일반적으로 똑같이 보이지만 위치가 다르고 행동이 다를 수있는 많은 예를 들어 몬스터가 있기 때문입니다.

그래서 행동 나는 행동을 설명하는 코드를 포함하는 것이 될 전략 패턴을 사용할 것입니다. 이렇게하면 다른 위치에있는 여러 몬스터에 동일한 동작을 적용 할 수 있습니다. 그래서 각 프레임마다 update () 함수를 호출하여 위치 방향과 몬스터가하는 일을 업데이트합니다.

class Sprite {
  void setUpdateAction(Action action) {
    this.updateAction = action;
  }

  void update(double start_time, double delta_time)
  {
    this.prevPosition = position();  
    advance(delta_time); // Advance to next position based on current speed and orientation

    this.updateAction.execute(this, start_time, delta_time);
  }

  Action updateAction;
};

이것에는 많은 변형이 있습니다. 현재 구현에서는 currentPosition , speed , orientationadvance ()MotionState 라는 별도의 개체로 분리했습니다 . 이를 통해 경로 검색 알고리즘을 수행 할 때 가능한 위치와 방향의 검색 트리를 구축 할 수 있습니다. 그런 다음 각 업데이트의 동작 방법이나 스프라이트를 그리는 방법에 대한 정보를 휴대하고 싶지 않습니다.


사용자 상호 작용 논리를 중앙 집중화하는 MVC 개념은 게임 개발을위한 좋은 모델입니다.

저는 Flash 게임 개발에 약간의 작업을했습니다. 다음 은 Flash의 개체 풀에 대한 기사입니다. 이 개념은 크로스 플랫폼이며 몇 가지 아이디어를 제공 할 수 있습니다.

한 번에 진행되는 모든 일에 관심을 갖는 것이 옳습니다. 게임 디자인에 따라 게임 루프가 처리해야 할 것이 많을 수 있습니다. 여기에서 모든 더러운 최적화 트릭을 배우게됩니다. 종종 어려운 방법입니다. :)

코드를 구성하는 방법에는 여러 가지가 있습니다. 하나의 옵션은 GameManager 클래스를 Singleton으로 작성하는 것입니다. 모든 게임 개체는 관리 및 사용자 상호 작용을 위해 다시 연결됩니다. GameManager는 모든 사용자 입력을 처리하고 메시지를 개체 풀로 보냅니다. 인터페이스를 사용하여 게임 개체와 GameManager 간의 일반적인 통신 패턴을 정의 할 수 있습니다.

성능 최적화가 진행되는 한 스레딩은 매우 강력합니다. 비동기식 작업을 통해 귀중한주기를 낭비하지 않도록 할 수 있습니다.


모든 리스너와 핸들러는 Controller 클래스 내부로 들어가야합니다. 화면의 객체 상태 (예 : 위치, 색상 등)는 Model 클래스의 일부 여야하며 화면에 무언가를 그리는 코드가 포함되어야합니다. 보기.


MVC에 대한 나의 생각은 MDUC
모델
디스플레이
사용자 입력 컨트롤러입니다.

모델에는 도메인 모델 개체가 포함되어 있습니다
. 디스플레이에는 도메인 모델 개체 의 현재 상태와 동작이 화면에 표시됩니다.
사용자 입력 컨트롤러는 모든 사용자 입력을 처리합니다.

똑같은 패턴이지만 이름이 조금 더 설명 적이기 때문에 패턴의 각 부분에 어떤 책임이 있는지가 더 명확하고 패턴의 의미가 더 기억에 남습니다.

사용자의 입력에서 데이터와 모델 작업을 표시에서 분할하는 것을 확인한 후에는 자신의 코드에서 그룹화 할 위치를 더 쉽게 확인할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/555283/how-can-you-organize-the-code-for-a-game-to-fit-the-mvc-pattern

반응형