Lekcja 11 Gra komputerowa LASER

Podobne dokumenty
LIVE Gra w życie. LIVE w JavaScript krok po kroku. ANIMACJA Rozpoczynamy od podstawowego schematu stosowanego w animacji

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

Sieciowe Technologie Mobilne. Laboratorium 2

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

Opis programu. Obiekt canvas w HTML szerokość i wysokość 600 pikseli. Wygląd dolnej części sterownia armaty grawitacyjnej

CorelDraw - wbudowane obiekty wektorowe - prostokąty Rysowanie prostokątów

Budowa i generowanie planszy

Ćwiczenie 1 Automatyczna animacja ruchu

Jak przygotować pokaz album w Logomocji

CorelDraw - podstawowe operacje na obiektach graficznych

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

SUM Edukacja Techniczno Informatyczna Języki i Systemy Programowania. Wykład 3. dr Artur Bartoszewski - WYKŁAD: Języki i Systemy Programowania,

lekcja 8a Gry komputerowe MasterMind

2.1. Duszek w labiryncie

Funkcje i instrukcje języka JavaScript

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

I Tworzenie prezentacji za pomocą szablonu w programie Power-Point. 1. Wybieramy z górnego menu polecenie Nowy a następnie Utwórz z szablonu

Strzelanka dla dwóch graczy

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

Podstawy programowania skrót z wykładów:

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

Wykład 4: Klasy i Metody

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Dokąd on zmierza? Przemieszczenie i prędkość jako wektory

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Zajęcia nr 15 JavaScript wprowadzenie do JavaScript

Krótki kurs JavaScript

Multimedia i interfejsy. Ćwiczenie 5 HTML5

JAVAScript w dokumentach HTML - przypomnienie

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Programowanie w Turbo Pascal

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Podstawy programowania Laboratorium. Ćwiczenie 2 Programowanie strukturalne podstawowe rodzaje instrukcji

Cw.12 JAVAScript w dokumentach HTML

Tworzenie prezentacji w MS PowerPoint

TWORZENIE OBIEKTÓW GRAFICZNYCH

Ćwiczenia nr 4. Arkusz kalkulacyjny i programy do obliczeń statystycznych

Wstęp Sterowanie Utworzenie, wybór i kasowanie gracza. utworzenia nowego gracza Nowy gracz Nastawienie gracza

5.4. Tworzymy formularze

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

Robert Barański, AGH, KMIW MathScript and Formula Nodes v1.0

Sieciowe Technologie Mobilne. Laboratorium 4

Papyrus. Papyrus. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Abacus Tychy, ul. Pod Lasem 20 tel

Pętla for. Wynik działania programu:

Rys.2.1. Drzewo modelu DOM [1]

Prof. Danuta Makowiec Instytut Fizyki Teoretycznej i Astrofizyki pok. 353, tel danuta.makowiec at gmail.com

2.8. Algorytmy, schematy, programy

Przenoszenie, kopiowanie formuł

Programowanie obiektowe

WASM AppInventor Lab 3. Rysowanie i animacja po kanwie PODSTAWY PRACY Z KANWAMI

Badanie zależności położenia cząstki od czasu w ruchu wzdłuż osi Ox

BLENDER- Laboratorium 1 opracował Michał Zakrzewski, 2014 r. Interfejs i poruszanie się po programie oraz podstawy edycji bryły

Część 4 życie programu

Ćwiczenie 3 - Tworzenie zmiennych i połączeń animacyjnych w InTouch u

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

Ćwiczenie 1 Galeria zdjęć

Informatyka II. Laboratorium Aplikacja okienkowa

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

FINCH PONG. Realizator: Partner: Patronat:

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Liczby losowe i pętla while w języku Python

ZASADY PROGRAMOWANIA KOMPUTERÓW

Test przykładowy 2 PAI WSB Wrocław /06/2018

Baltie 3. Podręcznik do nauki programowania dla klas I III gimnazjum. Tadeusz Sołtys, Bohumír Soukup


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

Programowanie - instrukcje sterujące

AUTOCAD MIERZENIE I PODZIAŁ

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

INSTRUKCJA DO ĆWICZENIA 5

Grafika Komputerowa Materiały Laboratoryjne

Wstęp Pierwsze kroki Pierwszy rysunek Podstawowe obiekty Współrzędne punktów Oglądanie rysunku...

Dodanie nowej formy do projektu polega na:

Modelowanie obiektowe - Ćw. 1.

JAVAScript w dokumentach HTML (2)

Instrukcja wprowadzania graficznych harmonogramów pracy w SZOI Wg stanu na r.

Wstęp do informatyki- wykład 7

W tej instrukcji zostanie opisany sposób w jaki tworzy się, edytuje i usuwa obiekty na mapie. Następnie wybierz Rysuj

Lekcja 5 - PROGRAMOWANIE NOWICJUSZ

Skrypty powłoki Skrypty Najcz ciej u ywane polecenia w skryptach:

Opis ikon OPIS IKON. Ikony w pionowym pasku narzędzi: Ikony te używane są przy edycji mapy. ta ikona otwiera szereg kolejnych ikon, które pozwalają na

Zdarzenia Zdarzenia onload i onunload

Kurs Adobe Photoshop Elements 11

1. Dostosowanie paska narzędzi.

Programowanie w języku Python. Grażyna Koba

BSP_LCD_Clear(LCD_COLOR_WHITE); BSP_LCD_SetFont(&Font16); BSP_LCD_SetTextColor(LCD_COLOR_BLACK);

1. Wchodzimy w adres 2. Wybieramy Stwórz

Przykład zastosowania poleceń 3DWYRÓWNAJ i RÓŻNICA

TABULATORY - DOKUMENTY BIUROWE

Programowanie obiektowe

Język programowania zbiór reguł określających, które ciągi symboli tworzą program komputerowy oraz jakie obliczenia opisuje ten program.

Pętle. for, while, do... while, foreach. Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.

Grafika Komputerowa Materiały Laboratoryjne

Spis treści. Księgarnia PWN: Roland Zimek - Swish Max3

Ćwiczenie 6 Animacja trójwymiarowa

4. Funkcje. Przykłady

Transkrypt:

Lekcja 11 Gra komputerowa LASER http://www.crunchzilla.com/game-maven Na środku ekranu kręci się laserowa baza (trzy obrócone kwadraty), z której (klikając myszką) możemy wypuszczać laserowe strzały. Z brzegów ekranu płyną w kierunku bazy wrogie (kwadratowe) okręty przeciwnika. Jeśli laserowa strzała trafi w kwadratowy okręt, ten zmniejsza się i znika, a my otrzymujemy punkty. Animowane kwadraty Program główny animacji jest typowy. Wykorzystujemy rekurencję i dwie systemowe funkcje: cleartimeout i settimeout. <canvas id="c1" width="500" height="500"> </canvas> <script> // definicja CANVAS i głównej animacji var c = c1.getcontext('2d') var w = c.canvas.width; var h = c.canvas.height; var SKOK=50; var CZAS; Obiekt KWA kwadratowy wróg Każdy kwadrat KWA posiada typowe parametry: środek (x,y), bok (bok), kąt (kat), szybkość przesuwania w pionie i poziomie (dx,dy) oraz szybkość obrotu (dk). Metoda przerysuj oblicza nowe położenie i nowy kąt obrotu oraz sprawdza odbicia od brzegów. Na końcu metody wykonujemy od razu metodę rysuj nie trzeba jej wykonywać podczas przerysowywania w animacji. Metoda rysuj, to obrócony kwadrat narysowany od środka. Tworzenie losowanie Definiujemy pustą tablicę TKWA i do jej kolejnych elementów wstawiamy obiekty KWA za pomocą instrukcji new i push. W pętli głównej animacji wystarczy wykonać przerysowanie wszystkich obiektów w tablicy. // tworzenie kwadratów i losowanie var TKWA=[]; var maxb=30; var maxv=4; var maxk=4; var ilekwa=5; for (var i=0;i<ilekwa;i++){ var x=math.random()*(w-maxb)+maxb/2; var y=math.random()*(h-maxb)+maxb/2; var kat=math.random()*3; var kol= Black ; var dx=math.random()*maxv-1; var dy=math.random()*maxv-1; var dk=(math.random()*maxk-1)*0.1; TKWA.push( new KWA(x,y,maxB,kat,kol,dx,dy,dk)); //przerysowanie - ANIMACJA for (var i=0;i<tkwa.length;i++){ TKWA[i].przerysuj(); function ANIMACJA(){ c.clearrect(0,0,w,h); c.strokestyle="black"; c.strokerect(0,0,w,h); cleartimeout(czas); CZAS=setTimeout(ANIMACJA,SKOK); ANIMACJA(); </script> // obiektowy kwadrat wraz z metodami // rysuj zmiany i rysuj function KWA(x,y,bok,kat,kol,dx,dy,dk){ this.x=x; this.y=y; this.bok=bok; this.kat=kat; this.kol=kol; this.dx=dx; this.dy=dy; this.dk=dk; // położenie this.x=this.x+this.dx; this.y=this.y+this.dy; if (this.x-b2 < 0 this.x+b2 > h){ this.dx=-this.dx; if (this.y-b2 < 0 this.y+b2 > w){ this.dy=-this.dy; if (this.kat>360){this.kat=0 //automatyczne przerysowanie // rysowanie c.rotate(this.kat); c.strokerect(-b2,-b2,this.bok,this.bok); //koniec KWA rysuj

Inicjowanie podczas kreowania Możemy zdefiniować metodę init w obiekcie KWA, która będzie automatycznie tworzyć nowego wroga podczas tworzenia obiektu? Co należy zmienić? 1. Funkcja KWA już nie potrzebuje parametrów 2. Nie potrzebujemy przepisywania parametrów na zmienne wewnętrzne this 3. Nowa metoda init będzie losować od razu do zmiennych wewnętrznythis 4. Gdy obiekt KWA zostanie utworzony za pomocą New to od razu wywołana zostanie metodę init 5. Przenosimy zmienne maxb, maxv i maxk na początek. 6. Zamiast losowania w pętli wystarczy inicjowanie obiektów KWA w pętli var maxb=30; var maxv=4; var maxk=4; function KWA(){ this.x=math.random()*(w-maxb)+maxb/2; this.y=math.random()*(h-maxb)+maxb/2; this.bok=maxb; this.kat=math.random()*3; this.kol="black"; this.dx=math.random()*maxv-1; this.dy=math.random()*maxv-1; this.dk=(math.random()*maxk-1)*0.1; for (var i=0; i<ilekwa; i++) { TKWA.push(new KWA()); Obracająca się gwiazda Metoda init w funkcji-obiekcie GWIAZDA inicjuje własności gwiazdy. Po zainicjowaniu od razu jest wywoływana this.init(). Metoda przerysuj zmienia kąt i rysuje gwiazdę this.rysuj(). Metoda rysuj rysuje gwiazdę w punkcie (x,y), trzy obrócone o 30 kwadraty. Po zdefiniowaniu obiektu GWIAZDA tworzymy zmienną obiektową GWI za pomocą instrukcji new. W części głównej ANIMACJA wystarczy wywołać metodę GWI.przerysuj(). // zmienna obiektowa var GWI=new GWIAZDA(); // przerysowanie ANIMACJA GWI.przerysuj(); Laserowy strzał Laserowy strzał, to linia biegnąca od środka obracającej się gwiazdy do kursora myszki. Rysowana linia jest nową metodą strzel w obiekcie GWIAZDA. Rysujemy wtedy, gdy przycisk myszki jest wciśnięty MyszPrzycisk=true, gdy puścimy przycisk myszy - linia nie jest rysowana. //obiektowa laserowa gwiazda function GWIAZDA(){ this.x=w/2; this.y=h/2; this.bok=30; this.kat=0; this.kol= blue ; this.dk=3; // inicjowanie gwiazdy // obliczanie i przerysowanie // rysowanie gwiazdy var b2=this.bok / 2; var b=this.bok; c.rotate(math.pi * this.kat / 180); Myszka Zdarzenia Położenie myszki zapisywane jest w zmiennej var MYSZKA={x:0, y:0. Zdarzenia związane z ruchem myszki, naciskaniem i zwalnianiem przycisku opisują zdarzenia przypisane do canvas: onmousemove, onmousedown, onmouseup. Canvas jest przesunięty względem tego, co pokazuje myszka o 8 pikseli w prawy, dolny róg. // zdarzenia myszki na CANVAS // położenie myszki var MYSZKA = {x: 0, y: 0; // myszka nie wciśnięta var MyszPrzycisk = false; // ruch myszki c.canvas.onmousemove = function(e) { MYSZKA.x = e.clientx - 8; MYSZKA.y = e.clienty - 8; ; // przycisk myszki wciśnięty c.canvas.onmousedown = function(e) { MyszPrzycisk = true; ; // przycisk myszki zwolniony c.canvas.onmouseup = function(e) { MyszPrzycisk = false; ; // laserowy strzał // metoda w obiekcie GWIAZDA this.strzel=function(){ if (MyszPrzycisk){ c.beginpath(); c.moveto(this.x, this.y); c.strokestyle="red"; c.lineto(myszka.x, MYSZKA.y); c.stroke(); // metoda PRZERYSUJ poprawiona this.strzel();

Trafienie bazy kwadrat uderzył w gwiazdę Jak sprawdzić, czy gwiazda zstała trafiona przez jeden z kwadratów? Za każdym razem, gdy przerysowywany jest kwadrat trzeba będzie to sprawdzać pętla przerysowująca kwadraty w animacji głównej. Ale jak to sprawdzić? Obliczymy odległość pomiędzy kwadratem a bazą. Jeśli jest mniejsza niż suma połowy kwadratu i połowy bazy, to znaczy, że baza została trafiona. Nową metodę CzyTrafiona umieścimy w obiekcie GWIAZDA. Parametrem metody będzie kwadrat TKWA[i], który będzie wrzucany do zbadania w pętli przerysowującej. Jeśli gwiazda trafiona to metoda przyjmuje wartość TRUE, w przeciwnym wypadku FALSE. W pętli głównej animacji umieszczamy rysowanie punktacji. Na początku programy należy również umieścić deklarację zmiennej PUNKTY i przypisać doniej początkową wartość zero. Alternatywne zakończenie programu duży czerwony napis i zatrzymanie akcji zamiast odejmowania punktów Zestrzelenie wrogiego kwadratu Jak sprawdzić, czy koniec laserowego strzału (położenie myszki) trafiło w środek któregoś kwadratowego wroga? Za każdym razem, gdy strzelamy obliczamy odległość pomiędzy myszką, a środkiem kwadratu. Jeśli ta odległość jest mniejsza niż połowa boku, to znaczy, że strzał się udał. Zwiększamy PUNKTY, zmniejszamy bok trafionego kwadratowego wroga, a gdy zniknie, to rodzi się nowy. Całość w metodzie KWA.przerysuj. Usuwanie wrogów z listy Zmniejszenie wroga do zera, aby nie był widoczny, to jedno, ale dalej pozostają jego parametry w pamięci trzeba je usunąć. Dodawanie na koniec listy realizowaliśmy za pomocą metody push, a usuwanie wybranego elementu metodą splice główna pętla animacyjna Nowy wróg zawsze na brzegu Nowy wróg powinien rodzić się losowo na brzegu. Jak to zrobić? Najpierw wylosujemy czy pojawi się na górnymdolnym czy na lewym-prawym brzegu: Math.random()<0.5 (połowa przypadków). Jeśli góra-dół, to Y losujemy według starych zasad, a X losujemy do momentu aż będzie na brzegu pętla while. I podobnie w drugim przypadku. Polecenia umieszczamy w KWA.init this.czytrafiona=function(obiekt){ var sx=this.x-obiekt.x; var sy=this.y-obiekt.y; var dl=math.sqrt(sx*sx+sy*sy); if (dl < this.bok/2 + obiekt.bok/2){ return true return false; for (var i=0; i<tkwa.length; i++){ TKWA[i].przerysuj(); if (GWI.CzyTrafiona(TKWA[i])) { PUNKTY=PUNKTY-10;; c.filltext("punkty: " + PUNKTY, w * 0.8, 20); c.font = '48pt sans-serif'; c.textalign = 'center'; c.fillstyle = 'red'; c.textbaseline = 'middle'; c.filltext('game OVER', w / 2, h / 2); exit; if (MyszPrzycisk) { var dx = MYSZKA.x - this.x; var dy = MYSZKA.y - this.y; var d = Math.sqrt(dx*dx+dy*dy); if (d < b2 d < 10) { PUNKTY=PUNKTY+1; this.bok=this.bok-2; if (this.bok <= 0) { // nowy for (i=tkwa.length-1; i>=0; i=i-1) { if (TKWA[i].bok <= 0) { TKWA.splice(i, 1); if (Math.random()<0.5) {//albo góra dół //Y dowolny a X losowo na brzegu this.y=math.random()*(h-maxb)+maxb/2; var xx=math.random()*(w-maxb)+maxb/2; while (xx> maxb && xx<w-maxb); this.x=xx; else {// albo prawy lewy // X dowolny a Y losowo na brzegu this.x=math.random()*(w-maxb)+maxb/2; var yy=math.random()*(h-maxb)+maxb/2; while (yy> maxb && yy<h-maxb) this.y=yy; Dzieci A gdyby tak po trafieniu wroga odrywały się od niego mniejsze wrogie kawałki? W miejscu, gdzie sprawdzamy co się dzieje po wciskaniu przycisku myszki: KWA.przerysuj tworzymy nowy obiekt KWA dodajemy na listę za pomocą push. Okazuje się, że każdy z tych kwadracików, po zestrzeleniu rodzi nowy, duży kwadrat! Jak odróżnić zestrzelenie rodzica od zestrzelenia potomka? Każdemu dziecku nadamy dodatkowy parametr: DZIECKO, a gdy się rodzi nowy sprawdzamy, czy nie jest to dziecko poprawiamy w KWA.przerysuj if (this.bok > 10) { var kw = new KWA(); kw.x = this.x + kw.dx * 5; kw.y = this.y + kw.dy * 5; kw.bok = 4; kw.dziecko = true; TKWA.push(kw); if (this.bok <= 0 &&!this.dziecko) {

Cały program <canvas id="c1" width="500" height="500"> </canvas> <script> var c = c1.getcontext('2d') var w = c.canvas.width; var h = c.canvas.height; var SKOK=50; var CZAS; var maxb=30; var maxv=4; var maxk=4; // ***************************************************** KWADRAT function KWA(){ // losowo na brzegach if (Math.random()<0.5) { this.y=math.random()*(h-maxb)+maxb/2; var xx=math.random()*(w-maxb)+maxb/2; while (xx>maxb && xx<w-maxb); this.x=xx; else { this.x=math.random()*(w-maxb)+maxb/2; var yy=math.random()*(h-maxb)+maxb/2; while (yy>maxb && yy<h-maxb) this.y=yy; //this.x=math.random()*(w-maxb)+maxb/2; //this.y=math.random()*(h-maxb)+maxb/2; this.bok=maxb; this.kat=math.random()*3; this.kol="black"; this.dx=math.random()*maxv-1; this.dy=math.random()*maxv-1; this.dk=(math.random()*maxk-1)*0.1; this.x=this.x+this.dx; this.y=this.y+this.dy; // odbijanie od brzegów if (this.x-b2 < 0 this.x+b2 > h){ this.dx=-this.dx; if (this.y-b2 < 0 this.y+b2 > w){ this.dy=-this.dy; if (this.kat>360){this.kat=0 // trafienie w kwadrat if (MyszPrzycisk) { var dx = MYSZKA.x - this.x; var dy = MYSZKA.y - this.y; var d = Math.sqrt(dx*dx+dy*dy); if (d < b2 d < 10) { PUNKTY=PUNKTY+1; this.bok=this.bok-2; // kwadrat rozpada się na mniejsze

if (this.bok > 10) { var kw = new KWA(); kw.x = this.x + kw.dx * 5; kw.y = this.y + kw.dy * 5; kw.bok = 4; kw.dziecko = true; TKWA.push(kw); // nowy rodzi się gdy zmaleje do zera if (this.bok <= 0 &&!this.dziecko) { c.rotate(this.kat); c.strokerect(-b2,-b2,this.bok,this.bok); var ilekwa=10; var TKWA=[]; for (var i=0; i<ilekwa; i++) { TKWA.push(new KWA()); // ***************************************************** KWADRAT // ***************************************************** GWIAZDA function GWIAZDA(){ this.x=w/2; this.y=h/2; this.bok=30; this.kat=0; this.kol="blue"; this.dk=3; this.dx=0; this.dy=0; //automatyczne inicjowanie własności gwiazdy this.strzel(); var b2=this.bok / 2; var b=this.bok; c.rotate(math.pi * this.kat / 180);

this.strzel=function(){ if (MyszPrzycisk){ c.beginpath(); c.moveto(this.x, this.y); c.strokestyle="red"; c.lineto(myszka.x, MYSZKA.y); c.stroke(); // czy gwiazda trafiona przez kwadrat this.czytrafiona=function(obiekt){ var sx=this.x-obiekt.x; var sy=this.y-obiekt.y; var dl=math.sqrt(sx*sx+sy*sy); if (dl < this.bok/2 + obiekt.bok/2){ return true else { return false; var GWI=new GWIAZDA(); // ***************************************************** GWIAZDA // ***************************************************** MYSZKA var MYSZKA = {x: 0, y: 0; var MyszPrzycisk = false; c.canvas.onmousemove = function(e) { MYSZKA.x = e.clientx - 8; MYSZKA.y = e.clienty - 8; ; c.canvas.onmousedown = function(e) { MyszPrzycisk = true; ; c.canvas.onmouseup = function(e) { MyszPrzycisk = false; ; // ***************************************************** MYSZKA var PUNKTY=0; // ***************************************************** ANIMACJA function ANIMACJA(){ c.clearrect(0,0,w,h); c.strokestyle="black"; c.strokerect(0,0,w,h); //rysowanie kwadratów for (var i=0; i<tkwa.length; i++){ TKWA[i].przerysuj(); //sprawdzamy vzy kwadrat trafił w gwiazdę if (GWI.CzyTrafiona(TKWA[i])) { PUNKTY=PUNKTY-10;; c.filltext("punkty: " + PUNKTY, w * 0.8, 20); //rysowanie gwiazdy GWI.przerysuj(); //usuwanie z tabeli skasowane kwadraty for (i=tkwa.length-1; i>=0; i=i-1) { if (TKWA[i].bok <= 0) { TKWA.splice(i, 1); cleartimeout(czas); CZAS=setTimeout(ANIMACJA,SKOK); ANIMACJA(); // ***************************************************** ANIMACJA </script>