2012-02-02 2 views
7

Qt에서 2D 타일 기반 게임을 프로그래밍하고 2D를 많이 표시하고 처리하기위한 QGraphicsScene 및 QGraphicsView 클래스에 대해 읽어 보겠습니다 사물.QGraphicsScene 및 QGraphicsView를 사용하여 Qt에서 타일 기반 게임 시작하기

제 질문은 QGraphicsScene을 사용하여 많은 타일이있는 세계를 만드는 것이 타당할까요? 타일을 한 번에 전체 세계에 추가 할 수 있습니까? 아니면 영역을 조금만 제한하기 위해 구현해야합니까? 나는 QGraphicsScene이 "수천 개의 항목"을 처리 할 수 ​​있지만 2D 타일 맵은 실제로 크기가 매우 클 수 있다고 읽었습니다 (200x200 타일은 많지는 않지만 이미 40,000 개의 객체가 많이 있습니다).

지도가 꽤 정적이어서 하나의 큰 픽스맵으로 그리는 것이 가능하지만 이것은 QGraphicsScene의 모든 멋진 것들을 독립 아이템 등의 마우스 클릭처럼 처리하지 못하게합니다. 맨 위에 그 중에서 타일 그리드와 정렬되지 않을 플레이어, NPC 등을 그릴 것입니다. 거기에 정적 개체를 많이 사용하는 몇 가지 최적화 것들과 그들 위에 동적 것들이 있습니까?

QGraphicsScene과 QGraphicsView를 사용하는 것이 좋은 생각입니까? 아니면 Qt 안의 다른 대안이나 게임 지향 라이브러리를 찾아야합니까? 사전에

덕분에 QGraphicsScene 만보기에 표시되는 내용 칠 수있는 능력을 가지고

+0

, 대신 기본 소프트웨어 렌더러의 렌더링으로는 OpenGL을 지정하여 성능을 크게 높일 수있다 -> setViewport (new QOpenGLWidget); ' – vsz

답변

8

QGraphicsView를 사용해야합니다.

Qt 문서의 40,000 Chips은 자세히 검토 할 수있는 가장 좋은 예입니다. 수많은 요소의 복잡성을 다루고, 여러 가지 척도 및 훨씬 더 많은 요소를 그립니다.

예제를 실행하면 축소하면 모든 칩이 실제로 큰 사진을 구성하며 모든보기에서 여러 개의 칩을 선택하고 끌어다 놓거나 볼 수있을만큼 확대 할 수 있습니다 개별 칩에 일부 텍스트. 각 부분을 이해하는 데는 시간이 걸릴 것이지만 이는 매우 철저히 검토해야합니다.

소스에서 소스에서 스타일 옵션에 저장된 변환을 기반으로 한 "LevelOfDetail"또는 lod 변수 전환 명령문을 사용하여 신속하게 실행하는 방법을 보여줍니다.

Qt Graphics View는 질문에서 언급 한 많은 것들을 수행하도록 최적화되어 있지만, 접근 방법을 이해하는 데는 시간이 걸립니다.

아직 사용하려는지도의 크기에 문제가있는 경우 타일 레이아웃을 하드 드라이브에 저장하고 필요할 때 필요할 때로드하고 필요없는 타일을 제거합니다. 필요에 따라 장면의

+0

링크가 작동하지 않습니다. – mrgloom

+0

링크가 수정되었습니다. 즐겨. – phyatt

1

은, 다른 모든 단지 장면 인덱스에 앉아있다. 특정 용도를 최적화하기 위해 장면 및보기의 작동 방식을 구성하는 데는 여러 가지 옵션이 있습니다. 장면 색인에 40,000 개의 타일이 있기 때문에 그렇게 많은 것을 칠할 필요는 없습니다. 실제로는보기의 해상도로 표시되는 수만큼 표시 할 수 있습니다.

또한 항목이 정적 인 경우 캐싱 옵션이 있습니다. 한 번만 계산하면 픽스맵 캐시에서 검색 할 수 있습니다.

궁극적으로 나는 그것을 시험해 볼만한 가치가 있다고 생각합니다. 매우 많은 수의 타일로 장면을 채우고보기 주위를 스크롤하기 만하면되는 테스트를 조롱하는 것이 매우 쉽습니다. 얼마나 많은 타일을 가지고 있느냐에 대한 관심이 아니라 실제 뷰가 그려지는 그래픽이 얼마나 복잡한지를 느낍니다.

+0

위대한 답변을 주셔서 감사합니다! 나는 그것을 시도 할 것이다. 당신이 말했듯이, 그것이 효과적이지 않더라도, 나는 그것을하는 데 엄청난 시간을 낭비하는 것과 같지 않습니다. – Maush

2

저는 비슷한 프로젝트에서 작업 중이며 영구적 인 QGraphicsPixmapItems 30x30 격자를 사용하고 있습니다. 맵의 뷰가 변경되면 QGraphicsscene은 현재 뷰에있는 맵 배열 부분을 반복하여 각 타일에서 setPixmap을 호출하여 새로운 타일 유형으로 변경합니다. 그것은 꽤 원활하게 작동하고 있으며 지금까지 성능 불만이 없습니다.

2

내가 말한 것에 동의합니다. 나는 수년간 QGraphicsView-based games을 해왔으며 (Linux를 사용하고 있다면 원하는 경우 KDiamond 또는 Palapeli를 패키지 관리자에게 요청하십시오.) QGraphicsView가 처음 몇 년 전에 처음 출시되었을 때 렌더링 성능이 문제가되었지만 일반적으로 이러한 문제는 일반적으로 발생합니다 해결되었습니다.

메모리 소비가 걱정되는 부분입니다. 칩 예제는 원하는만큼의 칩을 가질 수 있지만, 그 칩은 픽스맵으로 메모리에 보관되지 않습니다. `UI-> graphicsView : 각 타일은 고정 된 크기 50x50px 이미지 인 경우, 즉 Qt를 최신 버전으로 이미

32bits*50px*50px*200*200 = 381,9 MiB 
+0

정말 고마워요, 팔라 펠리 아주 좋습니다. 자, 아직 KDiamond를 사용해보십시오 ... – CapelliC

관련 문제