2012-10-06 16 views
6

OK, więc zaczynamy. Próbuję utworzyć aplikację, używając XNA jako bazy z powodu jej renderera. Jedną z rzeczy niezbędnych w tym projekcie jest otwarcie nowego okna (jako okna dialogowego), w którym osadzony jest osobny panel renderowania XNA. Używam tego jako interaktywnego panelu podglądu, więc absolutnie potrzebuję XNA do renderowania. Wygląda jednak na to, że XNA nie jest do tego dobrze przygotowany. Próbowałem różnych rzeczy sam, ale bez skutku (albo produkujące błędy i nie renderujące poprawnie, albo renderujące w złym współczynniku proporcji, itp.). Normalnie zapisałbym tutaj kod, ale ponieważ miałem tak mało szczęścia, nie ma zbyt wiele do opublikowania.XNA z Windows Forms - Otwieranie nowego okna

Moja aplikacja składa się obecnie z aplikacji XNA osadzonej w formularzu i mam przycisk do otwarcia panelu podglądu, który teoretycznie powinien pojawić się jako okno dialogowe formularza zawierające renderer XNA, aby umożliwić mi narysowanie zapowiedź. Próbowałem tego przez kilka godzin i nigdzie się nie dostałem, więc proszę o trochę pomocy tutaj.

Dzięki, w każdym razie.

EDYCJA: Okay, zrobiłem małe postępy, ale mam 2 problemy. Po pierwsze, wszystkie tekstury narysowane za pomocą sprite mają prawidłowe wymiary, ale wypełnione są czernią. Ponadto po otwarciu okna dialogowego, a następnie zamknięciu go i zamknięciu aplikacji otrzymuję wyjątek AccessViolationException. Podejrzewam, że te dwa błędy są w jakiś sposób powiązane.

Oto mój kod inicjujący okno podglądu. (a jest niestandardową klasą, która zasadniczo składa się z listy właściwości LinkedList obiektów Texture2D).

animPrev = new AnimationPreview(a); 
animPrev.Show(); 

Moja klasa AnimationPreview jest rozszerzeniem klasy formularza i zawiera obiekt PreviewControl, która jest przedłużeniem GraphicsDeviceControl znalezionych w próbce XNA WinForm. Zauważ, że moja główna forma rozszerza klasę gier XNA, z różnych powodów.

PreviewControl obiekt jest ustawiony tak:

protected override void Initialize() 
{ 
    sb = new SpriteBatch(GraphicsDevice); 
    Application.Idle += delegate { Invalidate(); }; 
} 

A metoda Draw zawiera:

protected override void Draw() 
{ 
    GraphicsDevice.Clear(Microsoft.Xna.Framework.Graphics.Color.Violet); 
    if (frame != null) 
    { 
     sb.Begin(); 
     sb.Draw(Image, Vector2.Zero, Color.White); 
     sb.End(); 
    } 
} 

ten czyści tło postaci fioletowego, jak się spodziewano, i rysuje czarną skrzynkę tego samego rozmiaru co Obraz. Tego się nie spodziewamy. Mam nadzieję, że ktoś może mi pomóc tutaj.

UWAGA: Dopuszczalną alternatywą byłoby przekształcenie obiektów XNA Texture2D w obiekty System.Drawing.Image. Jednak używam XNA 3.1, więc nie mogę po prostu zapisać tekstury w strumieniu i przeładować go ponownie. Po wypróbowaniu tego, jest trochę podejrzanie i bardzo wolno, więc wolałbym nie robić tego w ten sposób.

+2

Czy używasz próbki [XNA WinForms] (http://xbox.create.msdn.com/en-US/sample/winforms_series1)? (Bo jeśli nie, to byłby pierwszy krok.) –

+0

Nie, rzucę okiem. – Hoeloe

+0

Hmm ...to wydaje się być prawie tym, czego szukam, ale ma problem z tym, że nie zawiera pętli aktualizacji. Moją główną postacią w tej chwili jest klasa Game, z uchwytem rzutowanym na obiekt Form. Muszę użyć aktualizacji i pętli rysowania w nowym oknie. – Hoeloe

Odpowiedz

Powiązane problemy