XNA Szybki start Kurs ITA-106 (Grafika i multimedia) – Moduł 1

Slides:



Advertisements
Podobne prezentacje
C++ wykład 2 ( ) Klasy i obiekty.
Advertisements

Analiza wywołania i przebiegu przerwań w systemie Linux

ALLEGRO PIERWSZA GRA: WYŚCIG
Nguyen Hung Son Uniwersytet Warszawski
Java vs C# Michał Prządka Tomasz Nowak
OOPC++ - operatory1 Operatory class complex { private: double re, im; public: complex (double r, double i = 0) { re = r; im = i; } friend complex operator+
Model – View - Controler
GUI Struktury Spotkanie integracyjne Nazwa wydziału: EAIiE Nazwa katedry: Informatyka Miejsce i data prezentacji: Kraków,
Mirosław Ochodek Sponsorzy: JFace Jak jeszcze szybciej tworzyć interfejsy? ECESIS Eclipse Community Education Project An.
Rekursja Teoretyczne podstawy informatyki Wykład 5
Team Building Copyright, 2003 © Jerzy R. Nawrocki Requirements Engineering Lecture.
Imperatywne modele obliczeń Copyright, 2003 © Jerzy R. Nawrocki Teoretyczne podstawy.
Programowanie imperatywne i granice obliczalności Copyright, 2004 © Jerzy R. Nawrocki
Język C – Część II Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie do informatyki.
Testowanie oprogramowania metodą badania pokrycia kodu
Współprogramy Plan: Motywacja Składnia Scenariusz obiektu współprogramu Przykłady Producent – konsument ( instrukcja attach ) Czytelnik -pisarze ( instukcja.
142 JAVA – sterowanie i wątki public class A20 extends javax.swing.JApplet implements ActionListener { private int licznik = 0; private JTextField t =
Aplikacje sieciowe Obiekty typu Socket. ServerSocket ClientSocket Socket ClientSocket Socket.
C# Windows Forms Zastosowania Informatyki Wykład 3
Przestrzeń System podstawowe klasy i klasy bazowe.
Współrzędne jednorodne
Obiekty dynamiczne Tworzenie klas 3 MPDI Programowanie obiektowe W4.
Porysujmy trochę czyli Łączenie SQLa, AutoCADa i Delphi
Java 3 MPDI Programowanie obiektowe W7. import java.io.*; public class X { // kontrukcja throws – określenie jakie wyjątki może dana metoda // sygnalizować
PRZELICZNIK DŁUGOŚCI w programie NetBeans IDE autorzy: Michał Mrozek i Marcin Mrugała 2012.
Krzysztof Manuszewski
Win32 i DirectX. Czym jest DirectX ? API umożliwiające/ułatwiające zarządzanie głównie grafiką (2D/3D) i dźwiękiem zazwyczaj wykorzystywane w grach.
Damian Wojdan Kraków,
Asynchroniczność w Windows 8 Jakub Binkowski. O mnie Jakub Binkowski Lead.NET Developer.
Programowanie Windows na przykładzie C# część 1
Odwzorowywanie tekstur
db4o Kacper Skory Marcin Talarek
Java – coś na temat Klas Piotr Rosik
Moja Prezentacja Aleksandra Skorupa.
Struktura programu w języku Java
PIO 2_2, Zofia Kruczkiewicz1 Wykład 2 – część druga Iteracyjno-rozwojowy cykl oprogramowania 2.
PIO. Autor -Zofia Kruczkiewicz1 Wykład 1-część druga Wstęp do inżynierii oprogramowania. Cykle rozwoju oprogramowania (część biznesowa aplikacji) iteracyjno-rozwojowy.
Tablice.
Podstawy programowania
Wybudowany w 1791 r. Obecnie ma 221 lat. Ten budynek ma 24 okna. Wybudowany został w 1909 r.
Cechy dobrej i udanej strony www Net etykieta. Ergonomia stron WWW.
XNA 4.0 Wprowadzenie do grafiki 3D
Plan warsztatów „Grafika 3D w XNA”
Przegląd podstawowych pojęć
Formatowanie i modyfikacja dokumentu tekstowego
TYPY STRUKTURALNE Tablice Tablicą nazywamy złożoną strukturę danych, która zawiera zbiór elementów tego samego typu.
Cz.8 Zdarzenia. Refleksja – przypomnienie Event Programowanie zdarzeniowe Do dzieła!
C# Platforma .NET CZ.3 Kuba Ostrowski.
Pęd Wielkością charakteryzującą ruch ciała jest prędkość. Zmiana ruchu, tzn. zmiana prędkości, wymaga pokonania oporu bezwładności. Miarą bezwładności.
Rola tabel w kodzie HTML
Tworzenie tabel w edytorze Word
Soczewka skupiająca Wiązka równoległa po przejściu przez soczewkę wypukłą skupia się w jednym punkcie. Ten punkt nazywa się ogniskiem soczewki F.
Ruch jednostajny po okręgu Ciało porusza się ruchem jednostajnym oraz torem tego ruchu jest okrąg.
Warsztaty C# Część 2 Grzegorz Piotrowski Grupa.NET PO
Warsztaty C# Część 3 Grzegorz Piotrowski Grupa.NET PO
KINECT – czyli z czym to się je?. Damian Zawada
SKALA MAPY Skala – stosunek odległości na mapie do odpowiadającej jej odległości w terenie. Skala najczęściej wyrażona jest w postaci ułamka 1:S, np. 1:10.
Realistyczny rendering dla potrzeb gier komputerowych
A. Jędryczkowski – 2006 ©. Tablica to struktura danych zawierająca zbiór obiektów tego samego typu i odpowiada matematycznemu pojęciu wektora (tablica.
Pliki elementowe – A. Jędryczkowski © 2007 Turbo Pascal umożliwia wykorzystanie w programach plików elementowych. Pliki takie zawierają informację zakodowaną
Instrukcja switch switch (wyrażenie) { case wart_1 : { instr_1; break; } case wart_2 : { instr_2; break; } … case wart_n : { instr_n; break; } default.
Instrukcje sterujące: W instrukcjach sterujących podejmowane są decyzje o wykonaniu tych czy innych instrukcji programu. Decyzje te podejmowane są w zależności.
Komtech Sp. z o.o. Magic Janusz ROŻEJ.
TYPY KOBIET WEDŁUG INTERNAUTÓW.
Silverlight 4 dla Windows Phone 7
Piotr Czapiewski Wydział Informatyki ZUT.  Extensible Markup Language  Język znaczników  Human-readable and machine-readable  Niezależny od platformy.
Wydział Elektroniki Kierunek: AiR Zaawansowane metody programowania Wykład 6.
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Partnerstwo dla Przyszłości 1 Lekcja 27 Klasy i obiekty.
Zapis prezentacji:

XNA Szybki start Kurs ITA-106 (Grafika i multimedia) – Moduł 1 Jacek Matulewski (e-mail: jacek@fizyka.umk.pl) http://www.fizyka.umk.pl/~jacek/dydaktyka/3d/ XNA Szybki start Wersja: 30 stycznia 2009

Visual Studio 2008/XNA GS 3.0 Typy projektów:

Visual Studio 2008/XNA GS 3.0 Własności projektu gry Nie ma biblioteki gotowych komponentów Dostęp do platformy .NET 3.5 Język programowania: C# 3.0 Game1.cs zamiast Form1.cs

Visual Studio 2008/XNA GS 3.0 Plik Program.cs (analog z projektów WF) Plik Game1.cs (analog Form1.cs), klasa Game1 pola typu GraphicsDeviceManager, SpriteBatch (pierwszy: kontrola okna gry, drugi: grafika 2D) konstruktor – inicjacja pól klasy gry metoda Initialize – inicjacja logiki gry metody LoadContent/UnloadContent – zasoby gry (tekstury, modele, dźwięki)

Visual Studio 2008/XNA GS 3.0 Plik Program.cs (analog z projektów WF) Plik Game1.cs (analog Form1.cs), klasa Game1 metoda Update, wywoływana cyklicznie f = 60Hz aktualizacja logiki gry (np. położenia obiektów) Metoda Draw, wywoływana cyklicznie f = 60Hz renderowanie sceny (tu instrukcje rysowania)

Pierwszy program XNA W klasie Game1 definiujemy pole – zbiór werteksów typu VertexPositionColor: private VertexPositionColor[] werteksyTrojkata = new VertexPositionColor[3]{ new VertexPositionColor(new Vector3(0.5f, -0.5f, 0), Color.White), new VertexPositionColor(new Vector3(-0.5f, -0.5f, 0), Color.White), new VertexPositionColor(new Vector3(0, 0.5f, 0), Color.White)}; Obiekt typu BasicEffect (filar prostej grafiki 3D) private BasicEffect efekt = null; protected override void Initialize() { efekt = new BasicEffect(graphics.GraphicsDevice, null); base.Initialize(); }

Pierwszy program XNA Metoda Draw (część 1): protected override void Draw(GameTime gameTime) { graphics.GraphicsDevice.Clear(Color.CornflowerBlue); GraphicsDevice gd = graphics.GraphicsDevice; gd.Clear(Color.Black); gd.VertexDeclaration = new VertexDeclaration(gd, VertexPositionColor.VertexElements); efekt.Begin(); … efekt.End();   base.Draw(gameTime); } Czyszczenie bufora (kolor tła) Typ użytych werteksów (lista własności: pozycja, kolor)

Pętla po efektach i przebiegach (stały fragment gry) Pierwszy program XNA Metoda Draw (część 1): protected override void Draw(GameTime gameTime) { … efekt.Begin(); foreach (EffectPass pass in efekt.CurrentTechnique.Passes) pass.Begin();   gd.DrawUserPrimitives<VertexPositionColor>( PrimitiveType.TriangleList, werteksyTrojkata, 0, 1);   pass.End(); } efekt.End();   base.Draw(gameTime); Pętla po efektach i przebiegach (stały fragment gry)

Pierwszy program XNA Metoda Draw (część 2): protected override void Draw(GameTime gameTime) { … efekt.Begin(); foreach (EffectPass pass in efekt.CurrentTechnique.Passes) pass.Begin();   gd.DrawUserPrimitives<VertexPositionColor>( PrimitiveType.TriangleList, werteksyTrojkata, 0, 1);   pass.End(); } efekt.End();   base.Draw(gameTime); Rysowanie serii prymitywów (listy trójkątów) Pozycja pierwszego werteksu w tablicy Typ prymitywów Tablica werteksów Ilość prymitywów (tu: 1 prym. = 3 wert.)

Pierwszy program XNA Metoda Draw (część 3):   gd.DrawUserPrimitives<VertexPositionColor>( PrimitiveType.TriangleList, werteksyTrojkata, 0, 1); Zalety metody GraphicsDevice.DrawUserPrimitives: najprostsze możliwe rozwiązanie możliwość swobodnej zmiany własności werteksów tablicę werteksów można nawet zdefiniować inline Wada: brak buforowania werteksów w karcie graficznej!!!

Eksperymenty Nawijanie (gd.RenderState.CullMode) Prymitywy (PrimitiveType.PointList, .LineStrip, itd.) PrimitiveType.PointList PrimitiveType.LineList PrimitiveType.LineStrip Prim..Type.TriangleList Pri..Type.TriangleStrip Prim..Type.TriangleFan

Kolor i cieniowanie Kolory, cieniowanie Gourauda, tablica werteksów private VertexPositionColor[] werteksyTrojkata = new VertexPositionColor[3]{ new VertexPositionColor(new Vector3(0.5f, -0.5f, 0), Color.Red), new VertexPositionColor(new Vector3(-0.5f, -0.5f, 0), Color.Green), new VertexPositionColor(new Vector3(0, 0.5f, 0), Color.Blue)}; efekt.VertexColorEnabled = true; Do metody Initialize należy dodać instrukcję:

Transformacje Zmiana macierzy świata (metoda Initialize): Matrix macierzPrzeksztalcenia = Matrix.Identity; macierzPrzeksztalcenia *= Matrix.CreateScale(0.5f); macierzPrzeksztalcenia *= Matrix.CreateRotationZ(-MathHelper.PiOver2); macierzPrzeksztalcenia *= Matrix.CreateTranslation(0.5f, 0, 0); efekt.World = macierzPrzeksztalcenia; Matrix macierzPrzeksztalcenia = Matrix.Identity; macierzPrzeksztalcenia *= Matrix.CreateScale(0.5f); macierzPrzeksztalcenia *= Matrix.CreateRotationZ((float)-Math.PI/2.0f); macierzPrzeksztalcenia *= Matrix.CreateTranslation(0.5f, 0, 0); efekt.World = macierzPrzeksztalcenia; gd.RenderState.CullMode = CullMode.None; Jeżeli obrócimy trójkąt tyłem do nas: Spróbujmy zamiast macierzy świata zmieniać macierz widoku

Skalowanie do czasu rzeczywistego (wall time) Animacja Metoda Update: Obrót 60 razy na sekundę efekt.World *= Matrix.CreateRotationZ( gameTime.ElapsedRealTime.Milliseconds/1000.0f); Skalowanie do czasu rzeczywistego (wall time) Widoczna deformacja trójkąta (zła macierz rzutowania) Animacja kolorów Usuńmy skalowanie

Korekta uwględniająca proporcje okna Frustum Rzutowanie ortonormalne (izometryczne) Do metody Initialize: efekt.Projection = Matrix.CreateOrthographic( 2.0f, 0.0f, 100.0f); Do metody Initialize: efekt.Projection = Matrix.CreateOrthographic( 2.0f * graphics.GraphicsDevice.Viewport.AspectRatio, 2.0f, 0.0f, 100.0f); Korekta uwględniająca proporcje okna Szerokość frustum Wysokość frustum Bliż Dal

Korekta uwględniająca proporcje okna Frustum Rzutowanie perspektywiczne Do metody Initialize: efekt.Projection = Matrix.CreatePerspective( 2.0f * graphics.GraphicsDevice.Viewport.AspectRatio 2.0f, 1.0f, 100.0f); Do metody Initialize: efekt.Projection = Matrix.CreatePerspective( 2.0f * graphics.GraphicsDevice.Viewport.AspectRatio 2.0f, 1.0f, 100.0f); Korekta uwględniająca proporcje okna Szerokość frustum Wysokość frustum Bliż Dal Współrzędna Z werteksów musi być teraz mniejsza od -1. Lub musimy odsunąć kamerę!

Frustum Rzutowanie perspektywiczne Do metody Initialize: efekt.Projection = Matrix.CreatePerspectiveFieldOfView( MathHelper.PiOver2, graphics.GraphicsDevice.Viewport.AspectRatio, 1.0f, 100.0f); Kąt widzenia Proporcje obrazu Bliż Dal Jawne uwzględnienie proporcji ekranu

Kamera Proste odsunięcie kamery: Zaawansowane ustawienie kamery: efekt.View = Matrix.CreateTranslation(0, 0, -1); Zaawansowane ustawienie kamery: efekt.View = Matrix.CreateLookAt( new Vector3(0, 0, 1), new Vector3(0, 0, 0), new Vector3(0, 1, 0)); efekt.View = Matrix.CreateLookAt( Vector3.UnitZ, Vector3.Zero, Vector3.Up); Położenie kamery Gdzie jest skierowana Polaryzacja

Buforowanie werteksów Bufor werteksów (pole klasy Game1): VertexBuffer buforWerteksowTrojkata; Inicjacja bufora (metoda Initialize): buforWerteksowTrojkata = new VertexBuffer( graphics.GraphicsDevice, werteksyTrojkata.Count()*VertexPositionColor.SizeInBytes, BufferUsage.WriteOnly); Wypełnienie bufora (metoda Initialize): buforWerteksowTrojkata.SetData<VertexPositionColor>(werteksyTrojkata);

Buforowanie werteksów Wykorzystanie bufora (metoda Draw): pass.Begin(); gd.Vertices[0].SetSource( buforWerteksowTrojkata, 0, VertexPositionColor.SizeInBytes); gd.DrawPrimitives(PrimitiveType.TriangleList, 0, 1); pass.End(); pass.Begin(); gd.DrawUserPrimitives<VertexPositionColor>( PrimitiveType.TriangleList, werteksyTrojkata, 0, 1); pass.End(); Wskazanie bufora Inna metoda niż wcześniej Po zdefiniowaniu bufora werteksów tablica werteksów nie jest potrzebna (można ją definiować lokalnie w Initialize) Dynamiczny bufor werteksów (przykład w skrypcie)

Różności

Częstość wywoływania Update Częstość wywoływania metody Update: this.TargetElapsedTime = TimeSpan.FromSeconds(1.0f/75.0f); 75Hz (chyba, że gra się „zacina”) this.IsFixedTimeStep = false; albo Zawsze przed wywołaniem Draw

Dezaktywacja okna gry protected override void Update(GameTime gameTime) { if (!this.IsActive) return; … protected override void Draw(GameTime gameTime) { if (!this.IsActive) return; …

Tryb pełnoekranowy protected override void Initialize() { try graphics.PreferredBackBufferWidth = 800; graphics.PreferredBackBufferHeight = 600; graphics.IsFullScreen = true; graphics.ApplyChanges(); } catch (Exception exc) System.Windows.Forms.MessageBox.Show( "Błąd podczas przełączania w tryb pełnoekranowy:\n" + exc.Message, Window.Title, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); Rozdzielczość ustalona na „sztywno” Tylko w Windows Odczytanie rozmiaru ekranu: graphics.GraphicsDevice.DisplayMode.Width graphics.GraphicsDevice.DisplayMode.Height

Zmiana wielkości okna protected override void Initialize() { try graphics.PreferredBackBufferWidth = 800; graphics.PreferredBackBufferHeight = 600; graphics.IsFullScreen = true; graphics.ApplyChanges(); } catch (Exception exc) System.Windows.Forms.MessageBox.Show( "Błąd podczas przełączania w tryb pełnoekranowy:\n" + exc.Message, Window.Title, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); Rozdzielczość ustalona na „sztywno” Tylko w Windows Odczytanie rozmiaru ekranu: graphics.GraphicsDevice.DisplayMode.Width graphics.GraphicsDevice.DisplayMode.Height

Okno Zmiana tytułu okna: Klawisz Escape i spacja: Window.Title = "Moduł 1. XNA - Szybki start"; Klawisz Escape i spacja: if (Keyboard.GetState().IsKeyDown(Keys.Escape)) this.Exit(); if (Keyboard.GetState().IsKeyDown(Keys.Space)) graphics.ToggleFullScreen();

Jedna instancja gry static class Program { static void Main(string[] args) bool czyPierwszaInstancja; Mutex m = new Mutex(true,"MojaPierwszaGraXNA”,out czyPierwszaInstancja); if (!czyPierwszaInstancja) MessageBox.Show("Inna instancja tej gry jest już uruchomiona"); return; }   using (Game1 game = new Game1()) game.Run();   m.ReleaseMutex();