1. 2 Heute entwickeln wir eine kleine DirectInput-Bibliothek,auf die wir bei unseren zukünftigen Projekten immer wieder zurückgreifen werden. Die Themen.

Slides:



Advertisements
Ähnliche Präsentationen
PC-Senioren Ludwigsburg
Advertisements

Objektorientierte Programmierung
C Tutorium – Fehlerbehandlung – Knut Stolze. 2 Grundsatz Also ist auch nach jedem Funktionsaufruf auf Fehler zu prüfen!! Jeder(!) Funktionsaufruf kann.
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
der Universität Oldenburg
Java: Objektorientierte Programmierung
Indirekte Adressierung
FH-Hof Indirekte Adressierung Richard Göbel. FH-Hof Einfache Speicherung von Daten Eine "einfache" Deklaration definiert direkt eine Speicherplatz für.
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Dateihandles Um in Perl eine bestimmte Datei zum Lesen, Schreiben oder Anhängen zu öffnen, benötigt man so genannte Dateihandles. Ein Dateihandle ist der.
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
Parameterübergabe von zweidimensionalen Feldern in Funktionen.
Polymorphie (Vielgestaltigkeit)
Polymorphie (Vielgestaltigkeit)
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
Nils Jagdfeld, Patrick Gunia
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 10 Claudio Moraga; Gisbert Dittrich FBI Unido
Programmieren mit JAVA
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
14StrukturKlasse1 Von der Struktur zur Klasse von C zu C++ Von Jens Hoffmann
DVG Klassen und Objekte
Wir müssen also überlegen: Implementierung der Knoten, Implementierung der Kanten, daraus: Implementierung des Graphen insgesamt. Annahme: die Knoteninhalte.
© 2005 Pohlig - Taulien Datenströme GK Informatik 1 Datenströme.
Anlegen von Ordnern, speichern und Öffnen von Bildern und Briefen
XNA 3D Tutorial Anzeigen eines Objektes. Inhalt Lernen Sie, wie Sie Modelle implementieren. Initializing Lernen Sie, wie Sie Modelle aus der Content Directory.
Der Aufbau eines Computers
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Game Development mit LUA Integration und Kommunikation von LUA mit C++ Referat von Paul van Hemmen Seminar: Reusable Content in 3D und Simulationssystemen.
Von der Planung bis zum Hauptmenü Seminar: Softwaretechnologie II Dozent: Prof. Manfred Thaller Referent: Jan Bigalke.
1. Verhalten der Objekte: Operationen Werden in den Klassen definiert Werden (i.d.R.) auf einem Objekt aufgerufen Wird das Empfängerobjekt genannt Weitere.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2011/12 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmiersprache C 4
Vom Umgang mit Daten. public void myProgram() { int[] saeulenWerte = new int[world.getSizeX()]; for (int i = 0; i < saeulenWerte.length; i++) { saeulenWerte[i]
HORIZONT 1 XINFO ® Das IT - Informationssystem PL/1 Scanner HORIZONT Software für Rechenzentren Garmischer Str. 8 D München Tel ++49(0)89 / 540.
Dynamische Datentypen
Ganzheitliches Projekt-, Ressourcen- und Qualitätsmanagement 1 Reports und AddOns Auf den folgenden Seiten wird Ihnen die Funktionsweise der Reports und.
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen Übungsmodul 5 Dr. W. Narzt u. Dr. A. Stritzinger.
Grundkonzepte des Programmierens (mit ActionScript)
Vortrag: Visual Basic Neuerungen Autor : Dennis Hoyer
CuP - Java Vierte Vorlesung Entspricht ungefähr Kapitel 2.1 des Skriptums Montag, 14. Oktober 2002.
Variablen. var meineZahl:Number = 7; meineZahl 7 Name TypWert = Zuweisung von Variablen.
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
A Workshop About this chapter General description Units Time Schedule
Historisch-Kulturwissenschaftliche Informationsverarbeitung Übung: Softwaretechnologie II / Visuelle Programmierung Dozent: Prof. Dr. Manfred Thaller WS.
Einführung in die Programmierung mit Java
Einführung in die Programmierung mit Java
Institut für Kartographie und Geoinformation Prof. Dr. L. Plümer, Dipl.-Ing. D. Dörschlag, Dr. G. Gröger Einführung in die Programmierung mit Java 13.
Vieren - Programmierung Im Jahre 1981 traten die ersten Viren auf, die noch sehr einfach gestrickt waren, und nicht sehr destruktiv waren. Mittlerweile.
Pointer. Precompiled Header  Vorübersetzung eingebundener Dateien häufig genutzt, selten geändert  Projekttyp „Win32 Console Application“
Tutorium Software-Engineering SS14 Florian Manghofer.
C++ FÜR cOMPUTERSPIELENTWICKLER
Ein Spiel mit der SDL - Teil I. Ein Spiel mit der SDL  kostenlose Bibliothek – Simple DirectMedia Layer Grafik darstellen Benutzereingaben abfragen Sounds.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Strukturen (Eigenschaften) Strukturen dienen zur Zusammenfassung mehrerer Komponenten verschiedener Typen zu einer Einheit, die dann mit gemeinsamen Namen.
Tutorium Software-Engineering SS14 Florian Manghofer.
Konstruktoren.
Implementieren von Klassen
 Präsentation transkript:

1

2 Heute entwickeln wir eine kleine DirectInput-Bibliothek,auf die wir bei unseren zukünftigen Projekten immer wieder zurückgreifen werden. Die Themen heute: Initialisierung von DirectInput Initialisierung von Maus, Tastatur und Joystick Abfrage der Maus-, Tastatur- und Joystickdaten

3 Verwendung der DirectInput-Bibliothek (1) Am heutigen Tag werden wir ein einfaches Demoprogramm schreiben, in dem der Umgang mit DirectInput demonstriert wird. In diesem Zusammenhang werden wir eine einfache DirectInput-Bibliothek schreiben, welche in der Datei GiveInput.h implementiert ist. Um diese Datei nutzen zu können, muss die Datei in das entsprechende Projekt mit eingebunden und die folgende Initialisierungsfunktion aufgerufen werden: InitDirectInput (hinstance_app,main_window_handle); Diese Funktion übernimmt neben der eigentlichen Initialisierung von DirectInput auch die Initialisierung eines Tastatur-, Maus- und Joystick-Objekts. Der Aufruf erfolgt aus der Funktion GameInitialisierungsRoutine() heraus. Bei unseren Projekten werden wir die DirectInput Bibliothek immer in die Datei Space3D.h einbinden. // Standard-Includes // #include #include "d3dutil.h" #include "d3dfont.h" #include "dxutil.h" #include "DXSubstitutions.h" #include "GameExternals.h" #include "D3DGlobals.h" #include "CoolMath.h" #include "tempGlobals.h" #include "TextureClasses.h" #include "GameGlobals.h" #include "VertexFormats.h" #include "BillboardFunctions.h" // // Funktionsprototypen // void InitSpieleinstellungen(void); void CleanUpD3D(void); void InitD3D(void); void Init_View_and_Projection_Matrix(void); void Show_3D_Scenario(void); // // zusätzliche Includes // //Die Datei GiveInput.h sollte immer als #include "GiveInput.h" //letztes mit eingebunden werden. So //muss man alle für die Spielsteuerung //benötigten globalen Variablen nicht als //externe Variable deklarieren.

4 Verwendung der DirectInput-Bibliothek (2) Bei Programmende muss die Funktion FreeDirectInput() aufgerufen werden, die dann alle Aufräumarbeiten erledigt. Der Aufruf erfolgt aus der Funktion GameCleanUpRoutine() heraus. Die Funktionen void ReadImmediateDataKeyboard(void); void ReadImmediateMouse(void); void ReadImmediateJoystick(void); werden zur Abfrage der ungepufferten Tastatur-, Maus- und Joystick-Eingaben verwendet. Ihr Aufruf erfolgt aus der Funktion GameMainRoutine() (die Game-Loop) heraus. Da alle Funktionalitäten der DirectInput-Bibliothek aus den in GameRoutines.cpp definierten Funktionen heraus aufgerufen werden, müssen die Bibliotheksfunktionen in der Datei GameRoutines.h als externe Funktionen deklariert werden:

5 Spielsteuerungs-Demoprogramm Zur Demonstration der Arbeitsweise unserer DirectInput-Bibliothek werden wir ein kleines Programm schreiben, in dem Maus-, Tastatur- und Joystick-Nachrichten entgegengenommen und auf dem Bildschirm angezeigt werden. Die Tastatur-Nachrichten werden in eine Zeichenkettenvariable geschrieben und angezeigt. Bei gedrückt gehaltener Taste wird nur einmal auf die Nachricht reagiert.

6 Globale Variablen, Definitionen, Header-Dateien und Funktionsprototypen Folgende Zeiger werden für die Arbeit mit dem DirectInput-Hauptinterface sowie mit den Tastatur-, Maus- und Joystick-Objekten verwendet: Weitere Variablen: DIDEVCAPS g_diDevCaps; // Eigenschaften der verwendeten Eingabegeräte HRESULT hr; // Rückgabewert der Initialisierung (S_OK/S_FALSE) static char buffer[256]; // Puffer für Tastatureingaben,256 Tasten DIMOUSESTATE2 dims2; // Datenformat für die Mause-Nachrichten DIJOYSTATE2 js; // Datenformat für die Joystick-Nachrichten Folgende Variablen werden für die Behandlung von Tastatur- Funktionsprototypen: Nachrichten verwendet, unter der Annahme, dass bei gedrückt Gehaltener Taste nur einmal auf die Nachricht reagiert wird:

7 Initialisierung des DirectInput-Hauptinterface Für die Initialisierung des DirectInput-Hauptinterface sowie der einzelnen DirectInput-Objekte verwenden wir die Funktion InitDirectInput(). Als Parameter übergeben wir das Handle der Instanz unserer Windows-Anwendung sowie das Handle des zugehörigen Windows-Fensters. Für die Erzeugung des DirectInput-Hauptinterface steht die Funktion DirectInput8Create() zur Verfügung. Als Parameter erwartet diese Funktion das Handle unserer Anwendungsinstanz hinstance,die in der Datei dinput.h definierte Konstante IID_IDirectInput8 sowie den Zeiger g_pDI, der nach Erzeugung des DirectInput- Hauptinterface auf dessen Speicheradresse zeigt. Nachdem das Hauptinterface erfolgreich erzeugt wurde, werden nacheinander das Tastatur-, Maus- und Joystick-Objekt initialisiert. Bei erfolgreicher Initialisierung gibt die Funktion den Rückgabewert S_OK,andernfalls S_FALSE zurück.

8 Initialisierung eines Tastatur-Objekts Für die Initialisierung des Tastatur-Objekts sind vier Schritte erforderlich: I Schritt: Tastatur-Objekt erzeugen II Schritt: Datenformat festlegen III Schritt: Zugriffsrecht festlegen IV Schritt: Gerät akquirieren Im ersten Schritt wird mittels der DirectInput-Methode CreateDevice() das Tastatur-Objekt erzeugt. Als Parameter werden übergeben den Guid des zu erzeugenden Geräts und einen Zeiger, der nach erfolgreicher Initialisierung auf die Speicheradresse des Keyboard-Objekts zeigt. Der dritte Parameter ist nicht von Bedeutung und wird auf Null gesetzt. Im zweiten Schritt muss das Datenformat festgelegt werden, in welchen die empfangenen Daten zurückgegeben werden. Im dritten Schritt muss das Zugriffsrecht auf das Gerät festgelegt werden. In unserem Beispiel verfügt DirectInput über ein nichtexklusives Zugriffsrecht auf die Tastatur, wenn die Anwendung gerade aktiv ist. Die Anwendung wird über das Handle des Windows-Fensters identifiziert. Im vierten Schritt muss die Tastatur akquiriert werden, d.h. DirectInput übernimmt den Zugriff.

9 I Schritt II Schritt III Schritt IV Schritt

10 Initialisierung eines Maus-Objekts Die Initialisierung des Maus-Objekts verläuft analog zur Initialisierung des Tastatur-Objekts: I Schritt: Maus-Objekt erzeugen II Schritt: Datenformat festlegen III Schritt: Zugriffsrecht festlegen IV Schritt: Gerät akquirieren

11 Initialisierung eines Joystick-Objektes Hierbei handelt es sich nicht um ein Standartgerät, deswegen ist mehr Arbeit erforderlich. Aus diesem Grund schreiben wir erst einmal zwei Callback-Funktionen, die uns bei der Initialisierung behilflich sein werden. Die erste Funktion EnumJoysticksCallback () initialisiert den ersten gefundenen Joystick. Bei einem Fehlschlag wird die Funktion zum zweiten Mal aufgerufen und versucht den zweiten Joystick zu initialisieren. Dies wird so lange wiederholt, bis keine weiteren Joysticks mehr gefunden werden.

12

13 Die zweite Callback-Funktion EnumAxesCallback() hat die Aufgabe, joystickspezifische Eigenschaften der Achsen sowie deren Wertebereiche festzulegen. In unserem Beispiel wird den Achsen ein Wertebereich von bis zugeordnet. Hierzu wird eine Struktur vom Typ DIPROPRANGE benötigt. Weiterhin wird überprüft, ob der Joystick eine x- bzw. y-Achse hat. Wenn das der Fall ist, werden die Variablen JoystickXAxis bzw.JoystickYAxis auf TRUE gesetzt, was zur Folge hat, dass die jeweiligen Achsen-Informationen angezeigt werden.

14

15 Die Initialisierung des Joysticks läuft vom Prinzip her genauso wie die der Standartgeräte. Im ersten Schritt wird zur Initialisierung des Joystick-Objekts nun aber die Callback-Funktion EnumJoysticksCallback() durch die DirectInput-Hauptinterface-Methode EnumDevices() aufgerufen. Im zweiten und dritten Schritt werden das Zugriffsrecht sowie das verwendete Datenformat festgelegt. Im vierten Schritt werden die joystickspezifischen Eigenschaften der Achsen sowie deren Bereiche festgelegt. Zu diesem Zweck wird jetzt die Callback-Funktion EnumAxesCallback() durch die DirectInput Hauptinterface- Methode EnumObjects() aufgerufen. Zum Schluss wird der Joystick akquiriert.

16

17 Abfrage der Tastatur-Nachrichten Im ersten Schritt bei der Tastatur-Abfrage wird die Methode GetDeviceState() aufgerufen. Wenn dieser Aufruf fehlschlägt, das Tastatur-Objekt aber erfolgreich initialisiert wurde, hat DirectInput den Eingabefokus verloren und die Tastatur muss erneut akquiriert werden. Um den Status der 256 Tasten einer Tastatur abfragen zu können, hatten wir bereits einen Tastaturpuffer angelegt: static char buffer[256]. Der Umgang mit diesem Puffer wird uns durch die Verwendung der in DirectInput vordefinierten Tastatur- Konstanten erleichtert.

18 Abfrage des Tastenzustands mit Hilfe der Tastatur-Konstanten und des bereits definierten Makros zur Behandlung von Tastatur-Nachrichten: Wenn bei gedrückten Taste nur einmal auf die Nachricht reagiert werden soll: Wenn die Taste A gedrückt wird und PressSameKeyA gleich FALSE ist, wird die betreffende Aktion ausgeführt und PressSameKeyA auf TRUE gesetzt. Dadurch wird das erneute Ausführen der Aktion so lange verhindert, bis PressSameKeyA wieder gleich FALSE ist.

19

20 Abfrage der Maus-Nachrichten -analog zu Abfrage der Tastatur-Nachrichten - als Datenformat zum Zwischenspeichern der Nachrichten wird die DIMOUSESTATE2-Struktur:

21 Soll bei gedrückt gehaltener Taste nur einmal auf die Nachricht reagiert werden, verwenden wir folgenden Code:

22 Abfrage von Joystick-Nachrichten Als Datenformat zum Zwischenspeichern der Joystick-Nachrichten verwenden wir die DIJOYSTATE2-Struktur. Im Zusammenhang mit der Nachrichten-Abfrage lernen wir das so genannte Polling kennen. Polling bedeutet, ein Gerät in regelmäßigen Abständen nach seinem Zustand abzufragen. Mit der Methode Poll() werden die neuen Daten explizit aufgefordert. Falls der Aufruf fehlschlägt, das Joystick-Objekt aber erfolgreich initialisiert wurde, muss das Gerät neu akquiriert werden.

23 Freigabe aller DirectInput-Objekte Die Freigabe aller DirectInput-Objekte übernimmt die Funktion FreeDirectInput(). Im ersten Schritt wird der Zugriff auf Tastatur, Maus und Joystick beendet, im Anschluss daran werden alle DirectInput-Objekte wieder freigegeben.