Breakanoid – Bälle & Blöcke Universität zu Köln Historisch Kulturwissenschaftliche...

24
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

Transcript of Breakanoid – Bälle & Blöcke Universität zu Köln Historisch Kulturwissenschaftliche...

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

Breakanoid – Bälle & Blöcke

Universität zu KölnHistorisch Kulturwissenschaftliche Informationsverarbeitung

WS 12/13Übung: Visuelle Programmierung I – Simulation und 3D

ProgrammierungProf. Dr. Manfred ThallerReferentin: Bianca Batel

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

Bälle hinzufügenKlasse 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

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

Bälle hinzufügen Bewegung - CBall::Move

• Bewegung des Ballsm_vPosition += m_vVelocity * fTime;

• Ball trifft Wandif(m_vPosition.x - 0.25f <= -9.25f) {bWall = TRUE; m_vVelocity.x

*= -1.0f; m_vPosition.x = -9.0f;} //Linke Wandif(m_vPosition.x + 0.25f >= 9.25f) {bWall = TRUE; m_vVelocity.x

*= -1.0f; m_vPosition.x = 9.0f;} //Rechte Wandif(m_vPosition.z + 0.25f >= 9.25f) {bWall = TRUE; m_vVelocity.z

*= -1.0f; m_vPosition.z = 4.0f;} //Obere Wand

Ball.cpp

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

Bälle hinzufügen Bewegung - CBall::Move

Ball.h

•Ball trifft Schlägerif(m_vPosition.x >= m_pGame->m_vPaddlePos.x - 1.25f && m_vPosition.x <= m_pGame->m_vPaddlePos.x + 1.25f && m_vPosition.z <= m_pGame->m_vPaddlePos.z + 0.25f && m_vPosition.z - m_vVelocity.z * fTime >= m_pGame->m_vPaddlePos.z + 0.25f)

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

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 + 0.25f;

// 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

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

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“ nochtbResult CBall::Move(float fTime){// Wenn der Ball klebt: abbrechen!if(m_bGrabbed) return TB_OK;//..}

Ball.cpp

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

Bälle hinzufügenRendern –

CBall::Render, CBall::GetAbsPosition// Rendert einen BalltbResult CBall::Render(float fTime){tbMatrix mWorld;// Ball rendernmWorld = tbMatrixTranslation(GetAbsPosition());tbDirect3D::Instance().SetTransform(D3DTS_WORLD, mWorld);m_pGame->m_pBallModel->Render();return TB_OK;}// Liefert die absolute BallpositiontbVector3 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

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

Bälle hinzufügenBall Array - CGame::CreateBall

// Erstellt einen neuen Ballint CGame::CreateBall(tbVector3 vPosition, tbVector3 vVelocity, BOOL bGrabbed){// Freien Ball suchenfor(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

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

Bälle hinzufügenDer erste Ball – CGame::InitLevel

// Initialisiert einen LeveltbResult CGame::InitLevel(int iLevel){// ...// Bälle zurücksetzenZeroMemory(m_aBall, 16 * sizeof(CBall));// Einen Ball erstellenCreateBall(tbVector3(0.0f, 0.0f, 0.25f), tbVector3(0.0f), TRUE);// ...}

Game.cpp

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

Bälle hinzufügenAbfeuern 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 addierenm_aBall[0].m_vVelocity += m_vPaddleVel;// Dem Ball einen kleinen "Schubs" nach vorne gebenm_aBall[0].m_vPosition.z += 0.1f;}

Game.cpp

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

Eine neue Kamera – CGame::Render

DWORD dwNumVectors; // Anzahl der Vektoren, die zum Mittelwert beitragentbMatrix 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 bildenvCameraLookAt /= (float)(dwNumVectors);// Der Blickpunkt soll zur Mitte (0, 0, 0) hin tendieren.vCameraLookAt *= 0.5f;// Kameramatrix erstellen und aktivierenmCamera = tbMatrixCamera(vCameraPos, vCameraLookAt);tbDirect3D::Instance().SetTransform(D3DTS_VIEW, mCamera);

Game.cpp

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

Blöcke hinzufügenKlasse CBlock

Variablen :• intm_iEnergy;• intm_iType; • tbVector3m_vPosition;• CGame*m_pGame;

Methoden:• tbResult Render(float fTime);

Block.h

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

Blöcke hinzufügenRendern – CBlock::Render

// Rendert einen BlocktbResult CBlock::Render(float fTime){tbMatrix mWorld;// Block renderntbDirect3D::Instance().SetTransform(D3DTS_WORLD,

tbMatrixTranslation(m_vPosition));m_pGame->m_apBlockModel[m_iType - 1]->Render();return TB_OK;}

Ball.h

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

Blöcke hinzufügen - mehrere Blöcke CGame::CreateBlockRow(char* pcBlocks, tbVector3 vStartPos)

Game.cpp

Blöcke hinzufügenmehrere Blöcke - Levels von Breakanoid

CGame::InitLevel(int iLevel)

Game.cpp

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

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 untenm_pGame->CreateBall(m_vPosition,tbVector3(tbFloatRandom(-4.0f, 4.0f), 0.0f,-tbFloatRandom(8.0f, 10.0f)),FALSE);}

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

Level UpCGame::Move(float fTime)

DWORD dwNumBlocks;// Verbleibende Blöcke zählendwNumBlocks = 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

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

VersucheBallverlust CGame::Move

Game.cpp

DWORD dwNumBalls;// Die Bälle bewegen und zählendwNumBalls = 0;for(DWORD dwBall = 0; dwBall < 16; dwBall++){// Den Ball bewegen und zählen, wenn er existiertif(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 bringenm_iTriesLeft--;CreateBall(tbVector3(0.0f, 0.0f, 0.25f), tbVector3(0.0f), TRUE);}

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

VersucheAnzeige CGame::Render

Game.cpp

char acText[256];g_pBreakanoid->m_pFont2->Begin();// Levelnummersprintf(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 Versuchesprintf(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();

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

VersucheGame 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 abziehenm_iTriesLeft--;// Wieder einen Ball ins Spiel bringenCreateBall(tbVector3(0.0f, 0.0f, 0.25f), tbVector3(0.0f), TRUE);}}

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

PunkteCGame::Move(float fTime)

// Keine Blöcke mehr: Extrapunkte und neuer Level!if(dwNumBlocks == 0){// Level 1 bringt 10000 Punkte, Level 2 20000 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 1000000 Punkten.m_iScore += (DWORD)(1000000.0f * (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

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

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

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

Musik – Hintergrund CBreakanoid::Load()

//…// Musik laden und gleich abspielenm_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

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

Minimieren im VollbildmodusCBreakanoid::Render(float fTime)

Ball.cpp

Motion BlurringCBall::Render(float fTime)

Breakanoid.cpp

Erweiterungsvorschläge…

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

Vielen Dank