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

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

Metody Metody, parametry, zwracanie wartości

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Podstawy programowania obiektowego

Wykład 4: Klasy i Metody

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie obiektowe i zdarzeniowe

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Systemy Rozproszone - Ćwiczenie 6

Co jeszcze mogą nam dać adnotacje? Adam Warski

Java: interfejsy i klasy wewnętrzne

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

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

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

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

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

Lista dwukierunkowa - przykład implementacji destruktorów

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

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Testowanie II. Celem zajęć jest zapoznanie studentów z oceną jakości testów przy wykorzystaniu metryk pokrycia kodu testami (ang. code coverage).

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Dokumentacja do API Javy.

Języki i techniki programowania Ćwiczenia 2

Identyfikacje typu na etapie. wykonania (RTTI)

Programowanie obiektowe

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Programowanie obiektowe

Programowanie obiektowe

Programowanie obiektowe

Programowanie obiektowe

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Szablony funkcji i szablony klas

Programowanie w środowiskach graficznych. Wykład 4 Język C# cd

11.6 Klasa do obsługi liczb wymiernych

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

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

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

Definiowanie własnych klas

Rozdział 4 KLASY, OBIEKTY, METODY

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

W powyższym kodzie utworzono wyliczenie dni tygodnia.

Enkapsulacja, dziedziczenie, polimorfizm

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

Michał Jankowski. Remoting w.net 2.0

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

C++ język nie dla ludzi o słabych nerwach. Małgorzata Bieńkowska

Języki i techniki programowania Ćwiczenia 4 Wzorce

Ekspert radzi. mechanizm w enova, umożliwiający wskazanie domyślnej drukarki dla danego stanowiska i wydruku. Strona 1 z 8. Ekspert radzi.

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

Zaawansowane programowanie w C++ (PCP)

Wykład 5: Więcej o Klasach i Metodach

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

Polimorfizm. dr Jarosław Skaruz

Podstawy i języki programowania

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

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Klasy i obiekty cz I Klasy, obiekty, podstawy używania obiektów

Programowanie Komputerów

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Referencje do zmiennych i obiektów

Platformy Programistyczne Podstawy języka Java

Podstawy Programowania Obiektowego

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

Kiedy potrzebne. Struktura (rekord) Struktura w języku C# Tablice struktur. struktura, kolekcja

Języki i metody programowania Java. Wykład 2 (część 2)

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Laboratorium 1 - Programowanie proceduralne i obiektowe

Programowanie obiektowe

Przykład -

TEMAT : KLASY DZIEDZICZENIE

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

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

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

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

Programowanie obiektowe

Przypomnienie o klasach i obiektach

Programowanie, część I

Leszek Stasiak Zastosowanie technologii LINQ w

Programowanie obiektowe

Podstawy programowania obiektowego

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

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

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

Aplikacje w Javie- wykład 11 Wątki-podstawy

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

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

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

Poznaj ASP.NET MVC. Kamil Cieślak Microsoft Student Partner

Programowanie obiektowe i zdarzeniowe

Zaawansowane aplikacje WWW - laboratorium

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Transkrypt:

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

Przykład z życia

Jasełki

Jasełki 1. Narodziny Jezuska 2. Pojawienie się gwiazdy 3. Przybycie pastuchów i mędrców (x: 100, y: -50) 4. Przekazanie prezentów (mirra) 5. Jezusek otrzymał prezent (mirra, true) 4. Przekazanie prezentów (kadzidło) 5. Jezusek otrzymał prezent (kadzidło, true) 4. Przekazanie prezentów (złoto) 5. Jezusek otrzymał prezent (złoto, false) 6. Kurtyna, wszyscy idą spać

Eventy w C# (Unity)

Delegacje (C#) delegate void DelegateType(int a); public void Demo() DelegateType deleg = Foo; deleg(1); // wynik: // foo: 1 void Foo(int x) Console.WriteLine("foo: " + x); deleg = Bar; deleg(2); // wynik: // bar: 2 void Bar(int y) Console.WriteLine("bar: " + y); deleg = null; deleg += Foo; deleg += Bar; deleg(3); // wynik: // foo: 3 // bar: 3

Eventy (C#) class EventInvoker public delegate void DelegateType(int x); public event DelegateType SomethingInterestingHappened; private void DoStuff() SomethingInterestingHappened(5); class EventListener private EventInvoker eventinvoker; public EventListener(EventInvoker ei) eventinvoker = ei; // eventinvoker.somethinginterestinghappened = EventHandler; // niedozwolone // eventinvoker.somethinginterestinghappened = null; // niedozwolone eventinvoker.somethinginterestinghappened += EventHandler; // ok // eventinvoker.somethinginterestinghappened(10); // niedozwolone private void EventHandler(int param) Console.WriteLine("EventListener received an event that something " + "interesting happened in EventInvoker. Parameter: " + param);

Eventy w Unity public class EventManager public static /* some public static /* some public static /* some public static /* some type type type type */ */ */ */ ScreenChanged; UserTapped; GamePaused; MainMenuShown; public class UserTappedEventArgs : EventArgs public readonly int X; public readonly int Y; public UserTappedEventArgs(int x, int y) X = x; Y = y; class Foo public Foo() EventManager.UserTapped += OnUserTapped; private void OnUserTapped(UserTappedEventArgs args) Console.WriteLine("User tapped. Coords: (" + args.x + ", " + args.y + ")"); class UserInterface void HandleInput() //... EventManager.UserTapped( new UserTappedEventArgs(300, 500) ); //...

Eventy w Unity public class EventManager public static /* some public static /* some public static /* some public static /* some type type type type */ */ */ */ ScreenChanged; UserTapped; GamePaused; MainMenuShown; Do każdego eventu musimy zdefiniować typ delegacji, np. void DelegateType(UserTappedEventArgs args) Jeśli skorzystamy z C#-owego eventu, to nie będziemy mogli wywołać go spoza klasy EventManager Rozwiązanie: public class EventInvoker<T> where T : EventArgs public delegate void DelegateType(T args); public event DelegateType Listeners = null; public void Invoke(T args) if (Listeners == null) return; if (args == null) Debug.LogError("Event Arguments cannot " + "be null, ignoring an event"); return; Listeners.Invoke(args);

Eventy w Unity public class EventManager public static EventInvoker<UserTappedEventArgs> UserTapped = new EventInvoker<UserTappedEventArgs>(); class Foo public Foo() EventManager.UserTapped.Listeners += OnUserTapped; class UserInterface void HandleInput() //... EventManager.UserTapped.Invoke(new UserTappedEventArgs(300, 500)); //......a gdy dużo eventów: partial class / kilka EventManagerów

Eventy w C++

Eventy w C++ Podobnie jak w C#, tylko samemu trzeba napisać odpowiednik C#-owego delegate / event std::function FastDelegate (by Don Clugston) szybkie modyfikowanie listy podczas przechodzenia po niej Czas wysłania i odebrania 10 mln eventów 6 5 czas [s] 4 std::function FastDelegate 3 2 1 0 MSVC, release g++, release (-O2)

Eventy w C++ (inne podejście) Stworzenie klasy UserTappedEventArgs = stworzenie nowego typu eventu Wszystkie delegacje typu void(eventargs*) wewnątrz rzutujemy np. na UserTappedEventArgs* Wówczas możemy trzymać wszystkie eventy w jednej mapie: std::map(eventtype, MyList<MyDelegate(void, EventArgs*)>) Nie musimy tworzyć pola do każdego eventu EventType? Można skorzystać z typeid (np. hash_code()) Z szablonami można to wszystko zrobić bez alokacji pamięci

Eventy w Unreal Engine 4

Eventy w Unreal Engine 4 np. GameMode

Eventy w Unreal Engine 4 Blueprint wroga

Eventy w Unreal Engine 4 Blueprint gracza

Eventy w Unreal Engine 4 Implementacja w C++

Eventy w Unreal Engine 4 Implementacja w C++

Podsumowanie

Eventy... pomagają pozbyć się zapętlonych referencji pomagają osiągnąć modularny kod upraszczają dodawanie nowych funkcjonalności są proste w implementacji pozwalają pisać bezpieczny kod w niektórych przypadkach mogą być znacznie szybsze, niż sprawdzanie tego samego warunku na wielu obiektach

Jednak... czasami mogą być trudne w debugowaniu trzeba pamiętać o wyrejestrowaniu obiektu, który zostaje zniszczony nie można rejestrować się do eventu, który właśnie się wykonuje należy korzystać z nich ostrożnie i w granicach zdrowego rozsądku

Literatura uzupełniająca Mike McShaffry, David Graham Game Coding Complete, Fourth Edition (rozdział 11: Game Event Management )

Literatura uzupełniająca Robert Nystrom Game Programming Patterns (gameprogrammingpatterns.com/observer.html)

Literatura uzupełniająca Don Clugston Member Function Pointers and the Fastest Possible C++ Delegates (www.codeproject.com/articles/7150/member-function-pointers-and-the-fastest-possible)

Dziękujemy za uwagę