GAME DEV: tools programming. Parte 2: programming

Похожие документы
Introduzione a Qt. Marco Martin

Grafica Computazionale

SOMMARIO. Programmazione orientata agli eventi. Programmazione orientata agli eventi. Programmazione orientata agli eventi

Programmare con Qt4. Ing. Giovanni Venturi Roma, 27 ottobre Linux Day

Introduzione al mondo Qt Qt Creator, il framework e una prima applicazione

Introduzione. Costruzione di Interfacce Primi passi in OpenGL. Sierpinski Gasket. Sierpinski gasket. Event driven programming. Stuttura del programma

GLUI: GLUT-based User Interface

Luca Ottaviano. Ottimizzare applicazioni Qt Gui. Firenze, 8 luglio 2013

Introduzione SOMMARIO

Funzioni. Il modello console. Interfaccia in modalità console

Java, Oggetti e Strutture Dati di G. Callegarin - Edizioni CEDAM

Esercitazione n 3. Obiettivi

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

Tutorial Qt software

Introduzione a OpenGL e alle GLUT

Gianni Valdambrini. Everywhere

RELAZIONE DELLA PROVA DI LABORATORIO DI INFORMATICA

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

Fondamenti di Informatica 2

C++ E QT, BINOMIO PERFETTO

Principles of Concurrent Programming

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

INTRODUZIONE AL FRAMEWORK QT

Corso di Fondamenti di Informatica Algoritmi su array / 2

LPR 2005/ 2006 Lezione n.9. Elementi di grafica per lo svolgimento del progetto Double Buffering Caricamento delle immagini Gestione degli eventi

ESERCIZIO 1 (Definizione funzioni passaggio parametri per copia)

Algoritmi su array / 2

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Tutorial Librerie Qt Parte 2

Programmazione modulare

Laboratorio 9 ( Java 4 ) Classe astratta per BFS su grafo

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

Bloodshed Dev-C++ Bloodshed Dev-C++ è l IDE usato durante le esercitazioni/laboratorio. IDE = Integrated Development Environment. Codice corso: 21012

GESTIONE DELLE PERIFERICHE D INGRESSO/USCITA ARGOMENTI

Politecnico di Torino

Le command line di Java

Linguaggio C++ Linguaggi di terza generazione

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Librerie C. Corso di Linguaggi e Traduttori 1 AA Corso di Linguaggi e Traduttori 1 AA stdio.h

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

/** * VETTORE DINAMICO elementi */ private Vector elementi; /** * METODO COSTRUTTORE */ public coda() { elementi=new Vector(); }

GESTIONE DELLE PERIFERICHE D INGRESSO/USCITA ARGOMENTI

Sistemi Operativi. Descrizione e controllo dei processi

Esercizio 1: archivio CD e DVD

Esercizi Calcolo Parallelo Algoritmi, Strutture Dati e Calcolo Parallelo. Daniele Loiacono

La sintassi del C APPENDICE H

Linguaggio C: Introduzione ad ambienti di sviluppo integrati (IDE) e a Dev-C++ Università degli Studi di Brescia

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Funzioni con numero variabile di parametri: Funzioni Variadiche in C. Massimo Benerecetti Laboratorio di Algoritmi e Strutture Dati

Corso di Programmazione Concorrente Processi. Valter Crescenzi

L ambiente di simulazione SPIM

HOMEWORKS. in modo che il programma stampi N ripetizioni della stringa HelloWorld (su righe diverse), con N inserito dall utente.

Corso di Fondamenti di Informatica

Esempio: Tombola! Vogliamo progettare una applicazione che realizza il gioco della tombola Versione semplificata: un banco, un

Creare una funzione float square(float x). La funzione deve restituire il quadrato del parametro x.

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

Alberi Binario in Java

Esercizio 1 (15 punti)

Транскрипт:

GAME DEV: tools programming Parte 2: programming Marco Tarini Tools per programmare un tool: 1. Tools per GUI programming 2. API grafiche (opengl, directx) 3. Interfacciamento con SO (sist. op.) finestre (o fullscreen) mouse, keyboard, joystick timers eventi double buffering 4. Ambiente di sviluppo (IDE IDE) 5. libs per strutture dati come liste vettori alberi 6. libs per immagini geometria 1

QT fa anche strutture dati base + algoritmi (module: qtcore) qvector, qset, qlist, qstring, <== simile a STL, ma meno completo multi-threading (module: qtcore) networking (module: qtnetworking) TCP, UDP video e audio (module: qtphonon) formati file (mp3, mpeg) XML (e html) (module: qtxml) databases (module: qtsql) portable devices x Symbian: simulazione, OpenGL ES tools di supporto sviluppo: style sheets for GUI (QML) traduzioni (QT Linguist) version control (sia SVN che Hg-Mercury) GUIs: WYSIWYG editor in QT-creator Struttura programma nel paradigma Event-Based Sistema a eventi main() init(); while (true) ciclo get_event() ; degli process_event(); eventi eventi tipo: mouse, tastiera... sistema di finistre reshape, minimizzazione... generati dall'applicazione stessa o da thread differenti 2

Esempio: applicazione con lib SDL int main() SDL_Init(SDL_INIT_VIDEO); SDL_SetVideoMode(640, 480, 0, SDL_OPENGL); ciclo degli eventi bool done = false; while (! done ) /* ciclo degli eventi */ SDL_Event event; SDL_WaitEvent(&event); switch(event.type) case SDL_VIDEOEXPOSE: /* evento "ridisegnati" */ myrendering(); /* riempi screen buffer*/ break; case SDL_QUIT: done = true; break ; case SDL_KEYDOWN: if ( event.key.keysym.sym == SDLK_ESCAPE ) done = true; break; SDL_Quit(); return 1; Programmare un Event-Based con CallBack CallBack: funzione preposta alla gestione di un evento in (free)glut, un funtore da registrare per ogni evento void myrendering() // la mia callback per l evento disegnati... void main() glutdisplayfunc ( myrendering ); // registra la callback... 3

Programmare un Event-Based con CallBack void mia_display_callback() glclearcolor( 0,0,0,0); glclear( GL_COLOR_BUFFER_BIT ); glbegin(gl_triangles); glvertex2d(-1,-1); glvertex2d(0,1); glvertex2d(1,0); glend(); glutswapbuffers(); // x double buffering int main(int argc, char** argv) glutinit(&argc, argv); glutinitdisplaymode(glut_rgb GLUT_DOUBLE); glutcreatewindow("a test"); glutdisplayfunc( mia_display_callback ); return 0; Programmare un Event-Based con CallBack void mia_reshape_callback( int size_x, int size_y) // la finestra e cambiata // (ora e grande size_x X size_ypixel //... che voglio fare? int main(int argc, char** argv) glutinit(&argc, argv); glutinitdisplaymode(glut_rgb GLUT_DOUBLE); glutcreatewindow("a test"); glutdisplayfunc( mia_display_callback ); glutreshapefunc( mia_reshape_callback ); return 0; 4

Programmare un Event-Based con CallBack void mia_keyboard_callback( char c, int x, int y) // l utente ha premuto il tasto c // (mentre il pointer era in pos x,y (viewport coords) //... che voglio fare? int main(int argc, char** argv) glutinit(&argc, argv); glutinitdisplaymode(glut_rgb GLUT_DOUBLE); glutcreatewindow("a test"); glutdisplayfunc( mia_display_callback ); glutreshapefunc( mia_reshape_callback ); glutkeyboardfunc( mia_keyboard_callback ); return 0; Programmare un Event-Based con CallBack void mia_keyboard_callback( char c, int x, int y) // l utente ha premuto il tasto c // (mentre il pointer era in pos x,y (viewport coords) //... che voglio fare? int main(int argc, char** argv) glutinit(&argc, argv); glutinitdisplaymode(glut_rgb GLUT_DOUBLE); glutcreatewindow("a test"); glutdisplayfunc( mia_display_callback ); glutreshapefunc( mia_reshape_callback ); glutkeyboardfunc( mia_keyboard_callback ); return 0; 5

Parentesi: Double buffering Piccolo trucco utile nelle applicazioni interattive nascondere il frame buffer mentre viene riempito evita flickering ( sfarfallio ) Vertici proiettati (punti in R 2 ) punti triangoli segmenti frammenti (candidati pixels) computazioni per frammento frame buffer A [ pronto ] frame buffer B [ in costruzione ] al video A Parentesi: Double buffering Piccolo trucco utile nelle applicazioni interattive nascondere il frame buffer mentre viene riempito evita flickering ( sfarfallio ) Vertici proiettati (punti in R 2 ) punti triangoli segmenti frammenti (candidati pixels) computazioni per frammento frame buffer A [ in costruzione ] frame buffer B [ pronto ] al video B 6

Programmare un Event-Based con SIGNALS e SLOTS Object1 signal1 signal2 connect(object1, signal1, Object2, slot1) connect(object1, signal1, Object2, slot2) Object2 signal1 Object3 signal1 slot1 connect ( Object1, signal2, Object4, slot1 ) Object4 slot1 slot2 connect(object3, signal1, Object4, slot3) slot1 slot2 slot3 QT: slots, signals, e connect class A : public class QObject Q_OBJECT public: A(); // costruttore protected:...; public slots: void unmetodo( ); // uno slot! ; class B : public class QObject Q_OBJECT signals: void untrigger( ); // un signal! ; quando a emette quel segnale ==> b deve eseguire quel metodo (da B: emit untrigger( ); ) A *a = new A(); B *b = new B(); connect( b, SIGNAL( untrigger() ), a, SLOT( unmetodo() ) ); 7

QT: slots, signals, e connect class A : public class QObject Q_OBJECT public: A(); // costruttore protected:...; public slots: void unmetodo( int ); // uno slot! ; class B : public class QObject Q_OBJECT signals: void untrigger( int ); // un signal! ; quando a emette quel segnale ==> b deve eseguire quel metodo (da B: emit untrigger(5); ) A *a = new A(); B *b = new B(); connect( b, SIGNAL( untrigger( int ) ), a, SLOT( unmetodo( int ) ) ); QT: un hello-world #include <QApplication> class MiaMainWindow:public QWidget public: MiaMainWindow ():QWidget(0) setwindowtitle( Hello World"); ; int main(int argc, char** argv) QApplication app(argc, argv); MiaMainWindow win; win.show(); return app.exec(); 8

QT classes signals & slots QObject QWidget QSlider QWindow QButton Stringhe in QT #include <QString> void Pippo() Persona pers; QString a a = QString( La persona %1 ha %2 anni (%3 - %4 = %2) ).arg( pers.nome ) // argomento 1 (un char*).arg( pers.eta() ) // argomento 2 (un int).arg( pers.annonascita ) // argomento 3 (un int).arg( ANNO_CORRENTE ) // argomento 4 (un unsigned int) ; La persona Mario ha 22 anni (2012-1990 = 22) 9