Klasy w C++ Pierwsza gra

Podobne dokumenty
Wybieramy File->New->Project Wybieramy aplikację MFC->MFC Application jak na rysunku poniżej:

Dziedziczenie w klasach

Wprowadzenie do klas w C++ oraz biblioteki opengl

Unity 2D - prosta gra

Unity 3D - pierwsze skrypty

Unity 3D - podpowiedzi w grze. System cząstek

Unity 3D - własny ekran startowy i menu gry

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

Informatyka II. Laboratorium Aplikacja okienkowa

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

5.4. Tworzymy formularze

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

Programowanie komputerowe. Zajęcia 7

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Animacje z zastosowaniem suwaka i przycisku

Laboratorium 1 - Programowanie proceduralne i obiektowe

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

Instytut Sterowania i Systemów Informatycznych Uniwersytet Zielonogórski SYSTEMY SCADA

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

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

Kodu z klasą. Kodu, pościgamy się? Scenariusz 4

5.4. Efekty specjalne

Windows 10 - Jak uruchomić system w trybie

Dia rysowanie diagramów

FINCH PONG. Realizator: Partner: Patronat:

Windows Workflow Foundation (wprowadzenie - prosty przykład Sequential Workflow):

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Praktyczne przykłady wykorzystania GeoGebry podczas lekcji na II etapie edukacyjnym.

Główne elementy zestawu komputerowego

INSTRUKCJA UŻYTKOWNIKA PORTALU SIDGG

RYSUNEK TECHNICZNY I GEOMETRIA WYKREŚLNA INSTRUKCJA DOM Z DRABINĄ I KOMINEM W 2D

Kolejną czynnością będzie wyświetlenie dwóch pasków narzędzi, które służą do obsługi układów współrzędnych, o nazwach LUW i LUW II.

LABORATORIUM 7 Cel: 1_1

Rysunek 1: Okno timeline wykorzystywane do tworzenia animacji.

Ping-Pong. Gra dla dwóch graczy.

W momencie stworzenia kontroler ustawia punkty na 100. Dodajemy zdarzenie Create w środku kontrolera,

Zawartość. Wstęp. Moduł Rozbiórki. Wstęp Instalacja Konfiguracja Uruchomienie i praca z raportem... 6

WAŻNE! colour.me Google Fonts tutaj

Rys.1. Technika zestawiania części za pomocą polecenia WSTAWIAJĄCE (insert)

Podczas tej lekcji przyjrzymy się, jak wykonać poniższy rysunek przy pomocy programu BobCAD-CAM

Ćwiczenie 1: Pierwsze kroki

Strzelanka dla dwóch graczy

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

b) Dorysuj na warstwie pierwszej (1) ramkę oraz tabelkę (bez wymiarów) na warstwie piątej (5) według podanego poniżej wzoru:

Rozdział 4: PIERWSZE KROKI

Uczeń/Uczennica po zestawieniu połączeń zgłasza nauczycielowi gotowość do sprawdzenia układu i wszystkich połączeń.

Laboratorium 9 (Więcej Aktywności, w Androidzie)

Baltie - programowanie

Warsztaty dla nauczycieli

Expo Composer Garncarska Szczecin tel.: info@doittechnology.pl. Dokumentacja użytkownika

6.4. Efekty specjalne

Klient poczty elektronicznej - Thunderbird

Gimp - poznaj jego możliwości!

5.2. Pierwsze kroki z bazami danych

Celem ćwiczenia jest zapoznanie się z podstawowymi funkcjami i pojęciami związanymi ze środowiskiem AutoCAD 2012 w polskiej wersji językowej.

INSTRUKCJA OBSŁUGI DIODOWEGO WYŚWIETLACZA TEKSTÓW PIEŚNI STEROWANEGO Z TABLETU 10,1 '

Wymiarowanie i teksty. Polecenie:

mgr Elżbieta Galant-Zielonka

ZINTEGROWANY SYSTEM ZARZĄDZANIA TREŚCIĄ

Obliczenie kratownicy przy pomocy programu ROBOT

Ekran tytułowy (menu główne)

Tworzenie menu i authoring w programie DVDStyler

Kodu z klasą. Kodu, zbierzesz dla mnie trochę jabłek? Scenariusz 3

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.

xmlns:prism= c. <ContentControl prism:regionmanager.regionname="mainregion" />

Cykl lekcji informatyki w klasie IV szkoły podstawowej. Wstęp

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

Access - Aplikacja. Tworzenie bazy danych w postaci aplikacji

KGGiBM GRAFIKA INŻYNIERSKA Rok III, sem. VI, sem IV SN WILiŚ Rok akademicki 2011/2012. Przygotowanie do druku

W kolejnym odcinku zajmiemy się umieszczaniem w naszym projekcie zestawu ikon służących szybkiemu korzystaniu z opcji programu.

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

Technologie i usługi internetowe cz. 2

Zajęcia nr 3_cz2 Praca z tekstem: WORD Wzory matematyczne. Tabele

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

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

Leszek Stasiak Zastosowanie technologii LINQ w

Programowanie obiektowe i zdarzeniowe

TEMAT : KLASY POLIMORFIZM

Poziom 2. Pustynny wyścig

Maskowanie i selekcja

Spis treści Szybki start... 4 Podstawowe informacje opis okien... 6 Tworzenie, zapisywanie oraz otwieranie pliku... 23

Unity 3D - tworzenie sceny

Szybkie tworzenie grafiki w GcIde

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

Oficyna Wydawnicza UNIMEX ebook z zabezpieczeniami DRM

PLANSZA. Plansza składa się z następujących pól:

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

podstawowa obsługa panelu administracyjnego

Modelowanie obiektowe - Ćw. 1.

Opis programu EKSoft Rezerwacje

Edytor tekstu MS Word podstawy

Poradnik użytkownika pomoc techniczna

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

Kodu z klasą. Skarb w zatrutej wodzie, cz. 2. Scenariusz 6

Obsługa mapy przy użyciu narzędzi nawigacji

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

plansoft.org Zmiany w Plansoft.org Panel wyszukiwania PLANOWANIE ZAJĘĆ, REZERWOWANIE SAL I ZASOBÓW

Rys. 1. Brama przesuwna do wykonania na zajęciach

podstawowa obsługa panelu administracyjnego

Transkrypt:

Klasy w C++ Pierwsza gra Na ostatnich zajęciach zajmowaliśmy się operację dziedziczenia w klasach. Zadanie polegało na stworzeniu obiektów graficznych na scenie opengl oraz manipulowanie nimi. Podczas działań wykorzystaliśmy polimorfizm w klasach. Polegało to na odnoszeniu się do każdej z figur, z poziomu klasy bazowej CFigura. Na dzisiejszych utrwalimy i wykorzystamy zdobytą do tej pory wiedzę. Celem zajęć jest stworzenie części gry (kolejna cześć zostanie dopisana na kolejnych zajęciach), w której możliwe jest stoczenie rozgrywki pomiędzy przeciwnikami. Każdy z przeciwników dysponuje armatą której umiejscowienie na planszy 2D jest losowe (pseudolosowe). W momencie startu rozgrywki gracz ustawia siłę uderzenie oraz kąt pod jakim ma być ustawiona armata. Jeśli gracz trafi w przeciwnika wówczas wygrywa, jeśli nie, wtedy kolejka przechodzi na przeciwnika. Pracę zaczniemy od przygotowania naszego programu. Pierwszą rzeczą jest usunięcie linijki kodu, która po naciśnięciu przycisku ok ukrywała okno główne programu: this->showwindow(sw_hide);// ukrywamy glowne okno Okno bowiem będzie nam teraz potrzebne w celu zadania parametrów strzału. Chcemy też aby nasza scena była większa i żeby była ustawiona w odpowiednim miejscu naszego obszaru pracy, dodajemy zatem: glutinitwindowsize (800, 600);// ustawiamy początkową wielkosc okna glutinitwindowposition (200, 100);// poczatkowa pozycja okna (lewy górny róg) Uwaga! Powyższy kod dodajemy przed funkcją: glutcreatewindow( ) Następnie zmieniamy nieco nasz widok przestawiając pozycję kamery (w metodzie void openglview:: resize(int width, int height)): glulookat( // ustawienie początkowe kamery 0.0, 0.0, 250.0,0.0, 0.0, 0.0,0.0, 1.0, 0.0); Teraz musimy zastanowić się jak powinny wyglądać obiekty na naszej scenie. Po pierwsze potrzebna jest ruchoma lufa, którą można przybliżyć prostokątem, korpus armaty czyli np. koło, zwieszenie działa stanowiące przegub np. trójkąt oraz podłoże najlepiej prostokąt. Poza stanowiskiem armaty potrzebne są nam kule- pociski. Stworzymy zatem nowe dwie klasy: klasę CArmata oraz CPocisk Dodajemy zatem klasę armaty, która to będzie agregować obiekty z klasy CKwadrat, CTrojkat oraz Ckolo: class CArmata public: CArmata(void); CArmata(int x, int y, int z, double r, double g, double b); //przeładowany konstruktor ~CArmata(void); public: void Rysuj(void);//metoda rysujaca armatę private: CKolo * korpus; //korpus armaty

public: ; CKwadrat * lufa; //lufa czolgu CTrojkat * przegub;//zawieszenie lufy CKwadrat * podloze; ;//armata musi na czymś leżeć double kat; //kat ustawienia lufy int pozycja[3]; //pozycja armaty na ekranie Oczywiście pamiętamy aby dodać stosowane pliki nagłówkowe. Mając klasę, możemy dopisać definicję metod (w pliku Armata.cpp): CArmata::CArmata(int x, int y, int z, double r, double g, double b) lufa = new...//ustawiamy w pozycji (0, 0) o wymiarze 10x2 i kolorze (r, g, b) podloze = new //ustawiamy w pozycji (0, 0) o wymiarze 30x2 i kolorze (0, 1, 0) korpus = new //ustawiamy w pozycji (0, 0) o wymiarze 30x2 i kolorze (r, g, b) przegub = new //ustawiamy wierzchołki w pozycji (0, 0), (10,0), oraz (5,4) o kolorze (0, 0, 1) //ustawiamy pozycje x //ustawiamy pozycje y //ustawiamy pozycje z //oraz ustawiamy kat poczatkowy na 90stopni CArmata::~CArmata(void) // zwalniamy pamięć = usuwamy nasze obiekty graficzne void CArmata::Rysuj(void) //metoda rusyjaca armatę // wykonujemy rotacje lufy o (0, 0, kat-90) stopni: lufa->rotacja[0]= // wykonujemy przesunięcie lufy o (pozycja[0]+15-cos( ),..., 0) : lufa->translacja[0]= // wykonujemy przesunięcie podłoża o (pozycja[0], pozycja[1], pozycja[2]) : podloze->translacja[0]= // wykonujemy przesunięcie korpusu o (pozycja[0]+15, pozycja[1]+7, pozycja[2]) : // przesuwamy przegub o (pozycja[0]+10, pozycja[1]+2, pozycja[2]) : // ostatecznie rysujemy wszystkie obiekty: lufa->rysuj();

Mając już gotową klasę armaty możemy przetestować jej działanie. Wystarczy dodać obiekt w klasie naszej sceny: Oraz powołać do życia, jak i usunąć, odpowiednio w konstruktorze i destruktorze: Armata musi być wyświetlona więc dodajemy wywołanie metody: armata->rysuj(); w metodzie rysuj_figury(). Warto też (dla testu) dodać obsługę nachylenia lufy : Teraz kompilujemy i uruchamiamy nasz program. Na ekranie powinna pojawić się armata:

Pierwsza faza pracy zakończona. Teraz zajmiemy się tworzeniem klasy Pocisk. Dodajemy klasę, a w jej ciało wpisujemy metody, jak poniżej: #pragma once #include "Kolo.h" class CPocisk public: CPocisk(void); CPocisk(int x, int y, int z, int radius, double r, double g, double b);//radius - promien pocisku ~CPocisk(void); void Rysuj(); // rysuje pocisk na ekranie void trajektoria(int wiatr); // wyznacza pozycję pocisku uwzgledniając wiatr CKolo * obudowa; //ksztalt pocisku ; double v0; //predkosc poczatkowa double vx; //predkosc w osi x; double vy; //predkosc w osi y; double kat0; // poczatkowy kat pod jakim porusza sie pocisk double px; // pozycja pocisku w osi x double py; // pozycja pocisku w osi y Do klasy dopisujemy również definicje metod (wszystko w pliku Pocisk.cpp): CPocisk::CPocisk(void) CPocisk::~CPocisk(void) //zwalniamy pamięć-dopisać CPocisk::CPocisk(int x, int y, int z, int radius, double r, double g, double b) //radius - promien pocisku //dopisać: // tworzymy ksztalt pocisku na podstawie klasy CKolo // ustawia początkową wartość zmiennej x na podstawie parametrow przekazanych do konstruktora // ustawia poczatkowa wartosc zmiennej y na podstawie parametrow przekazanych do konstruktora void CPocisk::Rysuj() //metoda rysuje pocisk na ekranie // rysujemy pocisk dopisać: void CPocisk::trajektoria(int wiatr) double dt=1;//krok symulacji lotu pocisku w sekundach px=px+vx*dt;//obliczamy nowa pozycjê pocisku w osi x - poprzez całkowanie prędkości py=py+vy*dt;//obliczamy nowa pozycje pocisku w osi y - poprzez całkowanie prędkości //przepisujemy wspólrzedną x do kola //przepisujemy wspólrzedną y do kola -dopisać!

vx+=wiatr/10; //zmienimy prędkość w osi x na podstawie siły wiatru vy-=0.1;//prędkość w osi y maleje w każdej jednostce czasu o stałą wartość Mając już uzupełnione wszystkie metody możemy dodać na naszej scenie dwie armaty (docelowo) oraz dwa pociski: Dla naszych celów, w klasie openglview, dodajemy też zmienną odpowiedzialną za wiatr: int wiatr; //siła i kierunek wiatru Dodajemy również metodę, która losuje nam wartość wiatru: losujwiatr(); // losowo dobieramy sile wiatru Teraz przechodzimy do pliku.cpp gdzie musimy powołać nasze obiekty w konstruktorze oraz zwolnić pamięć w destruktorze: Dodajemy też definicję metody losującej wartość prędkości wiatru: void openglview::losujwiatr() int min=-10; int max=10; wiatr = min + rand() % (max - min);

Ostatecznie musimy narysować wszystko na scenie: armata1->rysuj(); armata2->rysuj(); pocisk1->rysuj(); pocisk2->rysuj(); Oczywiście chcąc zmienić kąt pod jaki jest ustawiona armata (przy użyciu klawiatury) musimy odpowiednio zaingerować w metodzie: void openglview::keyboard( ) Teraz możemy skompilować nasz program a efekt uzyskany na scenie powinien być zbliżony do tego, który jest przedstawiony na rysunku: Mamy już dwie armaty, dwa pociski oraz okno dialogowe, które musimy teraz odpowiednio skonfigurować. Klikamy na zakładkę resources i wybieramy nasze okno główne:

W naszym oknie dodajemy odpowiednie elementy, aby wyglądało ono tak jak poniżej: Mając już slider oraz Edit box warto zmienić ich parametry. Po pierwsze zmienimy tryb dostępu do naszego Edit box wybierając true w zakładce Read Only oraz zmieniamy typ wielkości jaką przyjmuje nasz Edit: Zmian dokonujemy też w Sliderze :

Uwaga! W celu właściwego ułożenia elementów okna dialogowego warto korzystać z funkcji, znajdujących się na pasku narzędzi: Skończyliśmy prace stylistyczne, teraz przejdziemy do obsługi zmiennych. Najpierw skojarzymy je z oknami. Klikamy prawym przyciskiem na slider, a następnie wybieramy add variable Ostatecznie nadajemy jej nazwę oraz typ:

Podobnie postępujemy w przypadku pola Edit z tą jednak różnicą, że nazwą zmiennej będzie: edit1_v0. Teraz klikamy dwukrotnie na przycisk Fire i dopisujemy obsługę przycisku: void CopenGL1Dlg::OnBnClickedButton1() UpdateData(true); //konieczne przed odczytywaniem wartości gl.pocisk1->v0=armata1_v0; // ustawiamy początkową wartość prędkości pocisku // TODO: Add your control notification handler code here Następnie klikamy dwukrotnie na slider i dopisujemy obsługę Edit box: Mamy już wszystko. Teraz wystarczy skompilować i uruchomić. Pojawi się okno dialogowe, po wybraniu ok wyświetlona zostanie cena, na której za tydzień stoczymy bitwę. Sprawozdanie: 1. Proszę zamieścić kod konstruktora przeładowanego klasy CArmata 2. Proszę zamieścić kod konstruktora przeładowanego klasy CPocisk 3. Dlaczego aktualizacja zmiennej edit1_v0 odbywa się w metodzie OnNMCustomdrawSlider1( )? 4. W jakim celu dodajemy UpdataData(true) i UpdateData(false) w metodzie OnNMCustomdrawSlider1( )? Sprecyzować wpływ powyższych funkcji. 5. Podaj relacje występujące pomiędzy klasami w programie (najlepiej skorzystać z diagramu UML). Proszę nie uwzględniać klasy okna dialogowego.