2011-01-24 9 views
6

Mam grę 2D, nad którą pracuję, która ma współczynnik proporcji 4: 3. Kiedy przełączam go na tryb pełnoekranowy na moim monitorze szerokoekranowym, rozciąga się. Próbowałem użyć dwóch rzutni, aby nadać czarnym tle miejsce, w którym gra nie powinna się rozciągać, ale to pozostawiło grę w tym samym rozmiarze jak wcześniej. Nie mogłem dostać tego, żeby wypełnić okno, które miało utrzymywać całą grę.Przejście do trybu pełnoekranowego bez rozciągania w grze XNA

Jak mogę go uruchomić, aby wyświetlał się w trybie pełnoekranowym bez rozciągania i bez konieczności modyfikowania każdej pozycji i wyciągania stwierdzeń w grze? Kod, którego używam dla rzutni, znajduje się poniżej.

  // set the viewport to the whole screen 
      GraphicsDevice.Viewport = new Viewport 
      { 
       X = 0, 
       Y = 0, 
       Width = GraphicsDevice.PresentationParameters.BackBufferWidth, 
       Height = GraphicsDevice.PresentationParameters.BackBufferHeight, 
       MinDepth = 0, 
       MaxDepth = 1 
      }; 

      // clear whole screen to black 
      GraphicsDevice.Clear(Color.Black); 

      // figure out the largest area that fits in this resolution at the desired aspect ratio 
      int width = GraphicsDevice.PresentationParameters.BackBufferWidth; 
      int height = (int)(width/targetAspectRatio + .5f); 
      if (height > GraphicsDevice.PresentationParameters.BackBufferHeight) 
      { 
       height = GraphicsDevice.PresentationParameters.BackBufferHeight; 
       width = (int)(height * targetAspectRatio + .5f); 
      } 
      //Console.WriteLine("Back: Width: {0}, Height: {0}", GraphicsDevice.PresentationParameters.BackBufferWidth, GraphicsDevice.PresentationParameters.BackBufferHeight); 
      //Console.WriteLine("Front: Width: {0}, Height: {1}", width, height); 

      // set up the new viewport centered in the backbuffer 
      GraphicsDevice.Viewport = new Viewport 
      { 
       X = GraphicsDevice.PresentationParameters.BackBufferWidth/2 - width/2, 
       Y = GraphicsDevice.PresentationParameters.BackBufferHeight/2 - height/2, 
       Width = width, 
       Height = height, 
       MinDepth = 0, 
       MaxDepth = 1 
      }; 

      GraphicsDevice.Clear(Color.CornflowerBlue); 

Poniższy obraz pokazuje, jak wygląda ekran. Czerń po bokach jest tym, czego chcę (i jest od pierwszego widoku), a drugi rzutnia to gra i obszar chabrowy niebieski. To, czego chcę, to doprowadzić grę do skali, aby wypełnić obszar chabrowy niebieski.

Not correctly scaling

+2

Być może zainteresuje Cię fakt, że istnieje strona wymiany Game Game Stack Exchange, na której możesz uzyskać lepszą odpowiedź: http://gamedev.stackexchange.com/ –

Odpowiedz

2
+0

Jak wspomniano w moim pytaniu, to właśnie próbowałem. Nie mogę pobrać gry 2D, aby wypełnić wizjer. Po prostu znajduje się w górnej lewej części, zamiast skalować, aby pasował. – Califer

+0

Ok. Nie sądzę, że użyłeś * tego * widoku. Siedzi w lewym górnym rogu? Czy ustawiłeś elementy .X i .Y w oknie roboczym? Musisz wyśrodkować rzutnię ekranu. Znaczenie: musisz ustawić wysokość/szerokość stosownie do twojego współczynnika proporcji. (w tym przypadku jest węższy niż ekran), a następnie wyśrodkuj go. – stefan

+0

w prawo, mam jeden widok, który właśnie tworzy czarny ekran, a następnie wyśrodkowany rzutnik, który pasuje do mojego współczynnika proporcji. Problem polega na tym, że rzeczywisty ekran gry nie jest skalowany, aby pasował do wyśrodkowanej rzutni. Nie mogę po prostu przesunąć kamery, ponieważ gra jest całkowicie dwuwymiarowa i nigdy nie zainicjowałem kamery. – Califer

0

Jak również w przypadku komercyjnych gier, należy podać opcję dla użytkownika, który pozwala im na przełączanie pomiędzy 4: 3 i 16: 9. Powinieneś być w stanie odpowiednio zmodyfikować współczynnik oglądania kamery.

EDIT:

O ile widziałem, nie ma gry, że „automatyczne wykrywanie” właściwe proporcje, aby użyć.

Jak już wspomniano, istnieją sposoby, aby dobrze zgadnąć, jaki jest właściwy współczynnik proporcji. Jeśli XNA pozwala uzyskać aktualne dane ustawień ekranu użytkownika Windows, możesz określić współczynnik kształtu w oparciu o rozdzielczość monitora.

Po ustaleniu rozdzielczości monitora użytkownika, można najlepiej zdecydować, jak sobie z nim radzić. Na początku najlepiej jest po prostu umieścić czarne pasy po lewej/prawej stronie ekranu, aby umożliwić pełnoekranowy z proporcjami 16: 9, który w zasadzie nadal wykorzystuje grafikę 4: 3.

Ostatecznie możesz zmodyfikować grę, aby zmieniła rozmiar portu oglądania, gdy proporcje ekranu wynoszą 16: 9. Nie wymagałoby to zmiany jakichkolwiek zasobów sztuki, tylko sposobu ich renderowania.

+0

GTA4 ma dobre automatyczne wykrywanie –

+1

Możesz często zgadnij poprawny współczynnik proporcji, patrząc na rozdzielczość pulpitu użytkownika. – ChrisV

+0

Właściwie prawdopodobnie macie rację; Sądzę, że najpierw "zgadują" stosunek, ale później można go zmienić. – James

0

Przede wszystkim jestem zakładając, że mówimy o XNA 4.0, który AFAIK nie łamią zmiany między XNA 3.xi XNA 4.0.

Jestem względnie nowy w XNA, jednak wydaje mi się, że twoje zasoby nie pasują do rozmiaru okna. Załóżmy, że Twoja gra ma wymiary 320 x 240, a Twoje okno jest większe, np. 640 x 480.

W ten sposób można określić PreferredBuffer w celu zwiększenia skali aplikacji. Zatem powiedz XNA, że użyjesz 320x240, ustawiając następujące wartości;

_graphics.PreferredBackBufferWidth = 320; 
_graphics.PreferredBackBufferHeight = 240; 

Dodatkowo można uruchomić tryb pełnoekranowy poprzez ustawienie:

_graphics.IsFullScreen = true; 

Również trzeba obsługiwać ręcznie jak elementy należy zmienić ich rozmiar, gdy okno się nie zmieniło ich rozmiar.

Sprawdź moją próbkę na. https://github.com/hmadrigal/xnawp7/tree/master/XNASample02

(BTW, można nacisnąć klawisz F11, aby przełączać się między pełnoekranowym a widokiem normalnym)

poważaniem Herber

+0

Dzięki, ale to już robię, co powoduje, że problem jest rozciągnięty w różnych proporcjach. – Califer

0

Nie jestem pewien, czy rzeczywiście można skalować port widok takiego. Rozumiem, co próbujesz zrobić, ale aby to zrobić, musisz wykonać następujące czynności.

  1. Ustaw szerokość i wysokość bufora bufora ekranu na 16: 9.
  2. Zaprogramuj przesunięcie, aby obiekty nie rysowały w tych obramowaniach.

Chodzi o to, że wszystkie główne gry w dzisiejszych czasach, jeśli odtwarzasz je na monitorze 16: 9 i wybierzesz rozdzielczość 4: 3, rozciągną się w celu dopasowania do ekranu. To nie jest coś, co zwykle chcesz pokonać. Wspierasz wiele rozdzielczości w grze lub rozciągniesz, gdy użytkownik użyje niewłaściwej rozdzielczości dla swojego typu ekranu.

Zazwyczaj konfiguruje się ich grę, a ich tekstury działają w oparciu o względne wymiary bieżącej rzutni lub szerokość i wysokość bufora bufora. W ten sposób, niezależnie od wprowadzonej rozdzielczości, gra będzie działała z takim stosunkiem szerokości do wysokości.

To trochę więcej pracy, ale ostatecznie sprawia, że ​​gra jest znacznie bardziej dopracowana i kompatybilna z szeroką gamą systemów.

Nie można tego zrobić tylko wtedy, gdy aplikacja działa w oknie (NIE na pełnym ekranie).