문제

테트리스 게임을 구축한다고 가정 해 봅시다. 적절한 프로그래머로서, 당신은 한쪽에 뷰 논리가 있고 다른쪽에는 비즈니스 논리가 있습니다. 아마도 완전한 MVC가 진행되고있을 것입니다.

모델이 보낼 때 update(),보기는 예상대로 스스로를 다시 그리십시오.

그러나 ... 라인을 사라질 애니메이션을 추가하고 싶다면보기에서 어떻게 구현 하시겠습니까?

"모든 것이 올바르게 캡슐화 된"것을 제외하고 원하는 가정을 만드십시오.

도움이 되었습니까?

해결책

개인적으로, 블록 위치의 업데이트가 없더라도 가능한 한 자주 화면을 구분합니다. 그래서 나는 어딘가에 루프를 가질 것입니다 "업데이트" 그리고 a "세우다" 부분. 업데이트는 위치의 업데이트 및/또는 블록 제거를 수행하거나하지 않는 논리에 공을 재생합니다. 렌더는 공을 그래픽 부분으로 재생하여 블록이 있어야하는 블록을 그립니다.

이제 지우는 선이 있다면 논리는 해당 라인을 제거하고 표시 할 수 있습니다. 여기서 모든 조각은 4 개의 단일 블록으로 구성되어 있으며이 블록 중 하나는 단일 객체라고 가정합니다. 이제이 블록에 "다이"-플래그 세트가 있으면 블록을 사라지기 위해 렌더 파트가 필요할 수 있습니다 (500ms 폭발). 이 시간이 지나면 물체가 배치 될 수 있고 위의 블록이 아래로 떨어집니다. 왜 500ms인가? 글쎄, 당신은 반드시 사용해야합니다 시간 기반 운동 이로 인해 다른 컴퓨터에서 게임 속도가 동일하게 유지됩니다.

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

다른 팁

대부분의 게임은 모델 상태의 변화를 기다리는 대신 게임의 시야를 최대한 빨리 다시 그리는 루프를 실행하고보기를 새로 고칩니다.

모델보기 패턴이 마음에 들면 모델에서 제거 된 후 일부 유형의 객체를 계속 그리는 것이 잘 작동하여 몇 밀리 초 이상으로 사라집니다.

또 다른 접근법은 클래스 MVC를 차동 실행과 같은 것과 결합하는 것입니다. '보기'는 제시된 모델이지만 도면 코드는 '보기'가 이전 렌더링의 스트림과 함께 생성하는 이벤트 스트림을 비교합니다. 따라서 하나의 스트림에 선이 있고 다음에 없으면 다음과 같이 드로잉 코드가 차이를 애니메이션 할 수 있습니다. 이를 통해 도면을보기에서 멀리 떨어 뜨릴 수 있습니다. MVC의 '보기'는 종종 디스플레이를 직접 그리는 것이 아니라 위젯 모음이므로 어쨌든 중첩 된 MVC 계층으로 끝납니다. 응용 프로그램은 MVC (데이터 모델, 객체, 앱 컨트롤러)입니다. View Object에는 MVC (위젯 상태 (예 : 버튼 프레스), 모양 및 느낌/툴킷 바인딩, 툴킷 이벤트 매핑 -> 위젯 상태)가있는 위젯 모음이 있습니다.

나는 종종 이것을 스스로 궁금해했다.

내 자신의 생각은이 선을 따라 갔다.

1)보기에는 블록의 상태가 주어 지지만 (모양, 야다 야다) 추가 "전이"데이터가 있습니다.

2) 라인을 제거해야한다는 사실은보기에서 계산되지 않은 상태에서 인코딩됩니다.

3)이보기는 지금 전환을 그리는 방법을 알고 있습니다.

  • 변경 없음 : 상태는이 특정 블록의 경우 동일합니다.
  • "Falling"에서 "Locked"로 변경 : 상태는 "잠겨 있습니다"(드롭 블록으로)
  • "잠금"에서 "제거"로 변경 : 상태는 "제거"(라인 완성으로)
  • "떨어지는"것에서 "제거"로 변경 : 상태는 "제거"되었지만 오래된 상태는 "떨어지는"상태입니다.

게임을 MVC로 생각하는 것은 흥미 롭습니다. 그것은 내가 결코 취한 적이없는 관점 (이상한 이유 때문에)이지만 확실히 많은 의미가있는 흥미로운 것입니다. MVC로 테트리스 게임을 구현한다고 가정하면 컨트롤러와 견해 사이의 커뮤니케이션과 관련하여 고려해야 할 두 가지가 있다고 생각합니다. 상태가 있으며 이벤트가 있습니다.

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

Scoregraphic은 당신에게 훌륭한 기초를주었습니다. 귀하의보기는 컴퓨터 전체에서 일관된 속도를 유지하기 위해 고정 주기로 작동해야합니다. 그러나 새로운 상태를 렌더링하기 위해 화면을 업데이트하는 것 외에도 응답으로 애니메이션을 수행 할 수있는 이벤트 대기열도 있어야합니다. Tetris의 채우기 라인의 경우 컨트롤러는 어떤 종류의 기본 이벤트 유형에서 View Event 큐로 파생되는 강력하게 입력 된 이벤트 객체를 발행 할 수 있으며, 이는 View에서 적절한 애니메이션 응답을 수행 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top