2009-05-21 5 views
2

테트리스 게임을 만들고 있다고 가정 해보십시오. 어떤 적절한 프로그래머라도 한쪽에는 뷰 논리가 있고 다른쪽에는 비즈니스 논리가 있습니다. 아마도 full-on MVC가 진행 중일 것입니다.테트리스와 예쁜 그래픽

모델에서 update()을 보내면 예상대로보기가 다시 그려집니다.

하지만 ... 선을 사라지게하는 애니메이션을 추가하고 싶다면보기에서 어떻게 구현할 것입니까?

"모든 것이 적절하게 캡슐화되었습니다"를 제외하고 원하는 가정을하십시오.

답변

4

개인적으로, 블록 위치를 업데이트하지 않아도 가능한 한 자주 화면을 그립니다. 그래서 나는 어딘가에 "update""render" 부분을 가지고있을 것입니다. 업데이트는 위치를 업데이트하거나 업데이트하지 않는 로직으로 공을 플레이합니다. Render는 공을 그래픽 부분으로 옮겨 블록을 그려야하는 부분을 그립니다.

지울 줄이있는 경우 논리는 지울 줄을 알고 표시 할 수 있습니다. 여기서 모든 블록은 4 개의 단일 블록으로 구성되며,이 블록 중 하나는 단일 객체로 간주됩니다. 이제이 블록에 "die"플래그 세트가 있으면 블록을 없애기 위해 일부 렌더링 부분을 가져갈 수 있습니다 (500 밀리 초가 폭발하자). 이 시간이 지나면 개체가 삭제되고 위에있는 블록이 아래로 떨어집니다. 왜 500ms인가? 자, 시간 이동을 사용하면 다른 컴퓨터에서 게임 속도를 동일하게 유지할 수 있습니다.

Btw에는 이미 이러한 업데이트 렌더링 루프를 제공하는 게임 엔진이 있습니다. 예를 들어, XNA, 당신이 가면. NET 라인. 자신의 엔진을 코딩 할 수도 있지만 조심하십시오. 쉬운 일이 아니며 시간이 많이 걸립니다. 나는 이것을 한 번했고 소스 엔진과 같은 엔진이 될 것이라고 기대하지 않는다 ;-)

2

대부분의 게임은 모델 상태의 변경을 기다린 다음보기를 새로 고치는 대신 가능한 빨리 게임보기를 끊임없이 다시 그려주는 루프를 실행합니다.

모델보기 패턴이 마음에 들면 모델에서 모델을 제거한 후보기가 계속해서 몇 밀리 초가 지나면 사라질 수 있습니다.

1

다른 접근법은 MVC 클래스를 차동 실행과 결합하는 것이다. 'view'는 제시되는 것의 모델이다. 그리기 코드는 '보기'가 생성 한 이벤트 스트림을 이전 렌더링의 스트림과 비교합니다. 한 스트림에 선이 있고 그 다음 선이없는 경우 드로잉 코드가 차이를 애니메이션으로 나타낼 수 있습니다. 이렇게하면 도면을 뷰에서 추상화 할 수 있습니다. 종종 MVC의 '뷰'는 디스플레이를 직접 그리는 것보다는 위젯 모음이므로 어쨌든 중첩 된 MVC 계층 구조로 끝납니다. 응용 프로그램은 MVC (데이터 모델, 뷰 객체, 앱 컨트롤러)이며, 여기서 뷰 객체는 MVC (위젯 상태 (예 : 버튼 눌림), 룩앤필/툴킷 바인딩, 툴킷 이벤트 매핑 -> 위젯 상태) 인 위젯 모음을 가지고 있습니다.

1

저는 종종 이런 생각이 들었습니다.하지만 여분의 "전환"데이터,

1)보기는 블록 (모양, 궁시렁 - 궁시렁)의 상태를 주어집니다 :

2)

내 자신의 생각

이 라인을 따라왔다 한 줄을 제거해야한다는 사실은 뷰에서 계산되지 않은 상태로 인코딩됩니다.

  • 변화 없음 : 상태 "에 잠겨 : 상태가 가"잠금 "을"떨어지는 "에서
  • 변경이
  • 이 특정 블록에 대해 동일을

    3)보기 이제 전환을 그리는 방법을 알고있다 "(제거 블록 단위)

  • "잠금 "에서"제거 "로 변경 : 상태가"제거됨 "(라인 완료)
  • "제거 "에서"제거 "로 변경 : 상태가"제거됨 " 그러나 오래된 상태는 "떨어지고있다"
1

게임을 MVC로 생각하면 흥미 롭습니다. 그게 내가 (결코 이상한 이유로) 찍은 적이없는 원근법이지만, 많은 이해가되는 확실히 흥미로운 것입니다. 테트리스 게임을 MVC로 구현한다고 가정 할 때, 컨트롤러와 뷰 사이의 통신과 관련하여 고려해야 할 두 가지 사항이 있다고 생각합니다. 상태가 있고 이벤트가 있습니다.

컨트롤러는 분명히 사용자 상호 작용의 중심점입니다. 키보드 명령을 내리면 컨트롤러가이를 해석하고 적절한 상태를 조정합니다. 그러나 게임이 가끔씩 제거되어야하는 블록으로 라인을 채우는 것과 같이 특정 이벤트와 일치하는 상태로 들어가는 경우가 있습니다.

스코어 그래픽은 훌륭한 토대를 제공합니다. 컴퓨터에서 일관된 속도를 유지하려면보기가 고정 된 주기로 작동해야합니다. 그러나 새 상태를 렌더링하기 위해 화면을 업데이트하는 것 외에도 응답으로 애니메이션을 수행 할 수있는 이벤트 큐가 있어야합니다. Tetris에서 행을 채우는 경우 컨트롤러는 일종의 기본 이벤트 유형에서 뷰 이벤트 대기열로 파생 된 강력한 유형의 이벤트 객체를 발행 할 수 있습니다.이 객체는보기에서 적절한 애니메이션 응답을 수행하는 데 사용할 수 있습니다.