Marcin Nowak: **** ***[*] [****] ****
Wojciech Szymecki: *
Łukasz Szulc: *
Łukasz Kiełczykowski: *
Znalezione błędy:
Marcin Nowak, rozdział 1, strona 5
Linia: gd.VertexDeclaration = new VertexDeclaration(gd,VertexPositionColor.VertexElements);
Postępując zgodnie z instrukcjami nie jestem w stanie przejść tego momentu.
JM:
Ta instrukcja nie jest potrzebna (klasa GraphicsDevice nie ma nawet pola VertexDeclaration).
W zamian podaje się deklarację w metodzie gd.DrawUserPrimitives.
------------------------
Marcin Nowak, rozdział 1, w wielu miejscach
Jest: RasterizedState
Powinno być: RasterizerState
------------------------
Marcin Nowak, rozdział 1, strona 13, rys. 8
Po wyjściu z Shadera Pixeli otrzymujemy strumień pikseli zamiast strumienia werteksów.
------------------------
Marcin Nowak, rozdział 1, strona 13, rys. 8
Kod na stronie 14 jest:
gd.SetVertexBuffer(buforWerteksowTrojkata);
efekt.Begin();
foreach (EffectPass pass in efekt.CurrentTechnique.Passes)
{
pass.Begin();
gd.DrawUserPrimitives(PrimitiveType.TriangleList,werteksyTrojkata, 0, 1);
gd.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
pass.End();
}
efekt.End();
JM:
To jest wersja z XNA 3.0, która jest niezgodna z XNA 4.0 i MonoGame 3.
Nie ma już metod Begin i End. Powinno być:
gd.SetVertexBuffer(buforWerteksowTrojkata);
foreach (EffectPass pass in efekt.CurrentTechnique.Passes)
{
pass.Apply();
gd.DrawUserPrimitives(PrimitiveType.TriangleList,werteksyTrojkata, 0, 1);
gd.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
pass.End();
}
----------------------------
Wojciech Szymecki
Informacje o interfejsie GUIDE
Jeśli chodzi o interfejs Guide to jest obecny w Monogame i używa się go identycznie jak w XNA,
przy czym powinien działać głównie dla Androida, Windows Phone i iOS. Z tego co wiem na Windows
Phone jak i na Modern UI (Windows 8) należy zadbać o to żeby metoda Guide.BeginShowMessageBox()
została wywołana na wątku UI co w Windows Phone można zapewnić korzystając z:
Deployment.Current.Dispatcher.BeginInvoke(delegat_z_wywolaniem_messagebox)
a w Modern UI korzystając z własnej metody:
#pragma warning disable 4014
public static void runOnUiThread(Windows.UI.Core.DispatchedHandler delegat_z_wywolaniem)
{
CoreWindow window = CoreWindow.GetForCurrentThread();
window.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, delegat_z_wywolaniem);
}
#pragma warning restore 4014
bez tego funkcja callback zawierająca EndShowMessageBox wyrzuci dwa wyjątki bo będzie wywołana
przed kliknięciem w jakikolwiek przycisk na MessageBoxie. Pomimo usunięcia głównej przyczyny
błędu można go wywołać bardzo szybko klikając w kółko w wywoływanego w metodzie Game1.Update()
MessageBoxa i jedyne co można zrobić aby temu zapobiec to pętla zwalniająca taka jak w rozwiązaniu
pod linkiem:
http://stackoverflow.com/a/10568956
Jeśli chodzi o obiekt GamerServicesComponent (wspomniany na stronie) to na niektórych platformach
istnieje a na niektórych nie jest zaimplementowany (Modern UI). Nie zauważyłem by niedołączenie
tego komponentu powodowało błędy.
-------------------------------
Marcin Nowak, rozdział 2, strona 3
Problem: AllowUserResizing - problem ze zmianą rozdzielczości.
Należy dodać Event przechwytujący informację o zmianie rozmiaru okna
(opis w skrypcie).
Rozwiązanie znalezione na stronie:
https://github.com/mono/MonoGame/issues/1069 (http://pastebin.com/gT8ehWgN)
-------------------------------
Łukasz Szulc, rozdział 2, strona 4
Potwierdzenie, ze MSAA nie jest dostępne w Monogame w wesji <= 3.2.
-------------------------------
Marcin Nowak, rozdział 1, strona 15
W kodzie
for(int i=0;i ElapsedGameTime
Nie można modyfikować składowej koloru
-------------------------------
Marcin Nowak, rozdział 1, strona 14
Count() -> Length
złe argumenty konstruktora DynamicVertexBuffer
-------------------------------
Marcin Nowak, rozdział 1 - konkurs dot. graphics.ToggleFullScreen (+0.25 do oceny)
if (Keyboard.GetState().IsKeyDown(Keys.Space))
{
if (!graphics.IsFullScreen)
{
graphics.PreferredBackBufferWidth = graphics.GraphicsDevice.PresentationParameters.BackBufferWidth;
graphics.PreferredBackBufferHeight = graphics.GraphicsDevice.PresentationParameters.BackBufferHeight;
}
graphics.GraphicsDevice.Viewport = new Viewport(0,
graphics.GraphicsDevice.DisplayMode.Height - graphics.PreferredBackBufferHeight,
graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight);
graphics.ToggleFullScreen();
graphics.ApplyChanges();
}
-------------------------------
Marcin Nowak, rozdział 1 - konkurs dot. sfery z buforem indeksów (+1 do oceny)
kod źródłowy jest na stronie
-------------------------------
Marcin Nowak, rozdział 5, str. 2
nieodpowiednia klasa werteksu
-------------------------------
Marcin Nowak, rozdział 5, str. 5
nieprawidłowa instrukcja tworząca bufor
-------------------------------
Marcin Nowak, rozdział 5, str. 5
Kwestia macierzy rzutowania CreateShadowMatrix
-------------------------------
Łukasz Kiełczykowski
Kompilacja zasobów do formatu plików .xnb
Istnieje już kilka możliwości by kompilować swój content do formatu xnb:
https://github.com/mono/MonoGame/wiki/MonoGame-Content-Processing tutaj twórcy opisują jak należy to robić (w przypadku różnych platform).
Jeśli chodzi o Windowsa, to potrzebny jest niestety VS 2010. Do tego oczywiście potrzebujemy też XNA, ale w przypadku W8 jest pewien problem. Do XNA dostajemy się albo poprzez instalacje WP7 SDK albo jeśli dobrze pamiętam, najpierw instalujemy http://www.microsoft.com/pl-pl/download/details.aspx?id=5549 (Games for Windows Software) i później bez problemu możemy instalować XNA 4.0
Alternatywnie (ale nadal potrzebujemy VS10) możemy użyć:
http://sourceforge.net/projects/xnbbuilder/ , te proste narzędzie po prostu pominie krok odpalania VS10 i tworzenia “dummy projectu” z XNA.
-------------------------------
Porównując sytuację dla nieskończenie odległego światła doszedłem do wniosku,
że jedynym problemem który może zaistnieć ( powodując miganie ) to pola
macierzy: M14, M24, M34, M44, gdzie używamy L.W ( czyli dla nieskończoności
równych 0 ). Nasza poprawka więc ( owe 0.00001f ) nie powinna dotyczyć
wektora N.W, tylko L.W.
Tym samym zerując tylko i wyłącznie element M24 ( m.M24 = 0f; )
uzyskałem to co na załączonym screen-1. Wpuszczając poprawkę na ten
element ( m.24 = -N.Y * L.W * 0.99999f; ) uzyskałem to co na
załączonym screen-2. W ostateczności dochodząc do funkcji:
static Matrix CreateShadowMatrix(Vector3 lightPosition, Plane
plane, float poprawka, bool nieskończenieOdległeŹródłoŚwiatła = true)
{
Vector4 N = new Vector4(plane.Normal, plane.D);
Vector4 L = new Vector4(lightPosition,
nieskończenieOdległeŹródłoŚwiatła ? 0 : 1);
float alfa = Vector4.Dot(N, L);
Matrix m = new Matrix();
m.M11 = alfa - N.X * L.X;
m.M22 = alfa - N.Y * L.Y;
m.M33 = alfa - N.Z * L.Z;
m.M44 = alfa - N.W * L.W * (1.0f - poprawka);
m.M21 = -N.Y * L.X;
m.M31 = -N.Z * L.X;
m.M41 = -N.W * L.X;
m.M12 = -N.X * L.Y;
m.M32 = -N.Z * L.Y;
m.M42 = -N.W * L.Y;
m.M13 = -N.X * L.Z;
m.M23 = -N.Y * L.Z;
m.M43 = -N.W * L.Z;
m.M14 = -N.X * L.W * (1.0f - poprawka);
m.M24 = -N.Y * L.W * (1.0f - poprawka);
m.M34 = -N.Z * L.W * (1.0f - poprawka);
return m;
}
i modyfikując linię inicjującą ową macierz:
static Matrix macierzRzutowaniaNaPodłoże =
CreateShadowMatrix(new Vector3(3, 5, 3), new
Plane(Vector3.Up, d), 0.00001f, false);
Projekt z zaimplementowanym rozwiązaniem znajduje się:
http://fizyka.umk.pl/~254118/Monogame/MojaDrugaGraMonoGame_CreateShadow.zip