SlideShare a Scribd company logo
1 of 36
Download to read offline
Podstawy tworzenia gier w J2ME, dla
    początkujących adeptów sztuki programowania

                     Marcin Stachniuk
                   mstachniuk@gmail.com

                   Blog: mstachniuk.blogspot.com

                    Twitter: @MarcinStachniuk


                         27 maja 2012




Marcin Stachniuk                              Podstawy tworzenia gier w J2ME   1/34
Plan prezentacji


  1   Podstawy rysowania

  2   Obsługa klawiszy

  3   Sprite

  4   TiledLayer

  5   Wykrywanie kolizji

  6   Animacja



  Marcin Stachniuk         Podstawy tworzenia gier w J2ME   2/34
Plan prezentacji


  1   Podstawy rysowania

  2   Obsługa klawiszy

  3   Sprite

  4   TiledLayer

  5   Wykrywanie kolizji

  6   Animacja



  Marcin Stachniuk         Podstawy tworzenia gier w J2ME   3/34
GameCanvas
  GameCanvas
  Przestrzeń po której będziemy malować.




  Marcin Stachniuk                         Podstawy tworzenia gier w J2ME   4/34
GameCanvas - możliwości




  Metody:
        setFullScreenMode(true); – ustawienie pełnego ekranu.
        Graphics g = getGraphics(); – pobranie buforu
        graficznego.
        flushGraphics(); – namalowanie grafiki z bufora




  Marcin Stachniuk                         Podstawy tworzenia gier w J2ME   5/34
Graphics



  Graphics
  Klasa służąca do rysowania prymitywów, obrazków i tekstów.

  Metody:
        g.setColor(0xFFFFFF) / g.setColor(255, 255, 255)
        – ustawienie aktualnego koloru na biały
        g.drawRect(10, 20, 50, 60) – malowanie prostokąta w
        punkcie [10,20] i szerokości 50px i wysokości 60px
        g.fillRect(10, 20, 50, 60) – malowanie wypełnionego
        prostokąta




  Marcin Stachniuk                          Podstawy tworzenia gier w J2ME   6/34
Image




  Image
  Klasa służąca do wczytywania obrazków.

  Metody:
        Image tankImage = createImage("tank.png");
        – wczytywanie obrazka z pliku tank.png
        tankImage.getHeight() – pobranie wysokości obrazka
        tankImage.getWidth() – pobranie szerokości obrazka




  Marcin Stachniuk                         Podstawy tworzenia gier w J2ME   7/34
Szkielet aplikacji cz. 1


     Główna pętla programu Tank2012.java
 1    public void run() {
 2        while (!canvas.isEndGame()) { // dopoki gra sie nie skonczyła
 3            try {
 4                canvas.inputKeys(); // obsluga wcisnietych klawiszy
 5                canvas.think(); // pozostala logika gry
 6                canvas.paint(); // odmalowanie ekranu
 7                Thread.sleep(100); // uspienie watku na 100 ms
 8            } catch (Exception ex) {
 9                ex.printStackTrace();
10            }
11        }
12        destroyApp(false); // sprzatanie przed zamknieciem aplikacji
13        notifyDestroyed(); // zamkniecie aplikacji
14    }




     Marcin Stachniuk                               Podstawy tworzenia gier w J2ME   8/34
Szkielet aplikacji cz. 2
   Tu będzie nasza implementacja TankGameCanvas.java
 1 public class TankGameCanvas extends AbstractTankCanvas {
 2   /** Przygotowanie aplikacji */
 3   public void init() {
 4   }
 5
 6   /** Metoda odpowiedzialna za malowanie po ekranie */
 7   public void paint() {
 8   }
 9
10   /** Obsluga naciskanych klawiszy. */
11   public void inputKeys() {
12   }
13
14   /** Miejsce na logike aplikacji. */
15   public void think() {
16   }
17
18   /** Metoda informujaca, czy gra sie juz zakonczyla czy nie. */
19   public boolean isEndGame() {
20   }
21 }


   Marcin Stachniuk                                Podstawy tworzenia gier w J2ME   9/34
Plan prezentacji


  1   Podstawy rysowania

  2   Obsługa klawiszy

  3   Sprite

  4   TiledLayer

  5   Wykrywanie kolizji

  6   Animacja



  Marcin Stachniuk         Podstawy tworzenia gier w J2ME   10/34
Obsługa klawiszy gry w GameCanvas



  Metody klasy GameCanvas
        int keyStates = getKeyStates(); – pobranie stanu
        wciśniętych klawiszy
        (keyStates & LEFT PRESSED) != 0 – sprawdzenie czy
        naciśnięto w lewo

  Klawisze akcji gry
  DOWN PRESSED, LEFT PRESSED, RIGHT PRESSED,
  UP PRESSED, FIRE PRESSED, GAME A PRESSED,
  GAME B PRESSED, GAME C PRESSED, GAME D PRESSED




  Marcin Stachniuk                       Podstawy tworzenia gier w J2ME   11/34
Obsługa klawiszy – przykład




1    if ((keyStates & LEFT_PRESSED) != 0) {
2        // dalsza logika
3    }




    Marcin Stachniuk                          Podstawy tworzenia gier w J2ME   12/34
Plan prezentacji


  1   Podstawy rysowania

  2   Obsługa klawiszy

  3   Sprite

  4   TiledLayer

  5   Wykrywanie kolizji

  6   Animacja



  Marcin Stachniuk         Podstawy tworzenia gier w J2ME   13/34
Sprite




  http://java.sun.com/javame/reference/apis/jsr118/javax/microedition/lcdui/game/Sprite.html




   Marcin Stachniuk                                                     Podstawy tworzenia gier w J2ME   14/34
Sprite – podstawowe właściwości



  Utworzenie Sprite’a:
        tank = new Sprite(tankImage, 30, 30); – utworzenie
        Sprite dla czołgu
  Metody:
        tank.paint(Graphics g) – namalowanie czołgu
        tank.setVisible(true) – czołg staje się widoczny
        tank.setVisible(false) – czołg staje się niewidoczny
        tank.isVisible() – sprawdzenie czy czołg jest widoczny




  Marcin Stachniuk                         Podstawy tworzenia gier w J2ME   15/34
Sprite – pozycja, wielkość i zmiana pozycji

  Metody:
        tank.getX() – pobranie współrzędnej X dla czołgu
        tank.getY() – pobranie współrzędnej Y dla czołgu
        tank.getHeight() – pobranie wysokości dla czołgu
        tank.getWidth() – pobranie szerokości dla czołgu
        tank.setPosition(2, 3) – ustawienie pozycji czołgu
        w punkcie [2, 3]
        tank.move(5, 8) – przesuniecie czołgu o wektor [5, 8]
        tank.defineReferencePixel(1, 5) – definicja piksela
        referencyjnego dla czołgu
        tank.setRefPixelPosition(4, 6) – ustawienie pozycji
        piksela referencyjnego czołgu w pozycji [4, 6]


  Marcin Stachniuk                          Podstawy tworzenia gier w J2ME   16/34
Zadania




  Zadanie 1
  Dopisać poruszanie się czołgu w pionie i poziomie, za pomocą
  strzałek na klawiaturze telefonu.

  Zadanie 2
  Dopisać ograniczenie aby czołg nie wyjeżdżał po za ekran.




  Marcin Stachniuk                          Podstawy tworzenia gier w J2ME   17/34
Zadania




  Zadanie 1
  Dopisać poruszanie się czołgu w pionie i poziomie, za pomocą
  strzałek na klawiaturze telefonu.

  Zadanie 2
  Dopisać ograniczenie aby czołg nie wyjeżdżał po za ekran.




  Marcin Stachniuk                          Podstawy tworzenia gier w J2ME   17/34
Sprite - możliwość animacji




  Metody:
        tank.setFrameSequence(new int [] 2,3,0,1)
        – ustawienie sekwencji animacji na klatki (2,3,0,1)
        tank.nextFrame() – ustawienie następnej klatki
        tank.prevFrame() – ustawienie poprzedniej klatki
        tank.getFrame() – pobranie numeru aktualnej klatki
        tank.setFrame(3) – wybranie 3ciej klatki animacji




  Marcin Stachniuk                            Podstawy tworzenia gier w J2ME   18/34
Zadania




  Zadanie 3
  Dopisać obracanie czołgu lufą w kierunku jazdy.




  Marcin Stachniuk                          Podstawy tworzenia gier w J2ME   19/34
Plan prezentacji


  1   Podstawy rysowania

  2   Obsługa klawiszy

  3   Sprite

  4   TiledLayer

  5   Wykrywanie kolizji

  6   Animacja



  Marcin Stachniuk         Podstawy tworzenia gier w J2ME   20/34
TiledLayer




  http://java.sun.com/javame/reference/apis/jsr118/javax/microedition/lcdui/game/TiledLayer.html


  Marcin Stachniuk                                                      Podstawy tworzenia gier w J2ME   21/34
TiledLayer




  http://java.sun.com/javame/reference/apis/jsr118/javax/microedition/lcdui/game/TiledLayer.html




  Marcin Stachniuk                                                      Podstawy tworzenia gier w J2ME   22/34
TiledLayer – podstawy




  Konstruktor:
        tiles = new TiledLayer(4, 6, image, 20, 20);
        – utworzenie nowego TiledLayer’a o 4ch kolumnach, 6ciu
        wierszach i rozmiarze pojedynczego kafelka 20x20.
  Metody:
        tiles.setCell(2, 3, 1) - ustawienie kafelka nr. 1 na
        pozycji [2,3]




  Marcin Stachniuk                          Podstawy tworzenia gier w J2ME   23/34
Zadania




  Zadanie 4
  Wyświetlić TiledLayer’a z trawą na ekranie. Czołg może się
  „schować” w trawie.




  Marcin Stachniuk                          Podstawy tworzenia gier w J2ME   24/34
Plan prezentacji


  1   Podstawy rysowania

  2   Obsługa klawiszy

  3   Sprite

  4   TiledLayer

  5   Wykrywanie kolizji

  6   Animacja



  Marcin Stachniuk         Podstawy tworzenia gier w J2ME   25/34
Sprite, TiledLayer - wykrywanie kolizji




  Metody w Sprite:
         tank.collidesWith(missile, false) – test kolizji czołgu
         z innym Sprite’m (missile)
         tank.collidesWith(tiles, false) – sprawdzanie kolizji
         czołgu z kafelkiem TiledLayer’a




   Marcin Stachniuk                        Podstawy tworzenia gier w J2ME   26/34
Zadania




  Zadanie 5
  Wyświetlić TiledLayer’a z białymi cegłami i wodą na ekranie.
  Przez białe cegły i wodę nie można przejechać.
  Podpowiedź: Użyj nowego TiledLayer’a.




  Marcin Stachniuk                          Podstawy tworzenia gier w J2ME   27/34
Plan prezentacji


  1   Podstawy rysowania

  2   Obsługa klawiszy

  3   Sprite

  4   TiledLayer

  5   Wykrywanie kolizji

  6   Animacja



  Marcin Stachniuk         Podstawy tworzenia gier w J2ME   28/34
TiledLayer – animacja




  Metody:
        int animatedTile = tiles.createAnimatedTile(0); -
        utworzenie animowanego kafelka
        tiles.setAnimatedTile(animatedTile, 2) - ustawienie
        animowanego kafelka o numerze animatedTile na kafelek
        nr. 2.




  Marcin Stachniuk                       Podstawy tworzenia gier w J2ME   29/34
Zadania



  Zadanie 6
  Spraw, aby woda się animowała.

  Zadanie 7
  Wyświetl na ekranie mór z czerwonych cegieł i spraw, aby można
  było zniszczyć cegły za pomocą wystrzeliwanych pocisków.
  Podpowiedź 1: Dla każdego murku utwórz pojedynczego Sprite’a.
  Podpowiedź 2: Dla Sprite’a będącego pociskiem zdefiniuj pixel
  referencyjny w jego centrum.




  Marcin Stachniuk                        Podstawy tworzenia gier w J2ME   30/34
Zadania



  Zadanie 6
  Spraw, aby woda się animowała.

  Zadanie 7
  Wyświetl na ekranie mór z czerwonych cegieł i spraw, aby można
  było zniszczyć cegły za pomocą wystrzeliwanych pocisków.
  Podpowiedź 1: Dla każdego murku utwórz pojedynczego Sprite’a.
  Podpowiedź 2: Dla Sprite’a będącego pociskiem zdefiniuj pixel
  referencyjny w jego centrum.




  Marcin Stachniuk                        Podstawy tworzenia gier w J2ME   30/34
Efekt

  Powinniśmy osiągnąć coś takiego:




  Marcin Stachniuk                   Podstawy tworzenia gier w J2ME   31/34
Pytania




                     ?




  Marcin Stachniuk       Podstawy tworzenia gier w J2ME   32/34
Więcej informacji

        Kontakt z autorem:
        e-mail: mstachniuk@gmail.com
        blog: mstachniuk.blogspot.com
        twitter: @MarcinStachniuk
        Kod źródłowy:
        https://github.com/mstachniuk/tank2012j2me




  Marcin Stachniuk                        Podstawy tworzenia gier w J2ME   33/34
Podstawy tworzenia gier w J2ME, dla
    początkujących adeptów sztuki programowania

                       Marcin Stachniuk
                     mstachniuk@gmail.com


                   Dzięki za uwagę!
                         27 maja 2012




Marcin Stachniuk                        Podstawy tworzenia gier w J2ME   34/34

More Related Content

More from MarcinStachniuk

GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learnedGraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learnedMarcinStachniuk
 
Java Web Start – jak żyć z tą dziwną technologią
Java Web Start – jak żyć z tą dziwną technologiąJava Web Start – jak żyć z tą dziwną technologią
Java Web Start – jak żyć z tą dziwną technologiąMarcinStachniuk
 
Zarządzanie zmianami w schemacie relacyjnych baz danych
Zarządzanie zmianami w schemacie relacyjnych baz danychZarządzanie zmianami w schemacie relacyjnych baz danych
Zarządzanie zmianami w schemacie relacyjnych baz danychMarcinStachniuk
 
Inicjatywa NoSQL na przykładzie db4o
Inicjatywa NoSQL na przykładzie db4oInicjatywa NoSQL na przykładzie db4o
Inicjatywa NoSQL na przykładzie db4oMarcinStachniuk
 
Automatic mechanism data migration between relational and object database
Automatic mechanism data migration between relational and object databaseAutomatic mechanism data migration between relational and object database
Automatic mechanism data migration between relational and object databaseMarcinStachniuk
 
Zastosowanie obiektowych baz danych na przykładzie db4o
Zastosowanie obiektowych baz danych na przykładzie db4oZastosowanie obiektowych baz danych na przykładzie db4o
Zastosowanie obiektowych baz danych na przykładzie db4oMarcinStachniuk
 
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017MarcinStachniuk
 
Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w...
Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w...Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w...
Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w...MarcinStachniuk
 
Java Web Start czyli jak żyć z tą dziwną technologią & Continuous Delivery w ...
Java Web Start czyli jak żyć z tą dziwną technologią & Continuous Delivery w ...Java Web Start czyli jak żyć z tą dziwną technologią & Continuous Delivery w ...
Java Web Start czyli jak żyć z tą dziwną technologią & Continuous Delivery w ...MarcinStachniuk
 
Continuous delivery w projekcie open source - Marcin Stachniuk
Continuous delivery w projekcie open source - Marcin StachniukContinuous delivery w projekcie open source - Marcin Stachniuk
Continuous delivery w projekcie open source - Marcin StachniukMarcinStachniuk
 
Zarządzanie zamianami w relacyjnych bazach danych
Zarządzanie zamianami w relacyjnych bazach danychZarządzanie zamianami w relacyjnych bazach danych
Zarządzanie zamianami w relacyjnych bazach danychMarcinStachniuk
 
Nowości w Javie 8 okiem programisty
Nowości w Javie 8 okiem programistyNowości w Javie 8 okiem programisty
Nowości w Javie 8 okiem programistyMarcinStachniuk
 
Liquibase - Zarządzanie zmianami w relacyjnych bazach danych
Liquibase - Zarządzanie zmianami w relacyjnych bazach danychLiquibase - Zarządzanie zmianami w relacyjnych bazach danych
Liquibase - Zarządzanie zmianami w relacyjnych bazach danychMarcinStachniuk
 

More from MarcinStachniuk (20)

GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learnedGraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learned
 
Java Web Start – jak żyć z tą dziwną technologią
Java Web Start – jak żyć z tą dziwną technologiąJava Web Start – jak żyć z tą dziwną technologią
Java Web Start – jak żyć z tą dziwną technologią
 
Zarządzanie zmianami w schemacie relacyjnych baz danych
Zarządzanie zmianami w schemacie relacyjnych baz danychZarządzanie zmianami w schemacie relacyjnych baz danych
Zarządzanie zmianami w schemacie relacyjnych baz danych
 
Inicjatywa NoSQL na przykładzie db4o
Inicjatywa NoSQL na przykładzie db4oInicjatywa NoSQL na przykładzie db4o
Inicjatywa NoSQL na przykładzie db4o
 
Automatic mechanism data migration between relational and object database
Automatic mechanism data migration between relational and object databaseAutomatic mechanism data migration between relational and object database
Automatic mechanism data migration between relational and object database
 
Zastosowanie obiektowych baz danych na przykładzie db4o
Zastosowanie obiektowych baz danych na przykładzie db4oZastosowanie obiektowych baz danych na przykładzie db4o
Zastosowanie obiektowych baz danych na przykładzie db4o
 
Wprowadzenie do J2ME
Wprowadzenie do J2MEWprowadzenie do J2ME
Wprowadzenie do J2ME
 
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
 
Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w...
Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w...Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w...
Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w...
 
Java Web Start czyli jak żyć z tą dziwną technologią & Continuous Delivery w ...
Java Web Start czyli jak żyć z tą dziwną technologią & Continuous Delivery w ...Java Web Start czyli jak żyć z tą dziwną technologią & Continuous Delivery w ...
Java Web Start czyli jak żyć z tą dziwną technologią & Continuous Delivery w ...
 
Continuous delivery w projekcie open source - Marcin Stachniuk
Continuous delivery w projekcie open source - Marcin StachniukContinuous delivery w projekcie open source - Marcin Stachniuk
Continuous delivery w projekcie open source - Marcin Stachniuk
 
Zarządzanie zamianami w relacyjnych bazach danych
Zarządzanie zamianami w relacyjnych bazach danychZarządzanie zamianami w relacyjnych bazach danych
Zarządzanie zamianami w relacyjnych bazach danych
 
Nowości w Javie 8 okiem programisty
Nowości w Javie 8 okiem programistyNowości w Javie 8 okiem programisty
Nowości w Javie 8 okiem programisty
 
Liquibase - Zarządzanie zmianami w relacyjnych bazach danych
Liquibase - Zarządzanie zmianami w relacyjnych bazach danychLiquibase - Zarządzanie zmianami w relacyjnych bazach danych
Liquibase - Zarządzanie zmianami w relacyjnych bazach danych
 

Podstawy tworzenia gier w J2ME, dla początkujących adeptów sztuki programowania

  • 1. Podstawy tworzenia gier w J2ME, dla początkujących adeptów sztuki programowania Marcin Stachniuk mstachniuk@gmail.com Blog: mstachniuk.blogspot.com Twitter: @MarcinStachniuk 27 maja 2012 Marcin Stachniuk Podstawy tworzenia gier w J2ME 1/34
  • 2. Plan prezentacji 1 Podstawy rysowania 2 Obsługa klawiszy 3 Sprite 4 TiledLayer 5 Wykrywanie kolizji 6 Animacja Marcin Stachniuk Podstawy tworzenia gier w J2ME 2/34
  • 3. Plan prezentacji 1 Podstawy rysowania 2 Obsługa klawiszy 3 Sprite 4 TiledLayer 5 Wykrywanie kolizji 6 Animacja Marcin Stachniuk Podstawy tworzenia gier w J2ME 3/34
  • 4. GameCanvas GameCanvas Przestrzeń po której będziemy malować. Marcin Stachniuk Podstawy tworzenia gier w J2ME 4/34
  • 5. GameCanvas - możliwości Metody: setFullScreenMode(true); – ustawienie pełnego ekranu. Graphics g = getGraphics(); – pobranie buforu graficznego. flushGraphics(); – namalowanie grafiki z bufora Marcin Stachniuk Podstawy tworzenia gier w J2ME 5/34
  • 6. Graphics Graphics Klasa służąca do rysowania prymitywów, obrazków i tekstów. Metody: g.setColor(0xFFFFFF) / g.setColor(255, 255, 255) – ustawienie aktualnego koloru na biały g.drawRect(10, 20, 50, 60) – malowanie prostokąta w punkcie [10,20] i szerokości 50px i wysokości 60px g.fillRect(10, 20, 50, 60) – malowanie wypełnionego prostokąta Marcin Stachniuk Podstawy tworzenia gier w J2ME 6/34
  • 7. Image Image Klasa służąca do wczytywania obrazków. Metody: Image tankImage = createImage("tank.png"); – wczytywanie obrazka z pliku tank.png tankImage.getHeight() – pobranie wysokości obrazka tankImage.getWidth() – pobranie szerokości obrazka Marcin Stachniuk Podstawy tworzenia gier w J2ME 7/34
  • 8. Szkielet aplikacji cz. 1 Główna pętla programu Tank2012.java 1 public void run() { 2 while (!canvas.isEndGame()) { // dopoki gra sie nie skonczyła 3 try { 4 canvas.inputKeys(); // obsluga wcisnietych klawiszy 5 canvas.think(); // pozostala logika gry 6 canvas.paint(); // odmalowanie ekranu 7 Thread.sleep(100); // uspienie watku na 100 ms 8 } catch (Exception ex) { 9 ex.printStackTrace(); 10 } 11 } 12 destroyApp(false); // sprzatanie przed zamknieciem aplikacji 13 notifyDestroyed(); // zamkniecie aplikacji 14 } Marcin Stachniuk Podstawy tworzenia gier w J2ME 8/34
  • 9. Szkielet aplikacji cz. 2 Tu będzie nasza implementacja TankGameCanvas.java 1 public class TankGameCanvas extends AbstractTankCanvas { 2 /** Przygotowanie aplikacji */ 3 public void init() { 4 } 5 6 /** Metoda odpowiedzialna za malowanie po ekranie */ 7 public void paint() { 8 } 9 10 /** Obsluga naciskanych klawiszy. */ 11 public void inputKeys() { 12 } 13 14 /** Miejsce na logike aplikacji. */ 15 public void think() { 16 } 17 18 /** Metoda informujaca, czy gra sie juz zakonczyla czy nie. */ 19 public boolean isEndGame() { 20 } 21 } Marcin Stachniuk Podstawy tworzenia gier w J2ME 9/34
  • 10. Plan prezentacji 1 Podstawy rysowania 2 Obsługa klawiszy 3 Sprite 4 TiledLayer 5 Wykrywanie kolizji 6 Animacja Marcin Stachniuk Podstawy tworzenia gier w J2ME 10/34
  • 11. Obsługa klawiszy gry w GameCanvas Metody klasy GameCanvas int keyStates = getKeyStates(); – pobranie stanu wciśniętych klawiszy (keyStates & LEFT PRESSED) != 0 – sprawdzenie czy naciśnięto w lewo Klawisze akcji gry DOWN PRESSED, LEFT PRESSED, RIGHT PRESSED, UP PRESSED, FIRE PRESSED, GAME A PRESSED, GAME B PRESSED, GAME C PRESSED, GAME D PRESSED Marcin Stachniuk Podstawy tworzenia gier w J2ME 11/34
  • 12. Obsługa klawiszy – przykład 1 if ((keyStates & LEFT_PRESSED) != 0) { 2 // dalsza logika 3 } Marcin Stachniuk Podstawy tworzenia gier w J2ME 12/34
  • 13. Plan prezentacji 1 Podstawy rysowania 2 Obsługa klawiszy 3 Sprite 4 TiledLayer 5 Wykrywanie kolizji 6 Animacja Marcin Stachniuk Podstawy tworzenia gier w J2ME 13/34
  • 15. Sprite – podstawowe właściwości Utworzenie Sprite’a: tank = new Sprite(tankImage, 30, 30); – utworzenie Sprite dla czołgu Metody: tank.paint(Graphics g) – namalowanie czołgu tank.setVisible(true) – czołg staje się widoczny tank.setVisible(false) – czołg staje się niewidoczny tank.isVisible() – sprawdzenie czy czołg jest widoczny Marcin Stachniuk Podstawy tworzenia gier w J2ME 15/34
  • 16. Sprite – pozycja, wielkość i zmiana pozycji Metody: tank.getX() – pobranie współrzędnej X dla czołgu tank.getY() – pobranie współrzędnej Y dla czołgu tank.getHeight() – pobranie wysokości dla czołgu tank.getWidth() – pobranie szerokości dla czołgu tank.setPosition(2, 3) – ustawienie pozycji czołgu w punkcie [2, 3] tank.move(5, 8) – przesuniecie czołgu o wektor [5, 8] tank.defineReferencePixel(1, 5) – definicja piksela referencyjnego dla czołgu tank.setRefPixelPosition(4, 6) – ustawienie pozycji piksela referencyjnego czołgu w pozycji [4, 6] Marcin Stachniuk Podstawy tworzenia gier w J2ME 16/34
  • 17. Zadania Zadanie 1 Dopisać poruszanie się czołgu w pionie i poziomie, za pomocą strzałek na klawiaturze telefonu. Zadanie 2 Dopisać ograniczenie aby czołg nie wyjeżdżał po za ekran. Marcin Stachniuk Podstawy tworzenia gier w J2ME 17/34
  • 18. Zadania Zadanie 1 Dopisać poruszanie się czołgu w pionie i poziomie, za pomocą strzałek na klawiaturze telefonu. Zadanie 2 Dopisać ograniczenie aby czołg nie wyjeżdżał po za ekran. Marcin Stachniuk Podstawy tworzenia gier w J2ME 17/34
  • 19. Sprite - możliwość animacji Metody: tank.setFrameSequence(new int [] 2,3,0,1) – ustawienie sekwencji animacji na klatki (2,3,0,1) tank.nextFrame() – ustawienie następnej klatki tank.prevFrame() – ustawienie poprzedniej klatki tank.getFrame() – pobranie numeru aktualnej klatki tank.setFrame(3) – wybranie 3ciej klatki animacji Marcin Stachniuk Podstawy tworzenia gier w J2ME 18/34
  • 20. Zadania Zadanie 3 Dopisać obracanie czołgu lufą w kierunku jazdy. Marcin Stachniuk Podstawy tworzenia gier w J2ME 19/34
  • 21. Plan prezentacji 1 Podstawy rysowania 2 Obsługa klawiszy 3 Sprite 4 TiledLayer 5 Wykrywanie kolizji 6 Animacja Marcin Stachniuk Podstawy tworzenia gier w J2ME 20/34
  • 24. TiledLayer – podstawy Konstruktor: tiles = new TiledLayer(4, 6, image, 20, 20); – utworzenie nowego TiledLayer’a o 4ch kolumnach, 6ciu wierszach i rozmiarze pojedynczego kafelka 20x20. Metody: tiles.setCell(2, 3, 1) - ustawienie kafelka nr. 1 na pozycji [2,3] Marcin Stachniuk Podstawy tworzenia gier w J2ME 23/34
  • 25. Zadania Zadanie 4 Wyświetlić TiledLayer’a z trawą na ekranie. Czołg może się „schować” w trawie. Marcin Stachniuk Podstawy tworzenia gier w J2ME 24/34
  • 26. Plan prezentacji 1 Podstawy rysowania 2 Obsługa klawiszy 3 Sprite 4 TiledLayer 5 Wykrywanie kolizji 6 Animacja Marcin Stachniuk Podstawy tworzenia gier w J2ME 25/34
  • 27. Sprite, TiledLayer - wykrywanie kolizji Metody w Sprite: tank.collidesWith(missile, false) – test kolizji czołgu z innym Sprite’m (missile) tank.collidesWith(tiles, false) – sprawdzanie kolizji czołgu z kafelkiem TiledLayer’a Marcin Stachniuk Podstawy tworzenia gier w J2ME 26/34
  • 28. Zadania Zadanie 5 Wyświetlić TiledLayer’a z białymi cegłami i wodą na ekranie. Przez białe cegły i wodę nie można przejechać. Podpowiedź: Użyj nowego TiledLayer’a. Marcin Stachniuk Podstawy tworzenia gier w J2ME 27/34
  • 29. Plan prezentacji 1 Podstawy rysowania 2 Obsługa klawiszy 3 Sprite 4 TiledLayer 5 Wykrywanie kolizji 6 Animacja Marcin Stachniuk Podstawy tworzenia gier w J2ME 28/34
  • 30. TiledLayer – animacja Metody: int animatedTile = tiles.createAnimatedTile(0); - utworzenie animowanego kafelka tiles.setAnimatedTile(animatedTile, 2) - ustawienie animowanego kafelka o numerze animatedTile na kafelek nr. 2. Marcin Stachniuk Podstawy tworzenia gier w J2ME 29/34
  • 31. Zadania Zadanie 6 Spraw, aby woda się animowała. Zadanie 7 Wyświetl na ekranie mór z czerwonych cegieł i spraw, aby można było zniszczyć cegły za pomocą wystrzeliwanych pocisków. Podpowiedź 1: Dla każdego murku utwórz pojedynczego Sprite’a. Podpowiedź 2: Dla Sprite’a będącego pociskiem zdefiniuj pixel referencyjny w jego centrum. Marcin Stachniuk Podstawy tworzenia gier w J2ME 30/34
  • 32. Zadania Zadanie 6 Spraw, aby woda się animowała. Zadanie 7 Wyświetl na ekranie mór z czerwonych cegieł i spraw, aby można było zniszczyć cegły za pomocą wystrzeliwanych pocisków. Podpowiedź 1: Dla każdego murku utwórz pojedynczego Sprite’a. Podpowiedź 2: Dla Sprite’a będącego pociskiem zdefiniuj pixel referencyjny w jego centrum. Marcin Stachniuk Podstawy tworzenia gier w J2ME 30/34
  • 33. Efekt Powinniśmy osiągnąć coś takiego: Marcin Stachniuk Podstawy tworzenia gier w J2ME 31/34
  • 34. Pytania ? Marcin Stachniuk Podstawy tworzenia gier w J2ME 32/34
  • 35. Więcej informacji Kontakt z autorem: e-mail: mstachniuk@gmail.com blog: mstachniuk.blogspot.com twitter: @MarcinStachniuk Kod źródłowy: https://github.com/mstachniuk/tank2012j2me Marcin Stachniuk Podstawy tworzenia gier w J2ME 33/34
  • 36. Podstawy tworzenia gier w J2ME, dla początkujących adeptów sztuki programowania Marcin Stachniuk mstachniuk@gmail.com Dzięki za uwagę! 27 maja 2012 Marcin Stachniuk Podstawy tworzenia gier w J2ME 34/34