Breakanoid – Bälle & Blöcke Universität zu Köln Historisch Kulturwissenschaftliche Informationsverarbeitung WS 12/13 Übung: Visuelle Programmierung I –

Slides:



Advertisements
Ähnliche Präsentationen
Algorithmentheorie 08 – Dynamische Programmierung (1)
Advertisements

der Universität Oldenburg
Imperative Programmierung
Klassen - Verkettete Liste -
Forschungszentrum caesar
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
der Universität Oldenburg
VO2 Laden und Initialisieren der Sounds. Wir wollen Sounds in unsere Applikation laden Menü erweitern –um den Menüpunkt Sound –mit dem Identifier ID_ULTRIS_SOUND.
Ultris Version 8: Erzeugen der Formen und Anzeigen der Vorschau
Java: Dynamische Datentypen
FH-Hof Verwaltung von Zeichenketten Richard Göbel.
FOR Anweisung.
V10: Bewegen der Formen und Kollisionserkennung Steuerung der Spielsteine durch Tastenbefehle (Übersicht der Befehle unter der Hilfe)
V09 Fallende Formen, Geschwindigkeitsregelung und Timing Daniel Ebner Spieleprogrammierung mit DirectX und C++
Softwaretechnologie II WS 08/09 SpieleProgrammieren UlTris V07 Reihen vorbelegen, Spielfeld anzeigen und Punktestand ausrechnen Sibylle C. Schellhorn,
Simulation und 3D-Programmierung Praxis: Dreiecke, Texturen, Vertex-Buffer Universität zu Köln Historisch Kulturwissenschaftliche Informationsverarbeitung.
Processing: Arrays & Laden von Dateien Aufbauend auf dem Beispiel: File I/O LoadFile1.
Softwaretechnologie II (Teil 1): Simulation und 3D Programmierung
Universität zu Köln Historisch-Kulturwissenschaftliche Informationsverarbeitung Softwaretechnologie II (Teil 2): Simulation und 3D Programmierung Prof.
Spieleprogrammierung mit DirectX und C++
V03 Laden und Speichern von Spielfeldern und der Spielfeldeditor.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Diskrete Mathematik I Vorlesung Arrays-
Zusammenfassung Vorwoche
3D Programmierung Version 12 - Highscores. Die vom Spieler erzielte Punktzahl wird mit 5 vorgegebenen Punktzahlen verglichen und, falls nötig, in die.
Java programmieren mit JavaKara
Informatik 1 Übung 2.
Programmieren Kapitel 3 – Variablen.
Universität zu Köln Institut für Historisch-Kulturwissenschaftliche Informationsverarbeitung Prof. Dr. Manfred Thaller AM 3 Übung: Softwaretechnologie.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
3D- Spieleprogrammierung
Tormann Lorenz Maierhofer Die Test-Umgebung Tor: 5x Roboter-Durchmesser Ball: Wird jeweils in Richtung einer zufälligen Position im Tor geschossen.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Universität zu Köln Historisch-Kulturwissenschaftliche Informationsverarbeitung Softwaretechnologie II (Teil I): Simulation und 3D Programmierung Prof.
Softwaretechnologie II (Teil 1): Simulation und 3D Programmierung Medienwiss./Medieninformatik AM3 Visuelle Programmierung I Referent: Janek Rudolf.
Wasser in 3D Die Modellierung und realitätsnahe Echtzeitberechnung von Wasser unter Zuhilfenahme der Grafik Engine OGRE 3D Präsentation von Paul van Hemmen.
Universität zu Köln Historisch Kulturwissenschaftliche Informationsverarbeitung WS 12/13 Softwaretechnologie II (Teil 1): Simulation und 3D Programmierung.
Von der Planung bis zum Hauptmenü Seminar: Softwaretechnologie II Dozent: Prof. Manfred Thaller Referent: Jan Bigalke.
Grundlagen der Programmierung
Einführung in die Programmierung Wintersemester 2009/10 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
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 Fakultät.
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.
Informatik 1 Übung 4.
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Algorithmen und Datenstrukturen SS 2005
PART V CONTACT PHYSICS Chapter Aufbaumodul 3: Visuelle Programmierung II Softwaretechnologie II (Teil 2): Simulation und 3D Programmierung Prof.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt.
Java-Kurs - 8. Übung Besprechung der Hausaufgabe.
Softwaretechnologie II (Teil 1): Simulation und 3D Programmierung
Das erste Spiel Universität zu Köln
Universität zu Köln Historisch-Kulturwissenschaftliche Informationsverarbeitung Softwaretechnologie II (Teil 1): Simulation und 3D Programmierung WS 2013/14.
1 VeranstaltungThemaTeilnehmerBetreuer AINF-Lehrgang PROGRAMMIEREN Martina GREILER Wolfgang KATOLNIG Peter RENDL Helfried TUISEL Peter ZYCH Heinz STEGBAUER.
 Allgemein  Speicherung der Informationen  Die Schiffsysteme › Die Struktur SShipType › Die Struktur SWeaponType  Laden aus der INI- Datei  Die Klasse.
Das zweite Spiel Universität zu Köln Institut für Historisch-Kulturwissenschaftliche Informationsverarbeitung Prof. Dr. Manfred Thaller AM 3 Übung: Softwaretechnologie.
Universität zu Köln Historisch-Kulturwissenschaftliche Informationsverarbeitung Softwaretechnologie II (Teil I): Simulation und 3D Programmierung Prof.
1. Charakteranimation 2. PlugIns schreiben und laden Universität zu Köln Institut für Historisch-Kulturwissenschaftliche Informationsverarbeitung WS 2010/2011.
Random & Probability Universität zu Köln Institut für Medienkultur und Theater AM3: Visuelle Programmierung II WS 2013/2014 Dozent: Prof. Manfred Thaller.
Historisch-Kulturwissenschaftliche Informationsverarbeitung Übung: Softwaretechnologie II / Visuelle Programmierung Dozent: Prof. Dr. Manfred Thaller WS.
Virtuelle Forschungsumgebung in Musikwissenschaft
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Universität zu Köln Historisch-Kulturwissenschaftliche Informationsverarbeitung Softwaretechnologie II (Teil I): Simulation und 3D Programmierung Prof.
ROBERT NYSTROM GAME PROGRAMMING PATTERNS III.8 Thema: Sequencing Patterns Seminar: Softwaretechnologie II (Teil 2) Dozent: Prof. Dr. Manfred Thaller Referent:
Game Loop & Update Method Robert Nystrom – Game Programming Patterns Universität zu Köln Historisch-Kulturwissenschaftliche Informationsverarbeitung SS.
Roboter-Programmierung
TRUE und FALSE in C Der Wert 0 steht für FALSE Jeder von 0 verschiedene Wert steht für TRUE FALSE wird als 0 dargestellt TRUE wird als 1 dargestellt.
Aufgaben zu Rückgabewerten
 Präsentation transkript:

Breakanoid – Bälle & Blöcke Universität zu Köln Historisch Kulturwissenschaftliche Informationsverarbeitung WS 12/13 Übung: Visuelle Programmierung I – Simulation und 3D Programmierung Prof. Dr. Manfred Thaller Referentin: Bianca Batel

Bälle hinzufügen Klasse CBall Variablen : BOOL m_bExists tbVector3 m_vPosition tbVector3 m_vVelocity BOOL m_bgrabbed CGame* m_pGame Methoden: tbResult Move(float fTime) tbResult Render(float fTime) tbVector3 GetAbsPosition() Ball.h

Bälle hinzufügen Bewegung - CBall::Move Bewegung des Balls m_vPosition += m_vVelocity * fTime; Ball trifft Wand if(m_vPosition.x f <= -9.25f) {bWall = TRUE; m_vVelocity.x *= -1.0f; m_vPosition.x = -9.0f;} //Linke Wand if(m_vPosition.x f >= 9.25f) {bWall = TRUE; m_vVelocity.x *= -1.0f; m_vPosition.x = 9.0f;} //Rechte Wand if(m_vPosition.z f >= 9.25f) {bWall = TRUE; m_vVelocity.z *= -1.0f; m_vPosition.z = 4.0f;} //Obere Wand Ball.cpp

Bälle hinzufügen Bewegung - CBall::Move Ball.h Ball trifft Schläger if(m_vPosition.x >= m_pGame->m_vPaddlePos.x f && m_vPosition.x m_vPaddlePos.x f && m_vPosition.z m_vPaddlePos.z f && m_vPosition.z - m_vVelocity.z * fTime >= m_pGame->m_vPaddlePos.z f)

Bälle hinzufügen Bewegung - CBall::Move // Es gibt eine Kollision! Wir kehren die z-Komponente des //Bewegungsvektors um. m_vVelocity.z *= -1.0f; // Die z-Koordinate des Balls korrigieren m_vPosition.z = m_pGame->m_vPaddlePos.z f; // Die x-Komponente des Bewegungsvektors wird entgegengesetzt zum // Bewegungsvektor des Schlägers verändert. m_vVelocity.x -= m_pGame->m_vPaddleVel.x * 0.5f; Ball.cpp

Bälle hinzufügen Bewegung - CBall::Move Fliegt am Schläger vorbei // Wenn er am Schläger vorbei fliegt, ist er //verloren. if(m_vPosition.z < -12.0f) { // … m_bExists = FALSE; } Ball „klebt“ noch tbResult CBall::Move(float fTime) { // Wenn der Ball klebt: abbrechen! if(m_bGrabbed) return TB_OK; //.. } Ball.cpp

Bälle hinzufügen Rendern – CBall::Render, CBall::GetAbsPosition // Rendert einen Ball tbResult CBall::Render(float fTime) { tbMatrix mWorld; // Ball rendern mWorld = tbMatrixTranslation(GetAbsPosition()); tbDirect3D::Instance().SetTransform(D3DTS_WORLD, mWorld); m_pGame->m_pBallModel->Render(); return TB_OK; } // Liefert die absolute Ballposition tbVector3 CBall::GetAbsPosition() { // Wenn der Ball klebt, dann müssen wir zu seiner Position // noch die Schlägerposition addieren. if(m_bGrabbed) return m_vPosition + m_pGame->m_vPaddlePos; else return m_vPosition; } Ball.cpp

Bälle hinzufügen Ball Array - CGame::CreateBall // Erstellt einen neuen Ball int CGame::CreateBall(tbVector3 vPosition, tbVector3 vVelocity, BOOL bGrabbed) { // Freien Ball suchen for(int iBall = 0; iBall < 16; iBall++) { if(!m_aBall[iBall].m_bExists) { // Freier Ball gefunden! Ausfüllen! m_aBall[iBall].m_bExists = TRUE; m_aBall[iBall].m_pGame = this; m_aBall[iBall].m_bGrabbed = bGrabbed; m_aBall[iBall].m_vPosition = vPosition; m_aBall[iBall].m_vVelocity = vVelocity; return iBall; // Index des neuen Balls liefern } return -1; // Kein Platz mehr! } Game.cpp

Bälle hinzufügen Der erste Ball – CGame::InitLevel // Initialisiert einen Level tbResult CGame::InitLevel(int iLevel) { //... // Bälle zurücksetzen ZeroMemory(m_aBall, 16 * sizeof(CBall)); // Einen Ball erstellen CreateBall(tbVector3(0.0f, 0.0f, 0.25f), tbVector3(0.0f), TRUE); //... } Game.cpp

Bälle hinzufügen Abfeuern mit der Leertaste – CGame::Move // Wenn die Leertaste gedrückt wurde, wird der klebende Ball // abgeworfen. if(g_pbButtons[TB_KEY_SPACE] && m_aBall[0].m_bExists && m_aBall[0].m_bGrabbed) { // Ball abfeuern! m_aBall[0].m_bGrabbed = FALSE; // Die Position eines klebenden Balls ist immer relativ // zum Schläger. Wir wandeln sie nun in eine absolute Position um. m_aBall[0].m_vPosition += m_vPaddlePos; // Den Bewegungsvektor des Balls berechnen wir zufällig. m_aBall[0].m_vVelocity.x = tbFloatRandom(-4.0f, 4.0f); m_aBall[0].m_vVelocity.y = 0.0f; m_aBall[0].m_vVelocity.z = tbFloatRandom(8.0f, 10.0f); // Den Bewegungsvektor des Schlägers addieren m_aBall[0].m_vVelocity += m_vPaddleVel; // Dem Ball einen kleinen "Schubs" nach vorne geben m_aBall[0].m_vPosition.z += 0.1f; } Game.cpp

Eine neue Kamera – CGame::Render DWORD dwNumVectors; // Anzahl der Vektoren, die zum Mittelwert beitragen tbMatrix mCamera; // Die Kamera steht hinter und über dem Schläger. tbVector3 vCameraPos = m_vPaddlePos + tbVector3(0.0f, 10.0f, -5.0f); // Der Blickpunkt der Kamera ist der Mittelwert aus allen Ballpositionen // und der Schlägerposition. dwNumVectors = 1; tbVector3 vCameraLookAt = m_vPaddlePos; for(DWORD dwBall = 0; dwBall < 16; dwBall++) { if(m_aBall[dwBall].m_bExists) { dwNumVectors++; vCameraLookAt += m_aBall[dwBall].GetAbsPosition(); } // Mittelwert bilden vCameraLookAt /= (float)(dwNumVectors); // Der Blickpunkt soll zur Mitte (0, 0, 0) hin tendieren. vCameraLookAt *= 0.5f; // Kameramatrix erstellen und aktivieren mCamera = tbMatrixCamera(vCameraPos, vCameraLookAt); tbDirect3D::Instance().SetTransform(D3DTS_VIEW, mCamera); Game.cpp

Blöcke hinzufügen Klasse CBlock Variablen : intm_iEnergy; intm_iType; tbVector3m_vPosition; CGame*m_pGame; Methoden: tbResult Render(float fTime); Block.h

Blöcke hinzufügen Rendern – CBlock::Render // Rendert einen Block tbResult CBlock::Render(float fTime) { tbMatrix mWorld; // Block rendern tbDirect3D::Instance().SetTransform(D3DTS_WORLD, tbMatrixTranslation(m_vPosition)); m_pGame->m_apBlockModel[m_iType - 1]->Render(); return TB_OK; } Ball.h

Blöcke hinzufügen - mehrere Blöcke CGame::CreateBlockRow(char* pcBlocks, tbVector3 vStartPos) Game.cpp Blöcke hinzufügen mehrere Blöcke - Levels von Breakanoid CGame::InitLevel(int iLevel) Game.cpp

Kollision zwischen Ball und Block Ball.cpp Multiball // Bei einem von fünfzehn Blöcken gibt es einen Extraball! if(tbIntRandom(0, 14) == 7) { // Neuen Ball erstellen, zufällige Flugrichtung nach unten m_pGame->CreateBall(m_vPosition, tbVector3(tbFloatRandom(-4.0f, 4.0f), 0.0f, -tbFloatRandom(8.0f, 10.0f)), FALSE); }

Level Up CGame::Move(float fTime) DWORD dwNumBlocks; // Verbleibende Blöcke zählen dwNumBlocks = 0; for(DWORD dwBlock = 0; dwBlock < 64; dwBlock++) { if(m_aBlock[dwBlock].m_iEnergy > 0) dwNumBlocks++; } // Keine Blöcke mehr: neuer Level! if(dwNumBlocks == 0) { // Nächster Level! m_iLevel++; // Das Spiel hat kein Ende: Nach Level 8 geht's wieder bei 1 los. if(m_iLevel > 8) m_iLevel = 1; InitLevel(m_iLevel); tbDelay(100); } Game.cpp

Versuche Ballverlust CGame::Move Game.cpp DWORD dwNumBalls; // Die Bälle bewegen und zählen dwNumBalls = 0; for(DWORD dwBall = 0; dwBall < 16; dwBall++) { // Den Ball bewegen und zählen, wenn er existiert if(m_aBall[dwBall].m_bExists) m_aBall[dwBall].Move(fTime), dwNumBalls++; } // Wenn kein Ball mehr im Spiel ist... if(dwNumBalls == 0) { // Einen Versuch abziehen und wieder einen Ball ins Spiel bringen m_iTriesLeft--; CreateBall(tbVector3(0.0f, 0.0f, 0.25f), tbVector3(0.0f), TRUE); }

Versuche Anzeige CGame::Render Game.cpp char acText[256]; g_pBreakanoid->m_pFont2->Begin(); // Levelnummer sprintf(acText, "Level %d", m_iLevel); g_pBreakanoid->m_pFont2->DrawText(tbVector2(0.05f, 0.05f), acText, TB_FF_RELATIVE | TB_FF_RELATIVESCALING, -1, tbColor(1.0f), tbColor(1.0f, 0.25f, 0.25f)); // Restliche Versuche sprintf(acText, "Versuche: %d", m_iTriesLeft); g_pBreakanoid->m_pFont2->DrawText(tbVector2(0.05f, 0.1f), acText, TB_FF_RELATIVE | TB_FF_RELATIVESCALING, -1, tbColor(1.0f), tbColor(0.25f, 1.0f, 0.25f)); g_pBreakanoid->m_pFont2->End();

Versuche Game Over BOOL m_bGameOver Game.cpp // Wenn kein Ball mehr im Spiel ist... if(dwNumBalls == 0) { // Wenn keine Versuche mehr übrig sind... if(m_iTriesLeft == 0) { // Game Over! m_bGameOver = TRUE; } else { // Einen Versuch abziehen m_iTriesLeft--; // Wieder einen Ball ins Spiel bringen CreateBall(tbVector3(0.0f, 0.0f, 0.25f), tbVector3(0.0f), TRUE); }

Punkte CGame::Move(float fTime) // Keine Blöcke mehr: Extrapunkte und neuer Level! if(dwNumBlocks == 0) { // Level 1 bringt Punkte, Level Punkte usw.. m_iScore += m_iLevel * 10000; // Je weniger Zeit man gebraucht hat, desto mehr Extrapunkte gibt's. // Bei x benötigten Sekunden gibt es den x-ten Teil von Punkten. m_iScore += (DWORD)( f * (1.0f / m_fLevelTime)); // Nächster Level! m_iLevel++; // Das Spiel hat kein Ende: Nach Level 8 geht's wieder bei 1 los. if(m_iLevel > 8) m_iLevel = 1; InitLevel(m_iLevel); tbDelay(100); } Game.cpp

Sound - Aktionen CBreakanoid::m_apSound[2]: neuen Level betreten CBreakanoid::m_apSound[3]: Ball abfeuern (mit Leertaste) CBreakanoid::m_apSound[4]: Ball geht verloren CBreakanoid::m_apSound[5]: Ball trifft den Schläger CBreakanoid::m_apSound[6]: Extraball-Sound CBreakanoid::m_apSound[7]: Ball prallt an der Wand ab CBreakanoid::m_apSound[8 bis 11]: verschiedene glockenspielartige Musikinstrumente, von denen zufällig ein Sound abgespielt wird, wenn der Ball einen Block trifft Game.cpp

Musik – Hintergrund CBreakanoid::Load() //… // Musik laden und gleich abspielen m_pMusic = new tbMusic; if(m_pMusic->Init("Data\\Music.mp3")) { // Fehler! TB_ERROR("Fehler beim Laden der Musik!", TB_ERROR); } m_pMusic->Play(); //… Breakanoid.cpp

Minimieren im Vollbildmodus CBreakanoid::Render(float fTime) Ball.cpp Motion Blurring CBall::Render(float fTime) Breakanoid.cpp Erweiterungsvorschläge…

Vielen Dank