Problem Próby rozwiązania Maszyna stanów Inne zastosowania Podsumowanie. Maszyny stanów. Programowanie gier bez Unity, cz. 3.



Podobne dokumenty
Szablony funkcji i szablony klas

Programowanie gier eventy. Dalton & Cartman KNTG Polygon, 21 grudnia 2015 r.

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

Owad():waga(1),jadowitosc(false) {cout<<"konstruktor domyslny owada\n";}

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

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

!!" % & $ ( # # ( ( # ( ( TalentowiSKO talenty dodajemy, mnoīymy, potċgujemy. TalentowiSKO@bankbps.pl tel TalentowiSKO.

Zaawansowane programowanie w języku C++ Programowanie obiektowe

DYNAMICZNE PRZYDZIELANIE PAMIECI

Listy powiązane zorientowane obiektowo

Zaawansowane programowanie w C++ (PCP)

Programowanie obiektowe

XII. Warunek wielokrotnego wyboru switch... case

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

ATD. Wykład 8. Programowanie (język C++) abstrakcyjny typ danych. Abstrakcyjne typy danych (ATD) Metody czysto wirtualne. Definicje i uwagi:

Wprowadzenie do programowanie obiektowego w języku C++

Tworzenie aplikacji w języku Java

Metody Metody, parametry, zwracanie wartości

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Wstęp do programowania

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

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

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Zaawansowane programowanie w C++ (PCP)

Nowe słowa kluczowe. Komentarze. Wskaźniki typu void. class, delete, new, friend,... /* Komentarz w C i C++ */ // Komentarz w C++ (do końca wiersza)

Klasy i obiekty cz II

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

Wykład :37 PP2_W9

Programowanie 2. Język C++. Wykład 3.

Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.

Programowanie obiektowe i zdarzeniowe

Warunek wielokrotnego wyboru switch... case

Podstawy programowania w języku C i C++

Pętla for. Wynik działania programu:

Programowanie, algorytmy i struktury danych

Konstrukcje warunkowe Pętle

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Akademia ETI. Wprowadzenie do programowania w Javie PG Java User Group Przemysław Kulesza

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Abstrakcyjny typ danych

Pułapki programowania obiektowego. Adam Sawicki stycznia 2011

Programowanie Obiektowew języku C++ Zadania L9

Języki programowania - podstawy

Laboratorium 1 - Programowanie proceduralne i obiektowe

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Architektury systemów rozproszonych LABORATORIUM. Ćwiczenie 1

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

TEMAT : KLASY POLIMORFIZM

Modelowanie numeryczne w fizyce atmosfery Ćwiczenia 3

Polimorfizm w pigułce

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

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

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

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

Język ludzki kod maszynowy

Efekty uboczne błędów

Algorytmy z powrotami. Algorytm minimax

Java: interfejsy i klasy wewnętrzne

Podstawy Programowania Obiektowego

Wprowadzenie do szablonów szablony funkcji

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

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

Operatory logiczne. Podstawowe operatory logiczne, składanie wyrażeń z użyciem operatorów logicznych

Wprowadzenie do szablonów szablony funkcji

Instrukcje sterujące mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2012

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Typy zmiennych proste i złożone. Programowanie komputerów. Tablica. Złożone typy zmiennych. Klasa. Struktura

C++ - [4-7] Polimorfizm

private - oznacza, że wszystkie elementy klasy bazowej zmieniają się w prywatne.

PARADYGMATY PROGRAMOWANIA Wykład 3

Programowanie obiektowe


Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

dr inż. Jarosław Forenc

Wartości domyślne, szablony funkcji i klas

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

Wprowadzenie do szablonów klas

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Podstawy Programowania Podstawowa składnia języka C++

0.1 Hierarchia klas Diagram Krótkie wyjaśnienie

Lista dwukierunkowa - przykład implementacji destruktorów

Wstęp do programowania

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Laboratorium 2. Funkcje wirtualne

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

Plik pobrano z Tytuł: Wzorce projektowe, cz. 2 Strategy Ostatnia aktualizacja:

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

Wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Laboratorium 3. Instrukcje wyboru

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Metodyki zwinne wytwarzania oprogramowania

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

Transkrypt:

Maszyny stanów Programowanie gier bez Unity, cz. 3 Piotr Korgul Koło Naukowe Twórców Gier Polygon 3 grudnia 2014 r.

Cykl Programowanie gier bez Unity 1 Jak zorganizować prace nad grą? 2 Jak działa gra? 3 Maszyny stanów 4 Zarządzanie zasobami 5 Wstęp do AI

Plan prezentacji 1 Problem 2 Próby rozwiązania 3 Maszyna stanów 4 Inne zastosowania 5 Podsumowanie

Problem

Menu główne [Esc] wyjście, [1] wybór poziomu, [2] creditsy

Credits [Esc] powrót do menu głównego

Wybór poziomu [1] poziom pierwszy

Rozgrywka [Esc] wyjście z gry

Próby rozwiązania

Rozwiązanie nr 1 Zajmujemy się handleinput() w pętli głównej. void handleinput ( Input input ) { if ( input == KEY_ESC ) { exit (); Na razie wszystko w porządku.

Rozwiązanie nr 1 Dodajmy creditsy puszczenie filmu: void handleinput ( Input input ) { if ( input == KEY_ESC ) { exit (); else if (input == KEY 2) { startdisplayingcredits(); Kto widzi buga?

Rozwiązanie nr 1 Naprawiamy buga: void handleinput ( Input input ) { if ( input == KEY_ESC ) { exit (); else if ( input == KEY_2 ) { if (!displayingcredits) { displayingcredits = true; startdisplayingcredits ();

Rozwiązanie nr 1 Dodajmy możliwość przedwczesnego wyjścia z creditsów: void handleinput ( Input input ) { if ( input == KEY_ESC ) { if (!displayingcredits) { exit (); else { displayingcredits = false; stopdisplayingcredits(); else if ( input == KEY_2 ) { if (! displayingcredits ) { displayingcredits = true ; startdisplayingcredits ();

Rozwiązanie nr 1 Dodajmy możliwość wybrania poziomu: void handleinput ( Input input ) { if ( input == KEY_ESC ) { //... else if (input == KEY 1) { showlevelstochoose(); else if ( input == KEY_2 ) { //... Kto widzi buga?

Rozwiązanie nr 1 Naprawiamy buga: void handleinput ( Input input ) { if ( input == KEY_ESC ) { //... else if ( input == KEY_1 ) { if (!displayinglevels) { displayinglevels = true; showlevelstochoose (); else if ( input == KEY_2 ) { //... Kto widzi kolejnego buga?

Rozwiązanie nr 1 Naprawiamy buga: void handleinput ( Input input ) { if ( input == KEY_ESC ) { //... else if ( input == KEY_1 ) { if (! displayinglevels &&!displayingcredits) { displayinglevels = true ; showlevelstochoose (); else if ( input == KEY_2 ) { //... Mamy jeszcze jednego buga. Jakiego?

Rozwiązanie nr 1 Naprawiamy buga: void handleinput ( Input input ) { if ( input == KEY_ESC ) { if (! displayingcredits &&!displayinglevels) { exit (); else if (!displayinglevels) { displayingcredits = false ; stopdisplayingcredits (); else if ( input == KEY_1 ) { //... else if ( input == KEY_2 ) { //... To nie koniec bugów! Kto wie, jakiego jeszcze mamy?

Rozwiązanie nr 1 Naprawiamy buga: void handleinput ( Input input ) { if ( input == KEY_ESC ) { //... else if ( input == KEY_1 ) { //... else if ( input == KEY_2 ) { if (! displayingcredits &&!displayinglevels) { displayingcredits = true ; startdisplayingcredits (); I tak dalej...

Rozwiązanie nr 1 Ostatecznie (1/3): void handleinput ( Input input ) { if ( input == KEY_ESC ) { if (! displayingcredits &&! displayinglevels ) { exit (); else if (! displayinglevels &&! runninggame ) { displayingcredits = false ; stopdisplayingcredits ();

Rozwiązanie nr 1 Ostatecznie (2/3): else if ( input == KEY_1 ) { if (! displayinglevels &&! displayingcredits &&! runninggame ) { displayinglevels = true ; showlevelstochoose (); else if ( displayinglevels ) { runninggame = true ; rungame (1) ;

Rozwiązanie nr 1 Ostatecznie (3/3): else if ( input == KEY_2 ) { if (! displayingcredits &&! displayinglevels &&! runninggame ) { displayingcredits = true ; startdisplayingcredits ();

Problemy z tym rozwiązaniem Właściwie same problemy, brak zalet

Inne ujęcie problemu

Inne ujęcie problemu

Inne ujęcie problemu

Inne ujęcie problemu

Inne ujęcie problemu

Inne ujęcie problemu Obserwacja: możemy się znajdować tylko w jednym stanie jednocześnie. Zatem flagi displayinglevels, displayingcredits są bez sensu. Wystarczy jedna zmienna. Może enum?

Rozwiązanie nr 2 void handleinput ( Input input ) { switch ( currentstate ) { case MAIN_MENU : if ( input == KEY_ESC ) { exit (); else if ( input == KEY_1 ) { showlevelstochoose (); currentstate = LEVEL_CHOICE ; else if ( input == KEY_2 ) { startdisplayingcredits (); currentstate = CREDITS ; break ;

Rozwiązanie nr 2 case CREDITS : if ( input == KEY_ESC ) { stopdisplayingcredits (); currentstate = MAIN_MENU ; break ; case LEVEL_CHOICE : if ( input == KEY_1 ) { rungame (1) ; currentstate = GAME ; break ; case GAME : if ( input == KEY_ESC ) { exit (); break ;

Wady i zalety tego rozwiązania Dużo prostsze i bardziej eleganckie Łatwe do zrozumienia Dużo mniej podatne na błędy Uciążliwe dodawanie kolejnych scen Bardzo długie funkcje Trudno zrobić animowane przejścia Tak naprawdę to już jest maszyna stanów, ale jej implementacja jeszcze nas w pełni nie satysfakcjonuje

FSM

Inne ujęcie problemu

Inne ujęcie problemu

Inne ujęcie problemu

Polimorfizm przypomnienie class Zwierze { public : virtual void dajglos () = 0; ; class Pies : public Zwierze { public : void dajglos () { cout << " Hau hau " << endl ; ; class Kot : public Zwierze { public : void dajglos () { cout << " Miau miau " << endl ; ; class Krowa : public Zwierze { public : void dajglos () { cout << " Muuuu " << endl ; ;

Polimorfizm przypomnienie Zwierze * zwierzeta [3] = { new Pies, new Kot, new Krowa ; for ( int i = 0; i < 3; i ++) { zwierzeta [i]-> dajglos (); Wynik działania programu: Hau hau Miau miau Muuuu

Implementacja class State { // lub Screen, Scene,... public : virtual void handleinput ( Input ) = 0; virtual void update ( float ) = 0; virtual void render () = 0; virtual void show () = 0; virtual void hide () = 0; ;

Implementacja class StateMachine { // lub ScreenManager, Director,... private : State * currentstate ; public : void handleinput ( Input ); void update ( float ) void render (); void changestate ( State *); ;

Implementacja void StateMachine :: handleinput ( Input input ) { currentstate -> handleinput ( input ); void StateMachine :: update ( float deltatime ) { currentstate -> update ( deltatime ); void StateMachine :: render () { currentstate -> render (); void StateMachine :: changestate ( State * newstate ) { currentstate -> hide (); delete currentstate ; currentstate = newstate ; currentstate -> show ();

Implementacja class MainMenu : public State { public : void handleinput ( Input ); void update ( float ) void render (); void show (); void hide (); ; void MainMenu :: handleinput ( Input input ) { if ( input == KEY_ESC ) { exit (); else if ( input == KEY_1 ) { // showlevelstochoose (); statemachine - > changestate ( new LevelChoice ); else if ( input == KEY_2 ) { // startdisplayingcredits (); statemachine - > changestate ( new Credits );

Implementacja class Credits : public State { // handleinput, update, render, show, hide ; void Credits :: handleinput ( Input input ) { if ( input == KEY_ESC ) { // stopdisplayingcredits (); statemachine - > changestate ( new MainMenu ); void Credits :: show () { startdisplayingcredits (); void Credits :: hide () { stopdisplayingcredits ();

Implementacja class LevelChoice : public State { // handleinput, update, render, show, hide ; void LevelChoice :: handleinput ( Input input ) { if ( input == KEY_1 ) { // rungame (1) ; statemachine -> changestate ( new Game (1) ); void LevelChoice :: show () { showlevelstochoose ();

Implementacja class Game : public State { private : int level ; public : Game ( int ); // handleinput, update, render, show, hide ; Game :: Game ( int lvl ) : level ( lvl ) { void Game :: handleinput ( Input input ) { if ( input == KEY_ESC ) { exit (); void Game :: show () { rungame ( level );

Zalety Zgodne z zasadami OOP i BHP Bardzo eleganckie i mało podatne na błędy Wydzielenie funkcjonalności każdej sceny do osobnej klasy Dodawanie kolejnych scen jest proste Krótkie funkcje show(), hide()

Inne zastosowania

Przejścia pomiędzy scenami

Stany głównego bohatera

Sztuczna inteligencja

Podsumowanie

Podsumowanie uproszczenie wielu problemów lepsza organizacja kodu mniejsza podatność na błędy możliwość zastosowania w wielu sytuacjach...ale czy zawsze warto?

Literatura uzupełniająca Robert Nystrom Game Programming Patterns gameprogrammingpatterns.com

Literatura uzupełniająca Banda Czworga Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego użytku en.wikipedia.org/wiki/design Patterns