Microsoft XNA, część 1

10.05.2010 - Marcin Oczeretko
TrudnośćTrudność

    Abyśmy nie martwili niepotrzebnie się o to, skąd wziąć grafikę do naszej gry, przygotowałem wcześniej kilka obrazków. Pobierz je proszę, korzystając z zamieszczonego obok linka.


     Do dodania tych plików do naszej gry, użyjemy teraz narzędzia o nazwie Content Pipeline. Jest to rzecz bardzo elegancka, gdyż dzięki niej omija nas cała nieprzyjemność związana z różnymi technikami potrzebnymi do wczytywania różnych typów plików. Z pomocą Content Pipeline zasób jest wstępnie przetwarzany i następnie zapisywany jako plik *.xnb (dodatkowo za pomocą kilku kliknięć jesteśmy w stanie zapewnić sobie jego automatyczną kompresję i dekompresję). Następnie, dzięki klasie ContentManager, w prosty sposób odczytujemy z tego przetworzonego pliku to, co chcemy. Zobaczmy Content Pipeline w akcji:

     W Solution Explorer kliknij prawym przyciskiem myszy na Content i wybierz Add $ \to $ Existing Item... Pojawi się okienko wyboru plików. Zaznacz w nim wszystkie pobrane wcześniej obrazki i zatwierdź wybór. Content Pipeline zajmie się całą resztą, my natomiast załadujmy gotowe zasoby. Do przechowywania obrazków służą instancje klasy Texture2D, zadeklarujmy zatem w klasie Game1 następujące pola:

1
private Texture2D background, player, ball;

     Jak już wiemy, do ładowania zasobów służy metoda LoadContent(). Dopiszmy w niej zatem trzy linijki:

1
2
3
4
5
6
7
8
protected override void LoadContent()
{
    spriteBatch = new SpriteBatch(GraphicsDevice);
    
    background = Content.Load<Texture2D>("background");
    ball = Content.Load<Texture2D>("ball");
    player = Content.Load<Texture2D>("player");
}

     I to już wszystko. Projekt się kompiluje, a zasoby są ładowane. Aby się o tym przekonać, narysujemy je teraz na ekranie. W tym celu skorzystamy z obiektu SpriteBatch, który pomaga nam przy rysowaniu grup obrazków - możemy np. określać w jaki sposób mają się na siebie nakładać, czy przenikać. Należy go "uruchomić" - służy do tego metoda Begin(). Potem dzięki metodzie Draw() rysujemy obrazki. Cały zabieg kończymy wywołaniem metody End(). Aby przechowywać informacje o aktualnej pozycji gracza i piłki potrzebne nam będą instancje klasy Vector2, zadeklarujmy zatem w Game1:

1
2
3
private Vector2 playerPos = new Vector2(100, 100),
                 ballPos = new Vector2(300,300); 
                    // inicjujemy przykładowymi wartościami

     Teraz już możemy przejść do rysowania. Usuńmy z metody Draw() linijkę czyszczącą ekran i napiszmy zamiast niej:

1
2
3
4
5
6
7
8
9
10
11
12
13
protected override void Draw(GameTime gameTime)
{
 
    spriteBatch.Begin();
 
    spriteBatch.Draw(background,Vector2.Zero,Color.White);
    spriteBatch.Draw(ball,ballPos,Color.White);    
    spriteBatch.Draw(player,playerPos,Color.White);
 
    spriteBatch.End();
 
    base.Draw(gameTime);
}

     Uruchom projekt, by przekonać się, że na ekranie pojawiły się nasze zasoby.

     Dodamy trochę akcji do naszej gry - umożliwmy proste poruszanie graczem. W metodzie Update() sprawdzimy, czy został naciśnięty któryś z klawiszy W,S,A,D. Jeśli tak, to zmodyfikujemy odpowiednio obiekt playerPos. Za pomocą Keyboard.GetState() pobieramy obiekt opisujący stan klawiatury w danym momencie. Ma on metodę IsKeyDown(), z której skorzystamy by dowiedzieć się, czy interesujące nas klawisze są naciśnięte. Przepisz poniższy kod do metody Update():

1
2
3
4
5
6
7
8
9
10
11
if(Keyboard.GetState().IsKeyDown(Keys.W))
    playerPos += new Vector2( 0,-4);
    
if(Keyboard.GetState().IsKeyDown(Keys.S))
    playerPos += new Vector2( 0, 4);
    
if(Keyboard.GetState().IsKeyDown(Keys.A))
    playerPos += new Vector2(-4, 0);
    
if(Keyboard.GetState().IsKeyDown(Keys.D))
    playerPos += new Vector2( 4, 0);

     Gotowe! Uruchom grę i przetestuj, czy wszystko działa, jak powinno.

4
Twoja ocena: Brak Ocena: 4 (4 ocen)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com