Nauka programowania gier komputerowych w Javie. Autor: Piotr Modzelewski keyer@mat.uni.torun.pl

Wielkość: px
Rozpocząć pokaz od strony:

Download "Nauka programowania gier komputerowych w Javie. Autor: Piotr Modzelewski E-mail: keyer@mat.uni.torun.pl"

Transkrypt

1 Nauka programowania gier komputerowych w Javie. Autor: Piotr Modzelewski keyer@mat.uni.torun.pl Wstęp Celem tego referatu jest napisanie prostej gry w Javie, jednakże nie trywialnej. W dziele tworzenia używać będziemy dogodności programowania obiektowego. Tworzenie gry nie będzie się odbywać od razu. Zaczniemy od małego projektu, który będzie się rozrastać. Kod będziemy poprawiać, ulepszać a nawet usuwać, aby zobaczyć jak przy różnych jego wersjach działać będzie nasza aplikacja. Celem tego kursu jest oprócz stworzenia gry: Ulepszanie nauki Javy Zdobycie podstaw na temat Swingu i AWT Zrozumienie obsługi zdarzeń oraz komponentów Nauka Javy2D Nauka HashMapy i ArrayList Sztuczek programistycznych Pierwsze okno Pierwszym krokiem tworzenia naszej aplikacji jest stworzenia okna. Wykorzystamy Bibliotekę Swing (dokładnie JFrame). Zakładamy, że nasz projekt nazywa się WojnaSwiatow javax.swing.jframe; public class WojnaSwiatow{ public static final int SZEROKOSC = 800; public static final int WYSOKOSC = 600; public WojnaSwiatow() { JFrame okno = new JFrame(".: Wojna Swiatow :."); okno.setbounds(0,0,szerokosc,wysokosc); okno.setvisible(true); public static void main(string[] args) { WojnaSwiatow inv = new WojnaSwiatow(); Widzimy, że okno to nie będzie nawet kończyć programu w momencie jego zamknięcia. Tak być nie może. Oczywiście naprawienie tego nie będzie kłopotem. Wystarczy konstruktor WojnaSwiatow( ) zmodyfikować dodając na jego końcu: okno.addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent e){ System.exit(0); ); Oraz dodatkowo zaować obsługę zdarzeń: java.awt.event.windowadapter; java.awt.event.windowevent; Zabawa w rysowanie Podstawą w grze jest oczywiście grafika, a co za tym idzie, umiejętność rysowania. Każdy kto miał doczynienia z okienkami wie, że rysowanie w oknie to nadpisanie metody paint( ). Nasza klasa, WojnaSwiatow, nie jest jednak de facto oknem. Aby jednak je w nią zamienić wystarczy dziedziczyć z Canvas : javax.swing.jframe;

2 public class WojnaSwiatow extends Canvas{ Wspaniale. Teraz spróbujmy sprawdzić czy to wystarczy. Najprościej będzie, jeżeli coś narysujem. Bez zbędnego gadania, zróbmy to. Na początku zaujmy: javax.swing.jpanel; java.awt.color; java.awt.dimension; java.awt.graphics; Teraz, aby utworzyć panel w oknie, modyfikujemy konstruktor: public WojnaSwiatow() { JFrame okno = new JFrame(".:Wojna Swiatow:."); JPanel panel = (JPanel)okno.getContentPane(); setbounds(0,0,szerokosc,wysokosc); panel.setpreferredsize(new Dimension(SZEROKOSC,WYSOKOSC)); panel.setlayout(null); panel.add(this); okno.setbounds(0,0,szerokosc,wysokosc); okno.setvisible(true); okno.addwindowlistener( new WindowAdapter() { public void windowclosing(windowevent e) { System.exit(0); ); No to jak mamy panel, na którym będziemy rysować, pora to zrobić, na razie dla testów będzie to banalna figura geometryczna. Zgadnijcie jaka. Oczywiście jak napisałem wyżej, polega to na nadpisaniu metody paint( ), którą umieścimy zaraz pod konstruktorem WojnaSwiatow( ): public void paint(graphics g){ g.setcolor (Color.red); g.filloval( SZEROKOSC/2-10, WYSOKOSC/2-10,20,20); Uruchamiamy i jeśli wszystko dobrze zrobiliśmy, widzimy jak się spodziewaliśmy czerwone kółeczko. Wstawiamy rysunki No można bawić się w rysowanie, ale rysowanie złożonych grafik w Javie jest nie tylko czasochłonne, ale i nieefektywne. Dlatego też wczytywać będziemy gotowe obrazki, stworzone choćby w Gimpie. Obrazek musi znajdować się w pewnym miejscu na dysku, do którego ma dostęp program. Miejscem wyjścia, gdy pracujemy w NetBeans, jest folderg src. Gdy korzystasz z innego środowiska musisz sam sprawdzić gdzie umieszczasz rysunki i jak do nich dotrzeć. Zakładamy, że w folderze src mamy folder img z naszymi obrazkami. Wstawmy najpierw jednego stworka: Rys 1: Oto nasz straszny stworek. Zaczynam od zaowania nowych bibliotek: java.awt.image.bufferedimage; java.net.url; javax.imageio.imageio; Teraz napiszemy metodę do wczytywania obrazków: public BufferedImage loadimage(string sciezka) {

3 URL url=null; try { url = getclass().getclassloader().getresource(sciezka); return ImageIO.read(url); catch (Exception e) { System.out.println("Przy otwieraniu " + sciezka +" jako " + url); System.out.println("Wystapil blad : "+e.getclass().getname()+" "+e.getmessage()); System.exit(0); return null; Jak widać w razie błędu przerwanie programu. To ważne, bo będziemy wiedzieć jaki plik źle zlokalizowaliśmy. Co ważniejsze jak widzimy, ścieżka jest ścieżką względna, co umożliwia nam pobranie obrazka skądkolwiek, niezależnie gdzie leży obecnie nasza gra (a może w przyszłości aplet). Pozostaje zmienienie metody paint( ): public void paint(graphics g){ BufferedImage potworek = loadimage("img/potworek.gif"); g.drawimage(potworek, 40, 40,this); Jako rezultat widzimy: Rys 2. Straszny potwor zamknięty w naszym okienku. Jeśli jednak dokładnie przyjrzymy się kodowi, widzimy że ponieważ metoda paint( ) jest wywoływana przy każdym przerysowania okna, za każdym razem będzie on ładowany od początku. Niezbyt efektywne. Można pomyśleć żeby ładować to od razu w konstruktorze raz a dobrze. No ale pomyślmy, że tworzymy większy projekt, powiedzmy aplet z setkami stworków, tekstur i innych obrazków. Za każdym razem, ktoś kto ściąga nasz aplet musi czekać Az to wszystko się załaduje, a możliwe ze nawet niektórych z nich nigdy nie obejrzy, bo występuje powiedzmy w 50 level u, gdy on skończy grę przy 10 Zastosujmy sztuczkę nazywaną deferred loading. Dodajemy do atrybutów WojnaSwiatow naszego potworka. public class WojnaSwiatow extends Canvas{ public static final int SZEROKOSC = 800; public static final int WYSOKOSC = 600; public BufferedImage potworek = null; Teraz zmieniamy metodę rysowania: public void paint(graphics g){ if (potworek==null) potworek = loadimage("img/potworek.gif");

4 g.drawimage(potworek, 40, 40,this); Skuteczne aczkolwiek nieeleganckie i kłopotliwe gdy będą setki grafik. Java oferuje jednak metode nazywana getsprite( ). Sprite (z ang., dosłownie duszek) to dwuwymiarowy obrazek używany w systemach grafiki dwuwymiarowej i 2.5- wymiarowej, który po przesunięciu i ewentualnie przeskalowaniu jest przenoszony na ekran. Sprite'y pozwalają na bardzo łatwe uzyskiwanie na ekranie niezbyt wyszukanych obiektów animowanych. Wiele układów graficznych 2D jest wyposażonych w zdolność do automatycznego generowania i animacji sprite'ów. Namiastkę trzeciego wymiaru można uzyskać przez skalowanie sprite'ów oraz ich wyświetlanie w kolejności od dalszych do bliższych (w ten sposób bliższe częściowo zakrywają dalsze). W systemach grafiki 3D zamiast sprite'ów używa się raczej modeli opartych na wielokątach. Więc obrazki będziemy ładować jako duszki. Ponieważ może ich być setki dobrze będzie trzymać je w Hashmapie jako pary (nazwa-sprite a,zaladowany-plik). Na początku ujemy. java.util.hashmap; Zmieniamy więc też atrybuty bo nasz stary potworek jest już nam niepotrzebny, natomiast warto zadeklarować HashMap e. public static final int SZEROKOSC = 800; public static final int WYSOKOSC = 600; public HashMap sprites; Na wstępie konstruktora dopisujemy:... public WojnaSwiatow() { sprites = new HashMap(); Tworzymy nową metodę pod metodą loadimage( ): public BufferedImage getsprite(string sciezka) { BufferedImage img = (BufferedImage)sprites.get(sciezka); if (img == null) { img = loadimage("img/"+sciezka); sprites.put(sciezka,img); return img; Ostatnim akordem zoptymalizowanego wczytywania jest zmiana metody print( ): public void paint(graphics g){ g.drawimage(getsprite("potworek.gif"), 40, 40,this); Animacja Należy uświadomić sobie, że każda gra dzieje się wg następującego scenariusza: 1. Odświeżenie stanu świata tutaj odbywają się ruchy potworów, akcje gracza, 2. Odświeżenie ekranu tutaj odbywa się przeniesienie pierwszego na ekran 3. GOTO 1. Nic ciężkiego, więc zaimplementujmy to. Główna pętla będzie odbywać się w metodzie gra( ). Odświeżanie swiata natomiast, to metoda OdswiezSwiat( ). Oczywiście na tym etapie, odświeżanie to nie jest skomplikowane. Będzie to losowe umieszczanie potworka na planszy. Potrzeba nam do tego dwóch nowych atrybutow, pozx i pozy. public class WojnaSwiatow extends Canvas{ public static final int SZEROKOSC = 800; public static final int WYSOKOSC = 600; public HashMap sprites; public int pozx,pozy;

5 public WojnaSwiatow() { pozx=szerokosc/2; pozy=wysokosc/2; no i zaraz nad main( ) dodajemy: public void paint(graphics g){ g.drawimage(getsprite("potworek.gif"), pozx, pozy,this); public void updateworld() { pozx = (int)(math.random()*szerokosc); pozy = (int)(math.random()*wysokosc); public void game() { while (isvisible()) { updateworld(); paint(getgraphics()); public static void main(string[] args) { WojnaSwiatow inv = new WojnaSwiatow(); inv.game(); Po zobaczeniu rezultatu: Rys 3. Atak!? Widać, że nie o to nam chodziło. Odpowiedź na pytanie dlaczego tak się dzieje jest dość oczywiste. Wywołujemy ręcznie metodę paint ( ). Nie przerysowuje ona okna, tylko nanosi przecież na już przerysowane. Skoro tak, to po prostu nanosi to co ma być zawarte prócz tła, a skoro te nie było przerysowane, to po prostu nanosi na to co było, musimy więc ręcznie czyścić okno. Na razie wystarczy, czyścić okno przed narysowaniem potwora. Wystarczy podmienić metodę paint( ):

6 public void paint(graphics g){ g.setcolor(getbackground()); g.fillrect(0,0,getwidth(),getheight()); g.drawimage(getsprite("potworek.gif"), pozx, pozy,this); dodatkowo pozbawimy użytkownika zmniejszania wielkości okna dopisując na końcu konstruktora: okno.setresizable(false); Gdy uruchomimy projekt okaże się, że znów jest nie tak. Potworek rusza się tak szybko, że trudno go zauważyć. Nieuniknione jest to, aby zapewnić mu pewne opóźnienie. Zmienia się więc troche nasz wcześniejszy scenariusz: 1. Odświeżenie stanu świata tutaj odbywają się ruchy potworów, akcje gracza, 2. Odświeżenie ekranu tutaj odbywa się przeniesienie pierwszego na ekran 3. Czekaj trochę. 4. GOTO 1. Opóźnienie będzie kolejnym atrybutem:... public class WojnaSwiatow extends Canvas{ public static final int SZEROKOSC = 800; public static final int WYSOKOSC = 600; public static final int SZYBKOSC = 60; public HashMap sprites; public int pozx,pozy; Użyjemy go w głównej pętli gry: public void game() { while (isvisible()) { updateworld(); paint(getgraphics()); try { Thread.sleep(SZYBKOSC); catch (InterruptedException e) { No to coś już widać. OK. Pora na to by nasz potworek ruszał się w bardziej rozsądny sposób dokładniej, horyzontalnie odbijając się od brzegów ekranu. W tym celu wprowadzimy szybkość do atrybutów. public int pozx,pozy,vx; Nadać mu odpowiednią wartość w konstruktorze:... public WojnaSwiatow() { pozx=szerokosc/2; pozy=wysokosc/2; vx=2; No i wpiszemy odpowiedni ruch: public void updateworld() { pozx += vx; if (pozx < 0 pozx > SZEROKOSC) vx = -vx; Po uruchomieniu, przyjemność animacji zakłóci nam jeden aspekt. Paskudne migotanie. Dlaczego tak się dzieje? Dlatego że nasze oko widzi ekran na chwilę przed narysowaniem aktora, dlatego animacja nie jest spójna. Rozwiązaniem tego

7 problemu jest tzw. podwójne buforowanie. Cała sztuczka, to przechowywanie w pamięci obrazu o tych samych rozmiarach co okno, nanoszenie tam zmian i dopiero potem rysowanie całości na ekran. Brzmi trochę strasznie, ale jest na tyle popularne, że JDK od wersji 1.4 ma wbudowane instrumenty do realizacji tego pomysłu. Klasa odpowiadająca za to wszystko to BufferStrategy. Urzywanie jej jest bardzo proste: 1. Na początku musimy zdecydować, które okno lub komponent będziemy buforować. Tutaj trzeba wybrać oczywiście ten, na którym będziemy rysować, w tym przypadku oczywiście klasę WojnaSwiatow 2. wywołujemy metodę createbufferstrategy(n), gdzie przekazujemy ilość buforów mających być utworzonych. Nie wszystkie jednak systemy pozwalają na stworzenie więcej niż 2 buforów 3. Używamy metody getbufferstrategy(), aby uzyskać instancję BudderStrategy 4. Aby malować na obrazku poza ekranem, używamy metody getdrawgraphics() 5. Aby odslonić ukryty bufor używamy metody show(); Na wstepie zaować musimy: java.awt.image.bufferstrategy; Dodajemy atrybut klasy: public BufferStrategy strategia; Na końcu kostruktora dopisujemy: createbufferstrategy(2); strategia = getbufferstrategy(); requestfocus(); podmieniamy metodę paint() na: public void paintworld() { Graphics g = strategia.getdrawgraphics(); g.setcolor(color.black); g.fillrect(0,0,getwidth(),getheight()); g.drawimage(getsprite("potworek.gif"), pozx, pozy,this); strategia.show(); No i oczywiście zmieniamy paint na paintworld() w game(). FPS Tworząc szatę graficzną gry powinno się jak najszybciej stworzyć licznik FPS (ang. Frame per second klatki na sekundę). Dlaczego jest to takie ważne? Często tworząc gry chce się dokładać coraz nowe i nowe rzeczy. Jednakże wszystko, czy to rysowanie, czy to liczenie wg skomplikowanego algorytmu ruchów przeciwników, potrzebuje czasu. Natomiast animacja, aby zachowała płynność musi mieć odpowiednią ilość klatek na sekundę. Oczywiście nie ma różnicy między 1700 FPS a 120 FPS. Dlaczego? Dlatego, że monitor tak często ich nie odświeży. Obecnie, monitory pracują z częstotliwościa 100 Hz, co oznacza, że większa liczba klatek będzie niezauważalna. Licznik FPS jest ważnym doradcą. Widząc przy konturowym nakreśleniu stworów, ze spada do 70 klatek, wiemy, że nałożenie tekstur spowoduje spowolnienie poniżej płynności. Obliczenia wymagać będą nowego atrybutu:... public class WojnaSwiatow extends Canvas{ public static final int SZEROKOSC = 800; public static final int WYSOKOSC = 600; public static final int SZYBKOSC = 10; public long usedtime; public HashMap sprites; public int pozx,pozy,vx; public BufferStrategy strategia; Licznik trzeba również wyświetlić na ekranie: public void paintworld() {

8 Graphics g = strategia.getdrawgraphics(); g.setcolor(color.black); g.fillrect(0,0,getwidth(),getheight()); g.drawimage(getsprite("potworek.gif"), pozx, pozy,this); g.setcolor(color.white); if (usedtime > 0) g.drawstring(string.valueof(1000/usedtime)+" fps",5,wysokosc-50); else g.drawstring("--- fps",5,wysokosc-50); strategia.show(); Wreszcie pora obliczyć ten czekany FPS: public void game() { usedtime=1000; while (isvisible()) { long starttime = System.currentTimeMillis(); updateworld(); paintworld(); usedtime = System.currentTimeMillis()-startTime; try { Thread.sleep(SZYBKOSC); catch (InterruptedException e) { Refactoring kodu W tym momencie program niebezpiecznie zaczyna przybierać na wadze, i dodatkowo, staje się nieczytelny. Trzeba coś z tym zrobić. Łatwo domyśleć się jak to zrobimy. Wyodrębnimy samodzielne obiekty, które składają się na nasz kod i podzielimy je na samodzielne pliki. Rzeczą, która najbardziej rzuca się w oczy są Sprite y. Stworzmy więc dla nich handlera, zauważając, że jedyna metoda, która jest potrzebna publicznie, to getsprite( ). SpriteCache.java java.awt.image.bufferedimage; java.net.url; java.util.hashmap; javax.imageio.imageio; public class SpriteCache { public HashMap sprites; public SpriteCache() { sprites = new HashMap(); private BufferedImage loadimage(string sciezka) { URL url=null; try { url = getclass().getclassloader().getresource(sciezka); return ImageIO.read(url); catch (Exception e) { System.out.println("Przy otwieraniu " + sciezka +" jako " + url); System.out.println("Wystapil blad : "+e.getclass().getname()+" "+e.getmessage()); System.exit(0); return null; public BufferedImage getsprite(string sciezka) { BufferedImage img = (BufferedImage)sprites.get(sciezka);

9 if (img == null) { img = loadimage("img/"+sciezka); sprites.put(sciezka,img); return img; Następnie od razu nasuwa mi się pojęcie sceny. Scena koordynuje wszystkim co dzieje się w grze ile jest potworów, ile strzałów, który jest obecny level itd. Ważną jej cechą jest wyłączność na kontakt z SpriteCache. Stage.java java.awt.image.imageobserver; public interface Stage extends ImageObserver { public static final int SZEROKOSC = 800; public static final int WYSOKOSC = 600; public static final int SZYBKOSC = 10; public SpriteCache getspritecache(); Zajmijmy się stworzeniami. Oczywistym jest, że w zamierzamy mieć więcej niż jednego stwora. Wszystkie będą podobne, różnić ich będzie jedynie pozycja i szybkość. Spróbujmy pomyśleć co wspólnego maja potwory, w celu zaprojektowania ich klasy. Oczywiście stworki mają pozycję jak powiedzieliśmy Mają grafikę, która jest pokazywana na ekranie Mają rozmiar, który może być specyficzny dla pojedynczego Muszą też cos czynić czy to walczyć czy też poruszać się po prostu. Klasa musi mieć więc metodę, która będzie im to umożliwiać Ale jeśli pomyślimy trochę bardziej, łatwo dojdziemy do wniosku, że te rzeczy są charakterystyczne nie tylko dla potworków, ale dla wszystkich poruszających się rzeczy na ekranie (kule, gracz, jakieś spadające bonusy). Więc można stworzyć jedną klasę, z której inne będą dziedziczyć. Zwykło się ją nazywać aktorem. Actor.java java.awt.graphics2d; java.awt.image.bufferedimage; public class Actor { protected int x,y; protected int width, height; protected String spritename; protected Stage stage; protected SpriteCache spritecache; public Actor(Stage stage) { this.stage = stage; spritecache = stage.getspritecache(); public void paint(graphics2d g){ g.drawimage( spritecache.getsprite(spritename), x,y, stage ); public int getx() { return x; public void setx(int i) { x = i; public int gety() { return y; public void sety(int i) { y = i; public String getspritename() { return spritename;

10 public void setspritename(string string) { spritename = string; BufferedImage image = spritecache.getsprite(spritename); height = image.getheight(); width = image.getwidth(); public int getheight() { return height; public int getwidth() { return width; public void setheight(int i) {height = i; public void setwidth(int i) { width = i; public void act() { Teraz nie pozostaje nam napisać nic innego jak właściwego potwora. Monster.java public class Monster extends Actor { protected int vx; public Monster(Stage stage) { super(stage); setspritename("potworek.gif"); public void act() { x+=vx; if (x < 0 x > Stage.SZEROKOSC) vx = -vx; public int getvx() { return vx; public void setvx(int i) {vx = i; No to pozostaje nam je rozmnożyć w programie głównym. WojnaSwiatow.java java.awt.canvas; javax.swing.jframe; javax.swing.jpanel; java.awt.color; java.awt.dimension; java.awt.graphics; java.awt.event.windowadapter; java.awt.event.windowevent; java.awt.graphics2d; java.awt.image.bufferstrategy; java.util.arraylist; public class WojnaSwiatow extends Canvas implements Stage{ public long usedtime; public BufferStrategy strategia; private SpriteCache spritecache; private ArrayList actors; public WojnaSwiatow() {

11 spritecache = new SpriteCache(); JFrame okno = new JFrame(".: Wojna Swiatow :."); JPanel panel = (JPanel)okno.getContentPane(); setbounds(0,0,stage.szerokosc,stage.wysokosc); panel.setpreferredsize(new Dimension(Stage.SZEROKOSC,Stage.WYSOKOSC)); panel.setlayout(null); panel.add(this); okno.setbounds(0,0,stage.szerokosc,stage.wysokosc); okno.setvisible(true); okno.addwindowlistener( new WindowAdapter() { public void windowclosing(windowevent e) { System.exit(0); ); okno.setresizable(false); createbufferstrategy(2); strategia = getbufferstrategy(); requestfocus(); public void initworld() { actors = new ArrayList(); for (int i = 0; i < 10; i++){ Monster m = new Monster(this); m.setx( (int)(math.random()*stage.szerokosc) ); m.sety( i*20 ); m.setvx( (int)(math.random()*3)+1 ); actors.add(m); public void paintworld() { Graphics2D g = (Graphics2D)strategia.getDrawGraphics(); g.setcolor(color.black); g.fillrect(0,0,getwidth(),getheight()); for (int i = 0; i < actors.size(); i++) { Actor m = (Actor)actors.get(i); m.paint(g); g.setcolor(color.white); if (usedtime > 0) g.drawstring(string.valueof(1000/usedtime)+" fps",0,stage.wysokosc-50); else g.drawstring("--- fps",0,stage.wysokosc-50); strategia.show(); public void updateworld() { for (int i = 0; i < actors.size(); i++) { Actor m = (Actor)actors.get(i); m.act(); public SpriteCache getspritecache() { return spritecache; public void game() { usedtime=1000; initworld();

12 while (isvisible()) { long starttime = System.currentTimeMillis(); updateworld(); paintworld(); usedtime = System.currentTimeMillis()-startTime; try { Thread.sleep(Stage.SZYBKOSC); catch (InterruptedException e) { public static void main(string[] args) { WojnaSwiatow inv = new WojnaSwiatow(); inv.game(); Widać, że grasuje nam grupka potworków: Rys 4. Rodzinka. Animacja Niezależnie od gatunku gry obiekty 2D podczas poruszania powinny podlegać jakiejś animacji, która niemalże zawsze zależy od klatek. W celu wywołania iluzji ruchu aktor cykluje pomiędzy sekwencją obrazków. Dla uproszczenia w tym przypadku nasz potworek będzie miał tylko 2 klatki animacji. Rys 5. Dwie twarze tego samego zła Nazwijmy je potworek0.gif i potworek1.gif. Zmieńmy więc odpowiednio klasy: W Actor.java dodajemy atrybuty:

13 protected int currentframe; protected String[] spritenames; zmieniamy też konstruktor: public Actor(Stage stage) { this.stage = stage; spritecache = stage.getspritecache(); currentframe = 0; setspritename() zastępujemy: public void setspritenames(string[] names) { spritenames = names; height = 0; width = 0; for (int i = 0; i < names.length; i++ ) { BufferedImage image = spritecache.getsprite(spritenames[i]); height = Math.max(height,image.getHeight()); width = Math.max(width,image.getWidth()); Poprawiamy też metodę act (). public void act() { currentframe = (currentframe + 1) % spritenames.length; Pozostaje już tylko nanieść drobne zmiany w: Monster.java public class Monster extends Actor { protected int vx; public Monster(Stage stage) { super(stage); setspritenames( new String[] {"potworek0.gif","potworek1.gif"); public void act() { super.act(); x+=vx; if (x < 0 x > Stage.SZEROKOSC) vx = -vx; public int getvx() { return vx; public void setvx(int i) {vx = i; No coś tam miga. Ale za szybko, żeby zauważyć, teoretycznie można byłoby w stringu mieć 12x potworek0.gif i 12x potworek1.gif tworząc tak jakby 24 klatki. Jednakże jest to brzydkie, niepotrzebnie marnuje pamięć itd... itd Nie lepiej po prostu nie zmieniać obrazka zawsze tylko po kilku obejściach? Ustalmy więc dwa nowe atrybuty w Actor.java: protected int framespeed; protected int t;

14 framespeed to po prostu szybkość zmieniania się klatek. Natomiast t to zmienna pomocnicza. Zainicjujmy je w konstruktorze: public Actor(Stage stage) { this.stage = stage; spritecache = stage.getspritecache(); currentframe = 0; framespeed = 1; t=0; Dodajmy metody do kontroli framespeed: public int getframespeed() {return framespeed; public void setframespeed(int i) {framespeed = i; No i wreszcie zmieńmy metodę act() na trochę inteligentniejszą. public void act() { t++; if (t % framespeed == 0){ t=0; currentframe = (currentframe + 1) % spritenames.length; W Monster.java na koniec konstruktora dajemy setframespeed(25); i uruchomiamy. W zależności od woli dostosowujemy szybkość przerzucania klatek. Gracz No czas zamienić ten projekt w coś co nie jest czystą animacją i swawolą potworów. Pora wprowadzić kogoś kto by trochę te potwory pogonił. Rolą tą ma pełnić gracz. Musimy mu zapewnić: Ruszanie się we wszystkich 8 kierunkach Gracz porusza się tylko gdy klawisz jest wciśnięty Widzimy, że gracz jest podobny do potwora, z wyjątkiem tego, że kontroluje go gracz i porusza się we wszystkich kierunkach. Rys 6. Statek naszego gracza. Tworzymy więc plik dla gracza: Player.java public class Player extends Actor { protected int vx; protected int vy; public Player(Stage stage) { super(stage); setspritenames( new String[] {"nave.gif"); public void act() { super.act(); x+=vx; y+=vy;

15 if (x < 0 x > Stage.SZEROKOSC) vx = -vx; if (y < 0 y > Stage.WYSOKOSC) vy = -vy; public int getvx() { return vx; public void setvx(int i) {vx = i; public int getvy() { return vy; public void setvy(int i) {vy = i; Należy jeszcze zmienić glówną klasę WojnaSwiatow.java. Co prawda gracz jest aktorem jak każdy inny, z oczywistych względów będziemy go traktować troszeczkę bardziej indywidualnie. WojnaSwiatow.java java.awt.canvas; javax.swing.jframe; javax.swing.jpanel; java.awt.color; java.awt.dimension; java.awt.graphics; java.awt.event.windowadapter; java.awt.event.windowevent; java.awt.graphics2d; java.awt.image.bufferstrategy; java.util.arraylist; public class WojnaSwiatow extends Canvas implements Stage{ public long usedtime; public BufferStrategy strategia; private SpriteCache spritecache; private ArrayList actors; private Player player; public WojnaSwiatow() { spritecache = new SpriteCache(); JFrame okno = new JFrame(".: Wojna Swiatow :."); JPanel panel = (JPanel)okno.getContentPane(); setbounds(0,0,stage.szerokosc,stage.wysokosc); panel.setpreferredsize(new Dimension(Stage.SZEROKOSC,Stage.WYSOKOSC)); panel.setlayout(null); panel.add(this); okno.setbounds(0,0,stage.szerokosc,stage.wysokosc); okno.setvisible(true); okno.addwindowlistener( new WindowAdapter() { public void windowclosing(windowevent e) { System.exit(0); ); okno.setresizable(false); createbufferstrategy(2); strategia = getbufferstrategy(); requestfocus(); public void initworld() { actors = new ArrayList(); for (int i = 0; i < 10; i++){

16 Monster m = new Monster(this); m.setx( (int)(math.random()*stage.szerokosc) ); m.sety( i*20 ); m.setvx( (int)(math.random()*3)+1 ); actors.add(m); player = new Player(this); player.setx(stage.szerokosc/2); player.sety(stage.wysokosc - 2*player.getHeight()); player.setvx(5); public void paintworld() { Graphics2D g = (Graphics2D)strategia.getDrawGraphics(); g.setcolor(color.black); g.fillrect(0,0,getwidth(),getheight()); for (int i = 0; i < actors.size(); i++) { Actor m = (Actor)actors.get(i); m.paint(g); player.paint(g); g.setcolor(color.white); if (usedtime > 0) g.drawstring(string.valueof(1000/usedtime)+" fps",0,stage.wysokosc-50); else g.drawstring("--- fps",0,stage.wysokosc-50); strategia.show(); public void updateworld() { for (int i = 0; i < actors.size(); i++) { Actor m = (Actor)actors.get(i); m.act(); player.act(); public SpriteCache getspritecache() { return spritecache; public void game() { usedtime=1000; initworld(); while (isvisible()) { long starttime = System.currentTimeMillis(); updateworld(); paintworld(); usedtime = System.currentTimeMillis()-startTime; try { Thread.sleep(20); catch (InterruptedException e) { public static void main(string[] args) { WojnaSwiatow inv = new WojnaSwiatow(); inv.game();

17 Rys 7. Do gry wchodzi gracz No wspaniale, przydałoby nadać graczowi w końcu kontrolę nad statkiem. Używać będziemy do tego klawiszy kursorów, w sposób trywialny, naciśnięcie klawisza lewo spowoduje poruszanie się w lewo. Jeśli naciśniemy klawisze lewo i góra to będzie się poruszać w obu tych kierunkach. Co prawda można by załatwić interpretację naciskania klawiszy w głównym pliku jest to dość nieeleganckie i nawet kłopotliwe przy rozbudowie projektu. Scenariusz obsługi zdarzenia naciśnięcia klawisza będzie następujący: 1. WojnaSwiatow otrzymuje zdarzenia klawiatury 2. Sprawdza czy to nie klawisze specjalne dopowiadające np. za Pauze, Restart, Wyjscie, coprawda nie mamy ich zaimplementowanych, ale może kiedyś. Dopiero po tym oddaje to klasie gracza 3. Klasa gracza radzi sobie z interpretacja Nic więc prostszego, jak to zrobić po prostu. W pliku WojnaSwiatow.java klasę utworzymy słuchaczem przycisków : java.awt.event.keylistener; java.awt.event.keyevent; public class WojnaSwiatow extends Canvas implements Stage, KeyListener{ na końcu kontruktora, musimy go zainicjować: public WojnaSwiatow() { spritecache = new SpriteCache(); JFrame okno = new JFrame(".: Wojna Swiatow :."); JPanel panel = (JPanel)okno.getContentPane(); setbounds(0,0,stage.szerokosc,stage.wysokosc); panel.setpreferredsize(new Dimension(Stage.SZEROKOSC,Stage.WYSOKOSC)); panel.setlayout(null); panel.add(this); okno.setbounds(0,0,stage.szerokosc,stage.wysokosc); okno.setvisible(true); okno.addwindowlistener( new WindowAdapter() { public void windowclosing(windowevent e) { System.exit(0); ); okno.setresizable(false); createbufferstrategy(2); strategia = getbufferstrategy(); requestfocus(); addkeylistener(this);

18 W końcu dodajemy metody: public void keypressed(keyevent e) { player.keypressed(e); public void keyreleased(keyevent e) { player.keyreleased(e); public void keytyped(keyevent e) { I usuwamy linijkę z initworld() player.setvx(5); bo nie chcemy już bazowej prędkości. Najwięcej zmian nastąpi w Player.java oczywiście: Player.java java.awt.event.keyevent; public class Player extends Actor { protected static final int PLAYER_SPEED = 4; protected int vx; protected int vy; private boolean up,down,left,right; public Player(Stage stage) { super(stage); setspritenames( new String[] {"nave.gif"); public void act() { super.act(); x+=vx; y+=vy; if (x < 0 x > Stage.SZEROKOSC) vx = -vx; if (y < 0 y > Stage.WYSOKOSC) vy = -vy; public int getvx() { return vx; public void setvx(int i) {vx = i; public int getvy() { return vy; public void setvy(int i) {vy = i; protected void updatespeed() { vx=0;vy=0; if (down) vy = PLAYER_SPEED; if (up) vy = -PLAYER_SPEED; if (left) vx = -PLAYER_SPEED; if (right) vx = PLAYER_SPEED; public void keyreleased(keyevent e) { switch (e.getkeycode()) { case KeyEvent.VK_DOWN : down = false; break; case KeyEvent.VK_UP : up = false; break; case KeyEvent.VK_LEFT : left = false; break; case KeyEvent.VK_RIGHT : right = false; break; updatespeed();

19 public void keypressed(keyevent e) { switch (e.getkeycode()) { case KeyEvent.VK_UP : up = true; break; case KeyEvent.VK_LEFT : left = true; break; case KeyEvent.VK_RIGHT : right = true; break; case KeyEvent.VK_DOWN : down = true;break; updatespeed(); Zauważmy, że stała PLAYER_SPEED mówi jasno, że kursory nie zmieniają prędkości, a jedynie kierunek statku. Strzelanie Pora wprowadzić do gry trochę przemocy. Statek naszego gracza będzie w stanie strzelać promieniami lasera. Na razie zajmiemy się jedynie ich lotem, tworzeniem i usuwaniem. Niszczeniem potworów zajmiemy się potem. Jasno więc możemy stwierdzić co na razie musi robić nasza kula : 1. Wystrzelone pojawiają się tuż nad statkiem 2. Poruszają się ciągle naprzód ze stała prędkością 3. Jest limit kul na ekranie Jak widać, z punktu widzenia gry kule to po prostu aktorzy. Nową rzeczą jest to, że pojawiają się i znikają. Dodatkowo nie zależą od głównej pętli, gdyż nie ma ona wpływu na to, kiedy gracz wystrzeli. Jakby tego było mało to klasa Player a nie WojnySwiatow interpretuje naciśniecie, a to przecież ona trzyma listę aktorów Jak temu zaradzić? Z pomocą przychodzi Stage: Stage.java java.awt.image.imageobserver; public interface Stage extends ImageObserver { public static final int SZEROKOSC = 800; public static final int WYSOKOSC = 600; public static final int SZYBKOSC = 20; public SpriteCache getspritecache(); public void addactor(actor a); Zyskała ona umiejętność tworzenia aktora. Usuwanie jednak nie jest już tak łatwe. Gdyby Stage mogła kasować wystąpił by problem adekwatny do Race Condition. Wyobraźmy sobie, że Stage chce usunąć obiekt a w tym samym momencie główna pętla chce na nim pracować katastrofa. Można co prawda zakładać jakiś semafor czy inne zabezpieczenia na listę, ale to dodatkowy ciężar, a my dążymy do jak największej efektywności gry. Lepszym rozwiązaniem jest dodatnie dodatkowego pola dla aktora, który jest zgłoszeniem aktora do usunięcia z listy, i normalna pętla gry jak takowy napotka, to wtedy usunie. Zmodyfikujmy więc Actor.java dodając dodatkowe pole oraz metody: protected boolean markedforremoval; public void remove() { markedforremoval = true; public boolean ismarkedforremoval() { return markedforremoval; Teraz wystarczy dodać dodatkową metodę i zmodyfikować pętlę w WojnaSwiatow.java:

20 public void addactor(actor a) { actors.add(a); public void updateworld() { int i = 0; while (i < actors.size()) { Actor m = (Actor)actors.get(i); if (m.ismarkedforremoval()) { actors.remove(i); else { m.act(); i++; player.act(); Rys 8. Nasz straszny laser Spokojnie możemy stworzyć klasę kuli: Bullet.java public class Bullet extends Actor { protected static final int BULLET_SPEED=10; public Bullet(Stage stage) { super(stage); setspritenames( new String[] {"bullet.gif"); public void act() { super.act(); y-=bullet_speed; if (y < 0) remove(); Pozostaje nam tylko związać z klawiszem spacji wystrzał kuli. Modyfikujemy więc Player.java public void fire() { Bullet b = new Bullet(stage); b.setx(x); b.sety(y - b.getheight()); stage.addactor(b); public void keypressed(keyevent e) { switch (e.getkeycode()) { case KeyEvent.VK_UP : up = true; break; case KeyEvent.VK_LEFT : left = true; break; case KeyEvent.VK_RIGHT : right = true; break; case KeyEvent.VK_DOWN : down = true;break; case KeyEvent.VK_SPACE : fire(); break; updatespeed();

21 Efekt jest ciekawy: Rys 9. Jakieś one kuloodporne Bomby W celu zróżnicowania uzbrojenia, dajmy graczowi dodatkowy zasób. Bomby będą jakby falą uderzeniową złożoną z 8 kul ognia poruszających się we wszystkich kierunkach, i powiedzmy, że ma ich ograniczoną ilość powiedzmy 5. Zasada oczywiście jest podobna, i dzięki programowaniu obiektowemu jest to niemal trywialne Rys 10. Tak docelowo ma wygalać efekt. Bomb.java public class Bomb extends Actor { public static final int UP_LEFT = 0; public static final int UP = 1; public static final int UP_RIGHT = 2; public static final int LEFT = 3; public static final int RIGHT = 4; public static final int DOWN_LEFT = 5; public static final int DOWN = 6; public static final int DOWN_RIGHT = 7; protected static final int BOMB_SPEED = 5; protected int vx; protected int vy; public Bomb(Stage stage, int heading, int x, int y) { super(stage); this.x = x;

22 this.y = y; String sprite =""; switch (heading) { case UP_LEFT : vx = -BOMB_SPEED; vy = -BOMB_SPEED; sprite="bombul.gif";break; case UP : vx = 0; vy = -BOMB_SPEED; sprite="bombu.gif";break; case UP_RIGHT: vx = BOMB_SPEED; vy = -BOMB_SPEED; sprite="bombur.gif";break; case LEFT : vx = -BOMB_SPEED; vy = 0; sprite = "bombl.gif";break; case RIGHT : vx = BOMB_SPEED; vy = 0; sprite = "bombr.gif";break; case DOWN_LEFT : vx = -BOMB_SPEED; vy = BOMB_SPEED; sprite="bombdl.gif";break; case DOWN : vx = 0; vy = BOMB_SPEED; sprite = "bombd.gif";break; case DOWN_RIGHT : vx = BOMB_SPEED; vy = BOMB_SPEED; sprite = "bombdr.gif";break; setspritenames( new String[] {sprite); public void act() { super.act(); y+=vy; x+=vx; if (y < 0 y > Stage.WYSOKOSC x < 0 x > Stage.SZEROKOSC) remove(); Teraz tylko wystarczy związać ładunek z klawiszem B dodając w Player.java: public void firecluster() { if (clusterbombs == 0) return; clusterbombs--; stage.addactor( new Bomb(stage, Bomb.UP_LEFT, x,y)); stage.addactor( new Bomb(stage, Bomb.UP,x,y)); stage.addactor( new Bomb(stage, Bomb.UP_RIGHT,x,y)); stage.addactor( new Bomb(stage, Bomb.LEFT,x,y)); stage.addactor( new Bomb(stage, Bomb.RIGHT,x,y)); stage.addactor( new Bomb(stage, Bomb.DOWN_LEFT,x,y)); stage.addactor( new Bomb(stage, Bomb.DOWN,x,y)); stage.addactor( new Bomb(stage, Bomb.DOWN_RIGHT,x,y)); public void keypressed(keyevent e) { switch (e.getkeycode()) { case KeyEvent.VK_UP : up = true; break; case KeyEvent.VK_LEFT : left = true; break; case KeyEvent.VK_RIGHT : right = true; break; case KeyEvent.VK_DOWN : down = true;break; case KeyEvent.VK_SPACE : fire(); break; case KeyEvent.VK_B : firecluster(); break; updatespeed(); Efekt zaczyna być imponujący:

23 Rys 11. Ka-Bum! Wykrycie kolizji Koniec z tym, że strzelimy do przezroczystych potworów. Czas je wytępić. Rys 12. Standardowe porównianie w grafice 2D przez nachodzenie prostokątów. Całe szczęście wszystkie klasy shape, w tym rectangle, posiadają metodę intersects ( ), która sprawdza przecinanie. Wystarczy więc aby aktorzy zwracali swoje brzegi. Dodatkowo, aktor powinien mieć jakaś metodę do reagowania na kolizję. Dodajemy więc do Actor.java public Rectangle getbounds() { return new Rectangle(x,y,width,height); public void collision(actor a){ załączmy jeszcze Actor.java, oraz do WojnaSwiatow.java java.awt.rectangle; Nadpisujemy metodę w Monster.java public void collision(actor a) { if (a instanceof Bullet a instanceof Bomb) remove(); Pozostaje teraz stwierdzić samą kolizję. Oczywiście robimy to w klasie, która trzyma całą listę czyli WojnaSwiatow.java Dodajmy więc odpowiednia metodę oraz zmieniamy pętlę główną: public void checkcollisions() { Rectangle playerbounds = player.getbounds(); for (int i = 0; i < actors.size(); i++) { Actor a1 = (Actor)actors.get(i);

24 Rectangle r1 = a1.getbounds(); if (r1.intersects(playerbounds)) { player.collision(a1); a1.collision(player); for (int j = i+1; j < actors.size(); j++) { Actor a2 = (Actor)actors.get(j); Rectangle r2 = a2.getbounds(); if (r1.intersects(r2)) { a1.collision(a2); a2.collision(a1); public void game() { usedtime=1000; initworld(); while (isvisible()) { long starttime = System.currentTimeMillis(); updateworld(); checkcollisions(); paintworld(); usedtime = System.currentTimeMillis()-startTime; try { Thread.sleep(20); catch (InterruptedException e) { Statystyki Warto byłoby mieć w końcu statystyki, ilość ubitych potworów, ilość bomb, ilość tarczy. No i żeby było to wyświetlane na ekranie. Chcemy wyswietlac: Punkty jakie uzyskał gracz Życie gracza Ilość Bomb, która pozostała W tym celu dokonamy paru zmian. Dodatkowo podzielimy okno gry na pole gry, i na pole statystyk.. Powiedzmy, że 500 pikseli będzie zajmowała gra, a pod nią, 100 statystyki. Twoim zadaniem jest potem dobrać te liczby trochę lepiej, tak, aby bardziej estetycznie to wyglądało. Tymczasem dodajmy nową stałą do naszego interfacu Stage: public static final int WYSOKOSC_GRY = 500; Następnie dodajmy nowe atrybuty w klasie Player: public static final int MAX_SHIELDS = 200; public static final int MAX_BOMBS = 5; private int score; private int shields; na koniec konstruktora tej klasy dodajemy: clusterbombs=max_bombs; shields = MAX_SHIELDS; zmienić trzeba będzie również tej klasie metodę klas ( potworom nie potrzeba bo poruszają się jedynie w poziomie, kule jedynie do przodu, można zmienić poruszanie się bomb, to pozostawiam również tobie w ramach ćwiczeń) public void act() { super.act();

25 x+=vx; y+=vy; if (x < 0 ) x = 0; if (x > Stage.SZEROKOSC - getwidth()) x = Stage.SZEROKOSC - getwidth(); if (y < 0 ) y = 0; if ( y > Stage.WYSOKOSC_GRY-getHeight()) y = Stage.WYSOKOSC_GRY - getheight(); Dodajmy jeszcze typowe metody do zmiany i odczytu danych z klasy: public int getscore() { return score; public void setscore(int i) { score = i; public int getshields() { return shields; public void setshields(int i) { shields = i; public int getclusterbombs() { return clusterbombs; public void setclusterbombs(int i) { clusterbombs = i; Teraz zajmijmy się rysowaniem tego wszystkiego na ekranie. Na wstępie w pliku WojnaSwiatow.java zaujmy odpowiednie klasy: java.awt.font; java.awt.image.bufferedimage; Dodajmy nowe metody graficzne: public void paintshields(graphics2d g) { g.setpaint(color.red); g.fillrect(280,stage.wysokosc_gry,player.max_shields,30); g.setpaint(color.blue); g.fillrect(280+player.max_shieldsplayer.getshields(),stage.wysokosc_gry,player.getshields(),30); g.setfont(new Font("Arial",Font.BOLD,20)); g.setpaint(color.green); g.drawstring("shields",170,stage.wysokosc_gry+20); public void paintscore(graphics2d g) { g.setfont(new Font("Arial",Font.BOLD,20)); g.setpaint(color.green); g.drawstring("score:",20,stage.wysokosc_gry + 20); g.setpaint(color.red); g.drawstring(player.getscore()+"",100,stage.wysokosc_gry + 20); public void paintammo(graphics2d g) { int xbase = 280+Player.MAX_SHIELDS+10; for (int i = 0; i < player.getclusterbombs();i++) { BufferedImage bomb = spritecache.getsprite("bombul.gif"); g.drawimage( bomb,xbase+i*bomb.getwidth(),stage.wysokosc_gry,this); public void paintfps(graphics2d g) { g.setfont( new Font("Arial",Font.BOLD,12)); g.setcolor(color.white); if (usedtime > 0)

26 g.drawstring(string.valueof(1000/usedtime)+" fps",stage.szerokosc- 50,Stage.WYSOKOSC_GRY); else g.drawstring("--- fps",stage.width-50,stage.wysokosc_gry); public void paintstatus(graphics2d g) { paintscore(g); paintshields(g); paintammo(g); paintfps(g); No i zmieńmy rysowanie świata: public void paintworld() { Graphics2D g = (Graphics2D)strategia.getDrawGraphics(); g.setcolor(color.black); g.fillrect(0,0,getwidth(),getheight()); for (int i = 0; i < actors.size(); i++) { Actor m = (Actor)actors.get(i); m.paint(g); player.paint(g); paintstatus(g); strategia.show(); Wynik będzie zbliżony do: Rys 13. To powoli zaczyna przypominać grę No dobrze, ale przydałoby się zliczać te punkty skoro już je wypisujemy. Chcemy aby powiedzmy, przy zabiciu potwora, dodatkowo dodawane było 20 punktów. Jednakże o zabiciu potwora wie klasa Monster, która nie ma dostępu do atrybutów gracza. Może również zaistnieć wiele sytuacji, w których trzeba będzie mieć dostęp do atrybutów gracza: zmiana osłony, dodanie bomb, dodanie bonusów. Potrzebujemy więc możliwości używania metod gracza, a do tego, potrzebujemy mieć referencję na samego gracza. W tym celu dodamy jako metodę w Stage.java : public Player getplayer(); Zimplementujmy ją w WojnaSwiatow.java public Player getplayer() { return player;

27 Dodajmy graczowi możliwość zwiększania wyniku w player.java: public void addscore(int i) { score += i; No i wreszcie zmodyfikujmy kolizję w potworze: public void collision(actor a) { if (a instanceof Bullet a instanceof Bomb){ remove(); stage.getplayer().addscore(20); Śmierć No na razie nasz gracz jest nieśmiertelnym wojownikiem zabijającym 10 bezbronnych potworów. Taka gra nie przyciągnie tłumów. Trzeba dodać ryzyko śmierci gracza. Na razie zróbmy to w momencie kolizji z potworem. Oczywiście śmierć gracza oznaczać będzie koniec gry (lub stracenia życia, jeśli dasz graczowi więcej niż jedno. Wtedy grę kończyć będzie stracenie ostatniego z żyć, my na razie zostańmy przy jednym życiu). Co chcemy więc uzyskać Przy zderzeniu z potworem gracz ma tracić życie, powiedzmy że zabija tym potwora i zyskuje więcej punktów. Gdy życie gracza się kończy gra zostaje przerwana i zostanie wyświetlony napis Game Over Na wstępie dodajmy możliwość kończenia gry do Stage.java public void gameover(); zaimplementujmy ją w WojnaSwiatow.java public void gameover() { gameended = true; i dodajmy do WojnaSwiatow.java odpowiedni atrybut: private boolean gameended=false; Musimy oczywiście zmienić warunek pętli głównej programu.: public void game() { usedtime=1000; initworld(); while (isvisible() &&!gameended) { long starttime = System.currentTimeMillis(); updateworld(); checkcollisions(); paintworld(); usedtime = System.currentTimeMillis()-startTime; try { Thread.sleep(20); catch (InterruptedException e) { paintgameover(); no i stworzyć metodę wyświetlającą napis: public void paintgameover() { Graphics2D g = (Graphics2D)strategia.getDrawGraphics(); g.setcolor(color.white); g.setfont(new Font("Arial",Font.BOLD,20)); g.drawstring("game OVER",Stage.SZEROKOSC/2-50,Stage.WYSOKOSC/2); strategia.show();

28 Dodajmy teraz wykrycie kolizji w player.java public void collision(actor a) { if (a instanceof Monster ) { a.remove(); addscore(40); addshields(-40); if (getshields() < 0) stage.gameover(); Na razie śmierć można uzyskać jedynie szarżując na potory: Rys 14. Aaaaa!!! Gra jest jednak ciągle zbyt łatwa, a zginąć w ten sposób może jedynie bardzo niedoświadczony (lub ograniczony) gracz. Dodajmy więc potworom trochę agresji. Niechaj strzelają jakimś magicznym laserem. Dodatkowo, skorzystamy znów z animacji, żeby uzyskać ciekawy efekt owego wystrzału. Przystąpmy więc do stworzenia nowej klasy, z owym laserem właśnie. Rys 15. Kolejne gify: disparo0.gif, disparo1.gif oraz disparo2.gif stworzą animację laseru Laser.java public class Laser extends Actor { protected static final int BULLET_SPEED=3; public Laser(Stage stage) { super(stage); setspritenames( new String[] {"disparo0.gif","disparo1.gif","disparo2.gif"); setframespeed(10); public void act() { super.act(); y+=bullet_speed; if (y > Stage.WYSOKOSC_GRY) remove();

29 widać, że jest ona podobna do klasy bullet, różni się jednak szybkością I kierunkiem poruszania się oraz animacją. Nauczymy więc teraz potwory strzelać. Najpierw dodajmy stałą częstotliwości strzelania: protected static final double FIRING_FREQUENCY = 0.01; następnie zmieńmy metodę act(): public void fire() { Laser m = new Laser(stage); m.setx(x+getwidth()/2); m.sety(y + getheight()); stage.addactor(m); public void act() { super.act(); x+=vx; if (x < 0 x > Stage.SZEROKOSC) vx = -vx; if (Math.random()<FIRING_FREQUENCY) fire(); No i zmodyfikujmy kolizję gracza: public void collision(actor a) { if (a instanceof Monster ) { a.remove(); addscore(40); addshields(-40); if (a instanceof Laser ) { a.remove(); addshields(-10); if (getshields() < 0) stage.gameover(); Efekt jest imponujący, nareszcie coś się dzieje: Rys 16. Unikamy i strzelamy, taka gra.

30 Przewijające się tło Wiele gier w tym stylu ma poruszające się tło. Jest to efektywny, aczkolwiek bardzo łatwy do uzyskania w javie efekt. Wystarczy zamiast jednym kolorem, wypełniać bitmapą. Zmieniając po prostu jej bazowe koordynatach. Dla zrozumienia tego zagadnienia spojrzmy na rysunki: Rys. 17 załóżmy że uzywalibyśmy takiego tła. Rys 18. Tak jeśli wypełnimy teksturą o wspołżędnych (0,0,256,256)

31 Rys 19 Tak natomiast gdy podamy współrzędne tekstury(0,20,256,256) Efekt to przesunięcie teksturowania o 20 pikseli. W naszej grze będziemy chcieli uzyskać łagodniejszy efekt przejścia więc będziemy używać przesunięcia o 1 piksel. Użyjemy oczywiście ciekawszego i bardziej adekwatnego tła: oceano.gif Jedyny plik jaki modyfikujemy to plik główny programu Rys 20. Piękna powierzchnia oceanu to dobre pole bitwy

32 WojnaSwiatow.java java.awt.canvas; java.awt.image.bufferedimage; java.awt.font; java.awt.texturepaint; java.awt.rectangle; javax.swing.jframe; javax.swing.jpanel; java.awt.color; java.awt.dimension; java.awt.graphics; java.awt.event.windowadapter; java.awt.event.windowevent; java.awt.graphics2d; java.awt.image.bufferstrategy; java.util.arraylist; java.awt.event.keyevent; java.awt.event.keylistener; public class WojnaSwiatow extends Canvas implements Stage, KeyListener{ public long usedtime; public BufferStrategy strategia; private SpriteCache spritecache; private ArrayList actors; private Player player;s private boolean gameended=false; private BufferedImage ocean; private int t; public void paintworld() { Graphics2D g = (Graphics2D)strategia.getDrawGraphics(); ocean = spritecache.getsprite("oceano.gif"); g.setpaint(new TexturePaint(ocean, new Rectangle(0,t,ocean.getWidth(),ocean.getHeight()))); g.fillrect(0,0,getwidth(),getheight()); for (int i = 0; i < actors.size(); i++) { Actor m = (Actor)actors.get(i); m.paint(g); player.paint(g); paintstatus(g); strategia.show(); public void game() { usedtime=1000; t = 0; initworld(); while (isvisible() &&!gameended) { t++; long starttime = System.currentTimeMillis(); updateworld(); checkcollisions(); paintworld(); usedtime = System.currentTimeMillis()-startTime; try {

33 Thread.sleep(20); catch (InterruptedException e) { paintgameover(); Kilka linijek kodu zapewniło nam co najmniej ciekawy efekt: Rys 21. Gra zaczyna wyglądać profesjonalnie Odradzanie się potworów Po zabiciu naszych potworów gra przestaje posiadac jakikolwiek sens. Możemy to rozwiązać przez: Tworzenie nowych potworów gdy jakiś ginie Zmienić poziom na kolejny z nowymi potworkami i tłem Nowy potworek pojawiałby się co jakiś czas, niezależnie od ilości zabitych potorów Spróbujmy uczynić pierwszy wariant. Wystarczy zmodyfikować plik Monster.java: public void spawn() { Monster m = new Monster(stage); m.setx( (int)(math.random()*stage.szerokosc) ); m.sety( (int)(math.random()*stage.wysokosc_gry/2) ); m.setvx( (int)(math.random()*20-10)+1); stage.addactor(m); public void collision(actor a) { if (a instanceof Bullet a instanceof Bomb){ remove(); spawn(); stage.getplayer().addscore(20); Proste dźwięki Dodanie dźwięku i muzyki do naszej gry jest bardzo proste, tworzy jednak znakomity efekt. Większość producentów gier przykłada więcej starań do tworzenia grafiki i muzyki, niż do samego programowania, co owocuje potem wspaniałymi efektami, ale fatalną grywalnością... Użyjmy prostych plików.wav : musica.wav do muzyki powtarzającej się w tle photon.wav jako dźwięku wystrzeliwania laseru przez potwory

34 explosion.wav jako dźwięku odgrywanego przy śmierci potwora missile.wav jako dźwięku wystrzelenia rakiety przez gracza Dźwięki to nic innego jak zasoby, i tak samo jak obrazki potrzebują swój cache. Widzimy więc, że przyda się ogólna klasa ResourceCache: ResourceCache.java java.net.url; java.util.hashmap; public abstract class ResourceCache { protected HashMap resources; public ResourceCache() { resources = new HashMap(); protected Object loadresource(string name) { URL url=null; url = getclass().getclassloader().getresource(name); return loadresource(url); protected Object getresource(string name) { Object res = resources.get(name); if (res == null) { res = loadresource(name); resources.put(name,res); return res; protected abstract Object loadresource(url url); Musimy więc trochę zmienić SpriteCache: SpriteCache.java java.awt.image.bufferedimage; java.net.url; javax.imageio.imageio; public class SpriteCache extends ResourceCache{ protected Object loadresource(url url) { try { return ImageIO.read(url); catch (Exception e) { System.out.println("Przy otwieraniu " + url); System.out.println("Wystapil blad : "+e.getclass().getname()+" "+e.getmessage()); System.exit(0); return null; public BufferedImage getsprite(string name) { return (BufferedImage)getResource("img/"+name);

35 no i stworzyć wkońcu: SoundCache.java java.applet.applet; java.applet.audioclip; java.net.url; public class SoundCache extends ResourceCache{ protected Object loadresource(url url) { return Applet.newAudioClip(url); public AudioClip getaudioclip(string name) { return (AudioClip)getResource("sound/"+name); public void playsound(final String name) { getaudioclip(name).play(); public void loopsound(final String name) { getaudioclip(name).loop(); Oczywiście zakładam, że pliki z muzyką będziemy trzymać w katalogu /sound. Ponieważ każda klasa powinna mieć dostęp do cache u muzyki, trzeba zmodyfikowac stage.java: java.awt.image.imageobserver; public interface Stage extends ImageObserver { public static final int SZEROKOSC = 800; public static final int WYSOKOSC = 600; public static final int SZYBKOSC = 20; public static final int WYSOKOSC_GRY = 500; public SpriteCache getspritecache(); public void addactor(actor a); public Player getplayer(); public SoundCache getsoundcache(); public void gameover(); Teraz pozostaje nam już tylko dodać dzwięki w odpowiednich miejscach: WojnaSwiatow.java java.awt.canvas; java.awt.image.bufferedimage; java.awt.font; java.awt.texturepaint; java.awt.rectangle; javax.swing.jframe; javax.swing.jpanel; java.awt.color; java.awt.dimension; java.awt.graphics; java.awt.event.windowadapter; java.awt.event.windowevent; java.awt.graphics2d; java.awt.image.bufferstrategy; java.util.arraylist; java.awt.event.keyevent; java.awt.event.keylistener;

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Laboratorium 1. Wstęp do programowania w języku Java. Narzędzia 1. Aby móc tworzyć programy w języku Java, potrzebny jest zestaw narzędzi Java Development Kit, który można ściągnąć

Bardziej szczegółowo

Języki i metody programowania Java Obsługa zdarzeń - przykłady

Języki i metody programowania Java Obsługa zdarzeń - przykłady Języki i metody programowania Java Obsługa zdarzeń - przykłady wg https://docs.oracle.com/javase/tutorial/uiswing/components/ind ex.html Autor Dr inż. Zofia Kruczkiewicz Rodzaje słuchaczy zdarzeń Wydarzenia

Bardziej szczegółowo

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1 Podstawy programowania, Poniedziałek 30.05.2016, 8-10 Projekt, część 1 1. Zadanie Projekt polega na stworzeniu logicznej gry komputerowej działającej w trybie tekstowym o nazwie Minefield. 2. Cele Celem

Bardziej szczegółowo

Kurs programowania. Wykład 6. Wojciech Macyna. 7 kwietnia 2016

Kurs programowania. Wykład 6. Wojciech Macyna. 7 kwietnia 2016 Wykład 6 7 kwietnia 2016 Klasa java.applet.applet Aplety w języku Java Aplety sa specyficznymi programami które moga być wyświetlane w oknach większości przegladarek internetowych. Klasa Applet rozszerza

Bardziej szczegółowo

Musimy do naszej gry załadować materiały. Są to trzy obrazki:

Musimy do naszej gry załadować materiały. Są to trzy obrazki: Nawiedzony Las Zadanie 1: Tworzenie pokoju i potworków Projekt gry Przedstawmy skrótowo projekt naszej gry. Opis. W grze po pokoju chodzą potworki. Zadaniem gracza jest kliknąć na nie myszką wtedy potworki

Bardziej szczegółowo

Język JAVA podstawy. wykład 2, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Język JAVA podstawy. wykład 2, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna Język JAVA podstawy wykład 2, część 2 Jacek Rumiński 1 Język JAVA podstawy Plan wykładu: 1. Rodzaje programów w Javie 2. Tworzenie aplikacji 3. Tworzenie apletów 4. Obsługa archiwów 5. Wyjątki 6. Klasa

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Wykład 2: Wstęp do języka Java 3/4/2013 S.Deniziak: Programowanie obiektowe - Java 1 Cechy języka Java Wszystko jest obiektem Nie ma zmiennych globalnych Nie ma funkcji globalnych

Bardziej szczegółowo

PROJEKTOWANIE ABSTRAKCYJNEJ KLASY FIGURA PRZECHOWUJĄCEJ WSPÓLNE CECHY OBIEKTÓW GRAFICZNYCH

PROJEKTOWANIE ABSTRAKCYJNEJ KLASY FIGURA PRZECHOWUJĄCEJ WSPÓLNE CECHY OBIEKTÓW GRAFICZNYCH Animacja wielowątkowa - gra zręcznościowa. I. UTWORZENIE SZKIELETU APLIKACJI 1. Uruchom środowisko programowania NetBeans. Utwórz aplikację typu Swing tworząc projekt o nazwie Projekt10 2. Dodaj do projektu

Bardziej szczegółowo

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main. Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo

Bardziej szczegółowo

Budowa i generowanie planszy

Budowa i generowanie planszy Gra Saper została napisana w. Jest dostępna w każdej wersji systemu Windows. Polega na odkrywaniu zaminowanej planszy tak, aby nie trafić na minę. Gra działa na bardzo prostej zasadzie i nie wymaga zaawansowanego

Bardziej szczegółowo

Podstawy tworzenia aplikacji z wykorzystaniem języka Java ME ćwiczenia 2

Podstawy tworzenia aplikacji z wykorzystaniem języka Java ME ćwiczenia 2 z wykorzystaniem języka Java ME ćwiczenia 2 Wykorzystanie plików graficznych w MIDlet ach utworzenie obiektu klasy Image (statyczna metoda createimage()) utworzenie obiektu klasy ImageItem dodanie utworzonego

Bardziej szczegółowo

Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com

Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com GUI-Swing Wstęp do tworzenia prostych aplikacji z interfejsem graficznym (GUI) przy pomocy Swing, rysowanie prostych

Bardziej szczegółowo

INSTRUKCJA DO ĆWICZENIA 5

INSTRUKCJA DO ĆWICZENIA 5 INSTRUKCJA DO ĆWICZENIA 5 Kontynuacja tworzenia aplikacje umożliwiających oszacowanie szukanych wartości przez symulację doświadczenia losowego, z ilustracją graficzną jego wyników. Zadanie wykonamy dla

Bardziej szczegółowo

Spis treści. 1 Aplet. 2 Od aplikacji do apletu. 1 Aplet 1. 2 Od aplikacji do apletu 1. 3 Budowa apletu 3. 4 Cykl życia apletu 4

Spis treści. 1 Aplet. 2 Od aplikacji do apletu. 1 Aplet 1. 2 Od aplikacji do apletu 1. 3 Budowa apletu 3. 4 Cykl życia apletu 4 Spis treści 1 Aplet 1 2 Od aplikacji do apletu 1 3 Budowa apletu 3 4 Cykl życia apletu 4 5 Aplet jako aplikacja 5 Temat: Aplety. Celem wykładu jest zdefiniowanie sieciowej aplikacji Java T M, zwanej apletem

Bardziej szczegółowo

Sieciowe Technologie Mobilne. Laboratorium 2

Sieciowe Technologie Mobilne. Laboratorium 2 Sieciowe Technologie Mobilne Laboratorium 2 Tworzenie wieloplatformowych aplikacji mobilnych przy użyciu biblioteki PhoneGap. Łukasz Kamiński Laboratorium 2 Na dzisiejszym laboratorium skupimy się na implementacji

Bardziej szczegółowo

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji. JAVA Java jest wszechstronnym językiem programowania, zorientowanym obiektowo, dostarczającym możliwość uruchamiania apletów oraz samodzielnych aplikacji. Java nie jest typowym kompilatorem. Źródłowy kod

Bardziej szczegółowo

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Konstruktory Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasę Prostokat: class

Bardziej szczegółowo

Unity 2D - prosta gra

Unity 2D - prosta gra www.math.uni.lodz.pl/ radmat Cel ćwiczeń Celem bieżących ćwiczeń jest stworzenie prostej gry 2D. Prosta gra Stworzymy prostą grę, w której będziemy sterować pojazdem kosmicznym i będziemy mogli strzelać

Bardziej szczegółowo

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak Java: otwórz okienko Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU klasy wewnętrzne, lokalne i anonimowe biblioteka AWT zestaw Swing JFrame JPanel komponenty obsługa zdarzeń

Bardziej szczegółowo

JAVA W SUPER EXPRESOWEJ PIGUŁCE

JAVA W SUPER EXPRESOWEJ PIGUŁCE JAVA W SUPER EXPRESOWEJ PIGUŁCE Obiekt Obiekty programowe to zbiór własności i zachowań (zmiennych i metod). Podobnie jak w świecie rzeczywistym obiekty posiadają swój stan i zachowanie. Komunikat Wszystkie

Bardziej szczegółowo

Tworzenie prostych gier w programie GameMaker

Tworzenie prostych gier w programie GameMaker Tworzenie prostych gier w programie GameMaker Grzegorz Madejski Spotkania akademickie - poziom gimnazjum INFORMATYKA 2 lipca 2012 r. Wydział Matematyki, Fizyki i Informatyki Uniwersytet Gdański Innowacyjny

Bardziej szczegółowo

Grafika i komunikacja człowiek komputer Laboratorium. Część 1: Wstęp do grafiki

Grafika i komunikacja człowiek komputer Laboratorium. Część 1: Wstęp do grafiki UNIWERSYTET RZESZOWSKI KATEDRA INFORMATYKI Opracował: mgr inż. Przemysław Pardel, dr hab. Bogdan Kwolek v1.01 2010 Grafika i komunikacja człowiek komputer Laboratorium Część 1: Wstęp do grafiki ZAGADNIENIA

Bardziej szczegółowo

Rozdział 4 KLASY, OBIEKTY, METODY

Rozdział 4 KLASY, OBIEKTY, METODY Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej

Bardziej szczegółowo

Klasy i obiekty cz II

Klasy i obiekty cz II Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Klasy i obiekty cz II Hermetyzacja, mutatory, akcesory, ArrayList Rozwijamy aplikację Chcemy, aby obiekty klasy

Bardziej szczegółowo

Aplikacje w środowisku Java

Aplikacje w środowisku Java Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - wprowadzenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019 Klasa zbiór pól i metod Obiekt

Bardziej szczegółowo

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna Język JAVA podstawy Wykład 3, część 3 1 Język JAVA podstawy Plan wykładu: 1. Konstrukcja kodu programów w Javie 2. Identyfikatory, zmienne 3. Typy danych 4. Operatory, instrukcje sterujące instrukcja warunkowe,

Bardziej szczegółowo

D O K U M E N T A C J A

D O K U M E N T A C J A Państwowa Wyższa Szkoła Zawodowa w Tarnowie Instytut Politechniczny Informatyka Stosowana III r. D O K U M E N T A C J A Snake 3D Piotr Gębiś Paweł Gładysz Dokumentacja do projektu Snake 3D. W dokumencie

Bardziej szczegółowo

INSTRUKCJA DO ĆWICZENIA 13. Animacja wielowątkowa w aplikacjach JME. Gra logistyczna.

INSTRUKCJA DO ĆWICZENIA 13. Animacja wielowątkowa w aplikacjach JME. Gra logistyczna. INSTRUKCJA DO ĆWICZENIA 13. Animacja wielowątkowa w aplikacjach JME. Gra logistyczna. I. UTWORZENIE SZKIELETU APLIKACJI 1. Uruchom środowisko programowania NetBeans. Utwórz aplikację typu JME zakładając

Bardziej szczegółowo

Sieciowe Technologie Mobilne. Laboratorium 4

Sieciowe Technologie Mobilne. Laboratorium 4 Sieciowe Technologie Mobilne Laboratorium 4 Tworzenie wieloplatformowych aplikacji mobilnych przy użyciu biblioteki PhoneGap. Łukasz Kamiński Laboratorium 4 Urozmaicone zostaną animacje potworów, aby odpowiadały

Bardziej szczegółowo

Brain Game. Wstęp. Scratch

Brain Game. Wstęp. Scratch Scratch 2 Brain Game Każdy Klub Kodowania musi być zarejestrowany. Zarejestrowane kluby można zobaczyć na mapie na stronie codeclubworld.org - jeżeli nie ma tam twojego klubu sprawdź na stronie jumpto.cc/18cplpy

Bardziej szczegółowo

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu. Część XIX C++ w Każda poznana do tej pory zmienna może przechowywać jedną liczbę. Jeśli zaczniemy pisać bardziej rozbudowane programy, okaże się to niewystarczające. Warto więc poznać zmienne, które mogą

Bardziej szczegółowo

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run(). Wątki Streszczenie Celem wykładu jest wprowadzenie do obsługi wątków w Javie. Czas wykładu 45 minut. Definiowanie wątków jako klas potomnych Thread Nadpisanie metody run(). class Watek extends Thread public

Bardziej szczegółowo

Ping-Pong. Gra dla dwóch graczy.

Ping-Pong. Gra dla dwóch graczy. Ping-Pong. Gra dla dwóch graczy. Uwaga: Wszystkie pliki graficzne potrzebne do wykonania gry znajdują się w archiwum ping-pong.zip. Pliki należy wypakować do jednego katalogu. Instrukcja 1. Na scenę wczytujemy

Bardziej szczegółowo

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Systemy wirtualnej rzeczywistości. Komponenty i serwisy Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Systemy wirtualnej rzeczywistości Laboratorium Komponenty i serwisy Wstęp: W trzeciej części przedstawione zostaną podstawowe techniki

Bardziej szczegółowo

Informatyka II. Laboratorium Aplikacja okienkowa

Informatyka II. Laboratorium Aplikacja okienkowa Informatyka II Laboratorium Aplikacja okienkowa Założenia Program będzie obliczał obwód oraz pole trójkąta na podstawie podanych zmiennych. Użytkownik będzie poproszony o podanie długości boków trójkąta.

Bardziej szczegółowo

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 3

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 3 Podstawy programowania, Poniedziałek 13.05.2015, 8-10 Projekt, część 3 1. Zadanie Projekt polega na stworzeniu logicznej gry komputerowej działającej w trybie tekstowym o nazwie Minefield. 2. Cele Celem

Bardziej szczegółowo

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object Java: kilka brakujących szczegółów i uniwersalna nadklasa Object Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU Konstrukcja obiektów Niszczenie obiektów i zwalnianie zasobów

Bardziej szczegółowo

Spadające jabłuszka. licencja CC-BY-SA Uznanie autorstwa Na tych samych warunkach 3.0 Polska. Strona 51

Spadające jabłuszka. licencja CC-BY-SA Uznanie autorstwa Na tych samych warunkach 3.0 Polska. Strona 51 Spadające jabłuszka Materiały opracowane przez Ośrodek Edukacji Informatycznej i Zastosowań Komputerów w Warszawie w ramach programu Warszawa Programuje licencja CC-BY-SA Uznanie autorstwa Na tych samych

Bardziej szczegółowo

Tworzenie prezentacji w MS PowerPoint

Tworzenie prezentacji w MS PowerPoint Tworzenie prezentacji w MS PowerPoint Program PowerPoint dostarczany jest w pakiecie Office i daje nam możliwość stworzenia prezentacji oraz uatrakcyjnienia materiału, który chcemy przedstawić. Prezentacje

Bardziej szczegółowo

Zaawansowane aplikacje WWW - laboratorium

Zaawansowane aplikacje WWW - laboratorium Zaawansowane aplikacje WWW - laboratorium Przetwarzanie XML (część 2) Celem ćwiczenia jest przygotowanie aplikacji, która umożliwi odczyt i przetwarzanie pliku z zawartością XML. Aplikacja, napisana w

Bardziej szczegółowo

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy Pojęcie klasy Program napisany w języku Java składa się ze zbioru klas. Każda klasa zawiera

Bardziej szczegółowo

Pong to dwuwymiarowy symulator tenisa sportowego. Gracz, poruszając prostokątem symulującym paletkę, stara się zdobyć punkt poprzez posłanie piłki

Pong to dwuwymiarowy symulator tenisa sportowego. Gracz, poruszając prostokątem symulującym paletkę, stara się zdobyć punkt poprzez posłanie piłki GRA 3: PONG Pong to dwuwymiarowy symulator tenisa sportowego. Gracz, poruszając prostokątem symulującym paletkę, stara się zdobyć punkt poprzez posłanie piłki obok prostokąta drugiego gracza. Była to jedna

Bardziej szczegółowo

Programowanie Multimediów. Programowanie Multimediów JAVA. grafika w JAVA 2D API [1]

Programowanie Multimediów. Programowanie Multimediów JAVA. grafika w JAVA 2D API [1] JAVA grafika w JAVA 2D API [1] Wprowadzenie Java2D API w sposób znaczny rozszerza możliwości graficzne AWT. Po pierwsze umożliwia zarządzanie i rysowanie elementów graficznych o współrzędnych zmiennoprzecinkowych

Bardziej szczegółowo

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016 Wykład 1 3 marca 2016 Słowa kluczowe języka Java abstract, break, case, catch, class, const, continue, default, do, else, enum, extends, final, finally, for, goto, if, implements, import, instanceof, interface,

Bardziej szczegółowo

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h] 1. Typy. Java jest językiem programowania z silnym systemem kontroli typów. To oznacza, że każda zmienna, atrybut czy parametr ma zadeklarowany typ. Kompilator wylicza typy wszystkich wyrażeń w programie

Bardziej szczegółowo

Programowanie w JAVA Lab. 5 - Wątki. 1. Wykorzystując metodę Monte Carlo narysować wykres funkcji oraz obliczyć całkę: 7 x ) xy, 8,8

Programowanie w JAVA Lab. 5 - Wątki. 1. Wykorzystując metodę Monte Carlo narysować wykres funkcji oraz obliczyć całkę: 7 x ) xy, 8,8 Programowanie w JAVA Lab. 5 - Wątki 1. Wykorzystując metodę Monte Carlo narysować wykres funkcji oraz obliczyć całkę: 33 y 3 2 2 x x 3 y 7 x 3 33 7) 2 2 f x, y 1 x 3 1 x 2 1 y 7 x 3 3 33 2 112 y 3 7 x

Bardziej szczegółowo

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1 Współbieżność i równoległość w środowiskach obiektowych Krzysztof Banaś Obliczenia równoległe 1 Java Model współbieżności Javy opiera się na realizacji szeregu omawianych dotychczas elementów: zarządzanie

Bardziej szczegółowo

STWORZENIE PRZYKŁADOWEJ

STWORZENIE PRZYKŁADOWEJ LABORATORIUM SYSTEMÓW MOBILNYCH STWORZENIE PRZYKŁADOWEJ APLIKACJI MOBILNEJ W J2ME I. Temat ćwiczenia II. Wymagania Wykonanie poprzedniego ćwiczenia III. Ćwiczenie 1. Stworzenie aplikacji Celem ćwiczenia

Bardziej szczegółowo

Programowanie obiektowe i zdarzeniowe

Programowanie obiektowe i zdarzeniowe Marek Tabędzki Programowanie obiektowe i zdarzeniowe 1/23 Programowanie obiektowe i zdarzeniowe wykład 6 polimorfizm Na poprzednim wykładzie: dziedziczenie jest sposobem na utworzenie nowej klasy na podstawie

Bardziej szczegółowo

1 Atrybuty i metody klasowe

1 Atrybuty i metody klasowe 1 Atrybuty i metody klasowe Składowe klasowe (statyczne) Każdy obiekt klasy posiada własny zestaw atrybutów. Metody używają atrybutów odpowiedniego obiektu. Czasem potrzeba atrybutów wspólnych dla wszystkich

Bardziej szczegółowo

Misja#3. Robimy film animowany.

Misja#3. Robimy film animowany. Po dzisiejszej lekcji będziesz: tworzyć programy animujące obiekty na ekranie komputera określać położenie i orientację obiektu w kartezjańskim układzie współrzędnych Zauważ że... Ludzkie oko charakteryzuje

Bardziej szczegółowo

Technologie i usługi internetowe cz. 2

Technologie i usługi internetowe cz. 2 Technologie i usługi internetowe cz. 2 Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 15 luty 2014 r. 1 Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to paradygmat programowania,

Bardziej szczegółowo

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub PWSG Ćwiczenia 12 Wszystkie ukończone zadania należy wysłać na adres: sara.m.jurczyk@gmail.com lub sarajurczyk@kul.lublin.pl Zadanie 1: Różnica między zwykłymi polami/metodami, a polami/metodami static

Bardziej szczegółowo

Język Java część 2 (przykładowa aplikacja)

Język Java część 2 (przykładowa aplikacja) Programowanie obiektowe Język Java część 2 (przykładowa aplikacja) Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski @ pwr.wroc.pl Java Java przykładowa

Bardziej szczegółowo

Ćwiczenie 1 Galeria zdjęć

Ćwiczenie 1 Galeria zdjęć Galeria zdjęć Pobierz przykład (http://jsekulska.kis.p.lodz.pl/studia.htm). Krok 1 Ustawienie stołu montażowego Otwieramy nowy plik i nazywamy go (np. gallery.fla). Ustawiamy wielkość pola roboczego na

Bardziej szczegółowo

TEMAT : KLASY DZIEDZICZENIE

TEMAT : KLASY DZIEDZICZENIE TEMAT : KLASY DZIEDZICZENIE Wprowadzenie do dziedziczenia w języku C++ Język C++ możliwa tworzenie nowej klasy (nazywanej klasą pochodną) w oparciu o pewną wcześniej zdefiniowaną klasę (nazywaną klasą

Bardziej szczegółowo

lekcja 8a Gry komputerowe MasterMind

lekcja 8a Gry komputerowe MasterMind lekcja 8a Gry komputerowe MasterMind Posiadamy już elementarną wiedzę w zakresie programowania. Pora więc zabrać się za rozwiązywanie problemów bardziej złożonych, które wymagają zastosowania typowych

Bardziej szczegółowo

Programowanie obiektowe zastosowanie języka Java SE

Programowanie obiektowe zastosowanie języka Java SE Programowanie obiektowe zastosowanie języka Java SE Wstęp do programowania obiektowego w Javie Autor: dr inŝ. 1 Java? Java język programowania obiektowo zorientowany wysokiego poziomu platforma Javy z

Bardziej szczegółowo

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na

Bardziej szczegółowo

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych

Bardziej szczegółowo

PROSTY PROGRAM DO MALOWANIA

PROSTY PROGRAM DO MALOWANIA PROSTY PROGRAM DO MALOWANIA 1. Ten projekt to program do malowania podobny do TuxPainta. Program nie będzie może miał profesjonalnych możliwości, ale jak na aplikację stworzoną z niewielkiej liczby bloczków

Bardziej szczegółowo

Dokumentacja do API Javy.

Dokumentacja do API Javy. Dokumentacja do API Javy http://java.sun.com/j2se/1.5.0/docs/api/ Klasy i obiekty Klasa jest to struktura zawierająca dane (pola), oraz funkcje operujące na tych danych (metody). Klasa jest rodzajem szablonu

Bardziej szczegółowo

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak Java język programowania obiektowego Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak 1 Język Java Język Java powstał w roku 1995 w firmie SUN Microsystems Java jest językiem: wysokiego

Bardziej szczegółowo

Podstawy programowania obiektowego

Podstawy programowania obiektowego Podstawy programowania obiektowego Technologie internetowe Wykład 5 Program wykładu Podejście obiektowe kontra strukturalne do tworzenie programu Pojęcie klasy i obiektu Składowe klasy: pola i metody Tworzenie

Bardziej szczegółowo

Lekcja 5 - PROGRAMOWANIE NOWICJUSZ

Lekcja 5 - PROGRAMOWANIE NOWICJUSZ Lekcja 5 - PROGRAMOWANIE NOWICJUSZ 1 Programowanie i program według Baltiego Najpierw sprawdźmy jak program Baltie definiuje pojęcia programowania i programu: Programowanie jest najwyższym trybem Baltiego.

Bardziej szczegółowo

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost; Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze

Bardziej szczegółowo

II Tworzenie klasy Prostokąt dziedziczącej z klasy wątku

II Tworzenie klasy Prostokąt dziedziczącej z klasy wątku INSTRUKCJA DO ĆWICZENIA 9 Animacja z wieloma wątkami Projekt1 Utwórz aplikację Swing, która umożliwi rysowanie na panelu 10 prostokątów o tej samej podstawie i losowych wysokościach, niezależnie zmieniających

Bardziej szczegółowo

Języki i metody programowania Java Lab1 https://docs.oracle.com/javase/tutorial/ Zofia Kruczkiewicz

Języki i metody programowania Java Lab1 https://docs.oracle.com/javase/tutorial/ Zofia Kruczkiewicz Języki i metody programowania Java Lab1 https://docs.oracle.com/javase/tutorial/ Zofia Kruczkiewicz Zadanie 1. Wykonanie projektu Java SE w środowisku Netbeans- File/New Project W formularzu New Project

Bardziej szczegółowo

SCRATCH PIERWSZE KROKI. http://scratch.mit.edu. version 1.4

SCRATCH PIERWSZE KROKI. http://scratch.mit.edu. version 1.4 PIERWSZE KROKI version 1.4 Zaczynamy jest nowym językiem programowania, w którym możesz stworzyć własne interaktywne historyjki, animacje, gry i muzykę. 1 Ruszamy! Przeciągnij bloczek przesuń o kroków

Bardziej szczegółowo

xmlns:prism=http://www.codeplex.com/prism c. <ContentControl prism:regionmanager.regionname="mainregion" />

xmlns:prism=http://www.codeplex.com/prism c. <ContentControl prism:regionmanager.regionname=mainregion /> 1 Tworzenie Shella a. W pierwszej kolejności tworzymy nowy projekt: WPF Application. Name: Shell SolutionName: PrismApp b. Dodajemy bibliotekę PRISM za pomocą NuGet Managera (dla.net Framework 4.5 Prism

Bardziej szczegółowo

Java pierwszy program w Eclipse «Grzegorz Góralski strona własna

Java pierwszy program w Eclipse «Grzegorz Góralski strona własna Strona 1 z 9 «Przykładowe zadania do cz. III ćwiczeń z genetyki Java pierwsze kroki w programowaniu (01)» Kategoria: java, Tagi: eclipse - java - programowanie. Autor: Grzegorz, napisał dnia: February

Bardziej szczegółowo

Algorytmy z powrotami. Algorytm minimax

Algorytmy z powrotami. Algorytm minimax Algorytmy z powrotami. Algorytm minimax Algorytmy i struktury danych. Wykład 7. Rok akademicki: 2010/2011 Algorytm z powrotami rozwiązanie problemu budowane jest w kolejnych krokach, po stwierdzeniu (w

Bardziej szczegółowo

Języki i metody programowania Java Lab4 podejście obiektowe, zastosowanie pojemników

Języki i metody programowania Java Lab4 podejście obiektowe, zastosowanie pojemników Języki i metody programowania Java Lab4 podejście obiektowe, zastosowanie pojemników https://docs.oracle.com/javase/tutorial/ http://zofia.kruczkiewicz.staff.iiar.pwr.wroc.pl/wyklady/pojava/javazk4_2.pdf

Bardziej szczegółowo

Tworzenie elementów graficznych

Tworzenie elementów graficznych Tworzenie elementów graficznych Elementy graficzne w Javie pozwalające tworzyć Graficzny Interfejs Użytkownika (GUI) możemy podzielić na dwie grupy: AWT (Abstract Window Toolkit) bibliotek klas służąca

Bardziej szczegółowo

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java Aplikacje Internetowe Podstawy języka Java Najprostsza aplikacja class Hello { public static void main(string[] args) { System.out.println("Hello World!"); Komponenty Javy JRE Java Runtime Environment

Bardziej szczegółowo

Języki i metody programowania Java Lab2 podejście obiektowe

Języki i metody programowania Java Lab2 podejście obiektowe Języki i metody programowania Java Lab2 podejście obiektowe https://docs.oracle.com/javase/tutorial/ http://zofia.kruczkiewicz.staff.iiar.pwr.wroc.pl/wyklady/pojava/javazk4_2.pdf Zofia Kruczkiewicz 1 Zadanie

Bardziej szczegółowo

Gra Labirynt - Zajęcia 4

Gra Labirynt - Zajęcia 4 Gra Labirynt - Zajęcia 4 Cel zajęć: Zaprogramowanie duszków-potworów, aby utrudniały przejście przez labirynt. Poznanie nowej funkcji, która umożliwi liczenie punktów za zdobyte skarby. Przekazywane umiejętności:

Bardziej szczegółowo

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r. Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r. Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to

Bardziej szczegółowo

Platformy Programistyczne Podstawy języka Java

Platformy Programistyczne Podstawy języka Java Platformy Programistyczne Podstawy języka Java Agata Migalska 6 maja 2014 Plan wykładu 1 Sztuka wysławiania się w języku Java 2 Cały świat jest obiektem 3 Kolekcje 4 Zmienne i metody statyczne 5 Słowo

Bardziej szczegółowo

Adobe InDesign lab.1 Jacek Wiślicki, Paweł Kośla. Spis treści: 1 Podstawy pracy z aplikacją Układ strony... 2.

Adobe InDesign lab.1 Jacek Wiślicki, Paweł Kośla. Spis treści: 1 Podstawy pracy z aplikacją Układ strony... 2. Spis treści: 1 Podstawy pracy z aplikacją... 2 1.1 Układ strony... 2 strona 1 z 7 1 Podstawy pracy z aplikacją InDesign jest następcą starzejącego się PageMakera. Pod wieloma względami jest do niego bardzo

Bardziej szczegółowo

FINCH PONG. Realizator: Partner: Patronat:

FINCH PONG. Realizator: Partner: Patronat: FINCH PONG Realizator: Partner: Patronat: Dzisiaj nauczymy robota Finch kontrolować ruchy paletki do finch ponga. Będziemy poruszać paletką w prawo i w lewo, żeby piłka odbijała się od niej. 6. Wprowadzamy

Bardziej szczegółowo

Obsługa grafiki w Delphi, rysowanie na płótnie, obsługa myszki, zapisywanie obrazków do plików, bitmapy pozaekranowe.

Obsługa grafiki w Delphi, rysowanie na płótnie, obsługa myszki, zapisywanie obrazków do plików, bitmapy pozaekranowe. Programowanie Wizualno-Obiektowe (studia zaoczne - inżynieria komputerowa) Zajęcia z Delphi 5, program 1 Temat: Zadanie: Obsługa grafiki w Delphi, rysowanie na płótnie, obsługa myszki, zapisywanie obrazków

Bardziej szczegółowo

5.4. Tworzymy formularze

5.4. Tworzymy formularze 5.4. Tworzymy formularze Zastosowanie formularzy Formularz to obiekt bazy danych, który daje możliwość tworzenia i modyfikacji danych w tabeli lub kwerendzie. Jego wielką zaletą jest umiejętność zautomatyzowania

Bardziej szczegółowo

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Polimorfizm, metody wirtualne i klasy abstrakcyjne Programowanie obiektowe Polimorfizm, metody wirtualne i klasy abstrakcyjne Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski pwr.wroc.pl Polimorfizm,

Bardziej szczegółowo

SpriteKit. Biblioteka do tworzenia gier wbudowana w SDK. Wspiera grafikę 2D w oparciu o sprite y

SpriteKit. Biblioteka do tworzenia gier wbudowana w SDK. Wspiera grafikę 2D w oparciu o sprite y SpriteKit SpriteKit Biblioteka do tworzenia gier wbudowana w SDK Wspiera grafikę 2D w oparciu o sprite y SpriteKit HelloWorld SpriteKit HelloWorld SpriteKit AppDelegate identyczny jak w innych szablonach

Bardziej szczegółowo

PWŚG Ćwiczenia 13. Ukończoną pracę należy przesłać na adres lub

PWŚG Ćwiczenia 13. Ukończoną pracę należy przesłać na adres   lub PWŚG Ćwiczenia 13 Ukończoną pracę należy przesłać na adres email: sara.m.jurczyk@gmail.com lub sarajurczyk@kul.lublin.pl Zadanie. Stwórz aplikację stawiającą stemple w postaci figur geometrycznych: koło,

Bardziej szczegółowo

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1 Ćwiczenie 1 Uruchamianie programu w Netbeans Uruchom środowisko Netbeans. Stwórz nowy projekt typu Java Application. Nadaj projektowi nazwę HelloWorld (Project Name), zwróć uwagę na folder, w którym zostanie

Bardziej szczegółowo

przedmiot kilka razy, wystarczy kliknąć przycisk Wyczaruj ostatni,

przedmiot kilka razy, wystarczy kliknąć przycisk Wyczaruj ostatni, Baltie Zadanie 1. Budowanie W trybie Budowanie wybuduj domek jak na rysunku. Przedmioty do wybudowania domku weź z banku 0. Zadanie 2. Czarowanie sterowanie i powtarzanie W trybie Czarowanie z pomocą czarodzieja

Bardziej szczegółowo

Laboratorium z informatyki sem.iii/ćw. 4 Wydział Transportu PW /19

Laboratorium z informatyki sem.iii/ćw. 4 Wydział Transportu PW /19 INSTRUKCJA DO ĆWICZENIA 4 Utworzymy aplikacje umożliwiające oszacowanie szukanych wartości przez symulację doświadczenia losowego, z ilustracją graficzną wyników doświadczenia. Zadanie wykonamy dla przykładów

Bardziej szczegółowo

PHP 5 język obiektowy

PHP 5 język obiektowy PHP 5 język obiektowy Wprowadzenie Klasa w PHP jest traktowana jak zbiór, rodzaj różnych typów danych. Stanowi przepis jak stworzyć konkretne obiekty (instancje klasy), jest definicją obiektów. Klasa reprezentuje

Bardziej szczegółowo

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016 Wykład 2 17 marca 2016 Dziedziczenie Klasy bazowe i potomne Dziedziczenie jest łatwym sposobem rozwijania oprogramowania. Majac klasę bazowa możemy ja uszczegółowić (dodać nowe pola i metody) nie przepisujac

Bardziej szczegółowo

Tak przygotowane pliki należy umieścić w głównym folderze naszego programu. Klub IKS www.informatyka.edu.pl

Tak przygotowane pliki należy umieścić w głównym folderze naszego programu. Klub IKS www.informatyka.edu.pl To jeden z ostatnich odcinków naszego kursu. Mam nadzieję, że pisanie własnego programu było ciekawym doświadczeniem. Zaproponowana w tym odcinku funkcja uatrakcyjni twój program. Stworzymy tak zwane okno

Bardziej szczegółowo

Główne elementy zestawu komputerowego

Główne elementy zestawu komputerowego Główne elementy zestawu komputerowego Monitor umożliwia oglądanie efektów pracy w programach komputerowych Mysz komputerowa umożliwia wykonywanie różnych operacji w programach komputerowych Klawiatura

Bardziej szczegółowo

Podstawy i języki programowania

Podstawy i języki programowania Podstawy i języki programowania Laboratorium 8 - wprowadzenie do obsługi plików tekstowych i wyjątków mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 11 grudnia 2017 1 / 34 mgr inż. Krzysztof

Bardziej szczegółowo

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Część XVIII C++ Funkcje Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Umiemy już podzielić nasz

Bardziej szczegółowo

Template method (metoda szablonowa)

Template method (metoda szablonowa) 1/11 Template method (metoda szablonowa) Cel: Definiuje szkielet algorytmu przy pomocy operacji podstawowych. Konkretyzacja poszczególnych kroków składowych pozostawiona klasom potomnym mogą być one zmieniane

Bardziej szczegółowo

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Java - tablice, konstruktory, dziedziczenie i hermetyzacja Java - tablice, konstruktory, dziedziczenie i hermetyzacja Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU zmienne tablicowe konstruktory klas dziedziczenie hermetyzacja

Bardziej szczegółowo

Druga aplikacja Prymitywy, alpha blending, obracanie bitmap oraz mały zestaw przydatnych funkcji wyświetlających własnej roboty.

Druga aplikacja Prymitywy, alpha blending, obracanie bitmap oraz mały zestaw przydatnych funkcji wyświetlających własnej roboty. Przyszedł czas na rysowanie własnych figur, czyli prymitywy, obracanie bitmap, oraz alpha blending-czyli półprzezroczystość. Będę opisywał tylko rzeczy nowe-nie ma potrzeby abym się powtarzał. Zaczynajmny

Bardziej szczegółowo