midterm final iteration
user_2869209
c_cpp
2 years ago
10 kB
1
Indexable
#include "MyProject.h" #include <Windowsx.h> // for GET__LPARAM macros #include <SpriteBatch.h> #include <d3d11.h> #include <SimpleMath.h> #include <DirectXColors.h> #include <sstream> #include "Collision2D.h" using namespace DirectX; using namespace DirectX::SimpleMath; //Author: Parker Heil. 4363015. //The purpose of this assignment is: To create brickbreak for the midterm assignment. // Using a menu, functions, and deltatime. //I've used assets from a different project so TECHNICALLY theyre unique! hahaha. //Date: 2022/11/08. float RandFloat() { return float(rand()) / float(RAND_MAX); } //---------------------------------------------------------------------------------------------- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int nShowCmd) { MyProject application(hInstance); // Create the class variable if (application.InitWindowsApp(L"BREAKOUT!", nShowCmd) == false) // Initialize the window, if all is well show and update it so it displays { return 0; // Error creating the window, terminate application } if (application.InitializeDirect3D()) { application.SetDepthStencil(true); // Tell DirectX class to create and maintain a depth stencil buffer application.InitializeTextures(); application.MessageLoop(); // Window has been successfully created, start the application message loop } return 0; } //---------------------------------------------------------------------------------------------- // Constructor //---------------------------------------------------------------------------------------------- MyProject::MyProject(HINSTANCE hInstance) : DirectXClass(hInstance) { mousePos = Vector2(clientWidth * 0.5f, clientHeight * 0.5f); buttonDown = false; spriteBatch = NULL; currentSelectedIndex = -1; message = L"Mouse was clicked here"; ClearColor = Color(DirectX::Colors::DarkGray.v); velocity = Vector2(100, 100); balls.SetVelocity(velocity, 0); ByeBye = Vector2(2000, 2000); } //---------------------------------------------------------------------------------------------- // Destructor //---------------------------------------------------------------------------------------------- MyProject::~MyProject() { if (spriteBatch) { delete spriteBatch; spriteBatch = NULL; } if (states) { delete states; states = NULL; } delete spriteBatch; } //---------------------------------------------------------------------------------------------- // Initialize any fonts we need to use here //---------------------------------------------------------------------------------------------- void MyProject::InitializeTextures() { // initialize the sprite batch spriteBatch = new DirectX::SpriteBatch(DeviceContext); commonStates = new CommonStates(D3DDevice); arial16.InitializeFont(D3DDevice, DeviceContext, L"..\\Font\\Arial16.spritefont"); buttonTexture.Load(D3DDevice, L"..\\Textures\\blueSheet.png"); brickTexture.Load(D3DDevice, L"..\\Textures\\blueSheet.png"); ball.Load(D3DDevice, L"..\\Textures\\ball.png"); paddleTexture.Load(D3DDevice, L"..\\Textures\\paddle.png"); //font.InitializeFont() paddle.Initialize(&paddleTexture, Vector2(500, 700), 0.0f, 0.5f, Color(1, 1, 1),0); balls.Initialize(&ball, Vector2(400, 300), 0, .010, Color(1, 1, 1), 0); for (int i = 0; i < 2; i++) { buttonSprite[i].Initialize(&buttonTexture, Vector2(500, 300 + (i * buttonSpace)), 0, 1, Color(1, 1, 1), 0); } Vector2 brickPosition; brickPosition.x = 110; brickPosition.y = 60; for (int i = 0; i < 15; i++) { brickSprite[i].Initialize(&brickTexture, brickPosition, 0, 1, Color(1, 1, 1), 0); brickPosition.x += 200; if (i == 4 || i == 9) { brickPosition.x = 110; brickPosition.y += 60; } } } //---------------------------------------------------------------------------------------------- // Window message handler //---------------------------------------------------------------------------------------------- LRESULT MyProject::ProcessWindowMessages(UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_MOUSEMOVE: mousePos.x = (float)GET_X_LPARAM(lParam); mousePos.y = (float)GET_Y_LPARAM(lParam); return 0; case WM_LBUTTONUP: buttonDown = false; mousePos.x = (float)GET_X_LPARAM(lParam); mousePos.y = (float)GET_Y_LPARAM(lParam); break; case WM_LBUTTONDOWN: buttonDown = true; mousePos.x = (float)GET_X_LPARAM(lParam); mousePos.y = (float)GET_Y_LPARAM(lParam); OnMouseDown(); break; case WM_KEYUP: if (wParam >= '0' && wParam <= '4') { PresentInterval = wParam - '0'; } if (wParam == VK_LEFT) { right = false; } if (wParam == VK_RIGHT) { left = false; } break; case WM_KEYDOWN: if (wParam == VK_LEFT) { right = true; } if (wParam == VK_RIGHT) { left = true; } break; } // let the base class handle remaining messages return DirectXClass::ProcessWindowMessages(msg, wParam, lParam); } //---------------------------------------------------------------------------------------------- // Called by the render loop to render a single frame //---------------------------------------------------------------------------------------------- void MyProject::Render(void) { std::wostringstream ws, ws1, ws2; ws << score; ws1 << L"Play"; ws2 << L"Quit"; spriteBatch->Begin(SpriteSortMode_BackToFront, commonStates->NonPremultiplied()); MenuFunction(); spriteBatch->End(); DirectXClass::Render(); ButtonFonts(ws1, ws2, ws); } void MyProject::MenuFunction() { for (int i = 0; i < 2; i++) { buttonSprite[i].Draw(spriteBatch); } if (gameStart) { for (int i = 0; i < 15; i++) { brickSprite[i].Draw(spriteBatch); balls.Draw(spriteBatch); paddle.Draw(spriteBatch); } } } void MyProject::ButtonFonts(std::wostringstream& ws1, std::wostringstream& ws2, std::wostringstream& ws) { if (!gameStart) { arial16.PrintMessage(475, 288 + 0 * buttonSpace, ws1.str(), FC_RED); arial16.PrintMessage(475, 288 + 1 * buttonSpace, ws2.str(), FC_RED); } else { arial16.PrintMessage(75, 700, ws.str(), FC_RED); } } //---------------------------------------------------------------------------------------------- // Called every frame to update objects. // deltaTime: how much time in seconds has elapsed since the last frame //---------------------------------------------------------------------------------------------- void MyProject::Update(float deltaTime) { gameFunction(deltaTime); ButtonUpdate(); } void MyProject::gameFunction(float deltaTime) { Vector2 paddlePosition = paddle.GetPosition(); if (right) { paddlePosition.x -= 3; paddle.SetPosition(paddlePosition); } if (left) { paddlePosition.x += 3; paddle.SetPosition(paddlePosition); } Vector2 ballVelocity = balls.GetVelocity(); Vector2 ballPosition = balls.GetPosition(); ballPosition += ballVelocity * deltaTime; balls.SetPosition(ballPosition); if (ballPosition.y > clientHeight) { ballVelocity.y = -ballVelocity.y; balls.SetVelocity(ballVelocity, 0); } if (ballPosition.y < 0) { ballVelocity.y = -ballVelocity.y; balls.SetVelocity(ballVelocity, 0); } if (ballPosition.x > clientWidth) { ballVelocity.x = -ballVelocity.x; balls.SetVelocity(ballVelocity, 0); } if (ballPosition.x < 0) { ballVelocity.x = -ballVelocity.x; balls.SetVelocity(ballVelocity, 0); } Box2D paddleCollider(paddle.GetPosition(), paddle.GetExtents()); Circle ballCollider; ballCollider.center = balls.GetPosition(); ballCollider.radius = balls.GetWidth() * 0.25f; if (Collision2D::BoxCircleCheck(paddleCollider, ballCollider)) { balls.SetPosition(Collision2D::ReflectCircleBox(ballCollider, ballVelocity, deltaTime, paddleCollider)); balls.SetVelocity(ballVelocity, 0); } for (int o = 0; o < 15; o++) { Box2D boxCollider(brickSprite[o].GetPosition(), brickSprite[o].GetExtents()); Circle circleCollider; circleCollider.center = balls.GetPosition(); circleCollider.radius = balls.GetWidth() * 0.25f; if (Collision2D::BoxCircleCheck(boxCollider, circleCollider)) { score++; remaining--; brickSprite[o].SetPosition(ByeBye); balls.SetPosition(Collision2D::ReflectCircleBox(circleCollider, ballVelocity, deltaTime, boxCollider)); balls.SetVelocity(ballVelocity, 0); } } if (brickSprite[7].GetPosition() == ByeBye) { paddle.SetScale(1.0f); } if (brickSprite[12].GetPosition() == ByeBye) { balls.SetVelocity(velocity * 1.5, 0); } if (brickSprite[1].GetPosition() == ByeBye) { balls.SetScale(0.02f + deltaTime); } if (remaining == 0) { gameStart = false; } } void MyProject::ButtonUpdate() { for (int i = 0; i < 2; i++) { buttonSprite[i].SetTextureRegion(0, 0, 190, 49); bool doesButtonContainMouse = buttonSprite[i].ContainsPoint(mousePos); //If the mouse cursor is hovering over the button if (doesButtonContainMouse || currentSelectedIndex == i) { buttonSprite[i].SetTextureRegion(190, 50, 380, 94); buttonSprite[i].SetScale(1.1f); buttonSprite[i].SetColor(Color(1.5, 1.5, 1.5)); //If the Mouse Button is Pressed Down if (buttonDown && doesButtonContainMouse) { currentSelectedIndex = i; switch (currentSelectedIndex) { case 0: for (int i = 0; i < 2; i++) { buttonSprite[i].SetPosition(Vector2(2000, 2000)); } gameStart = true; for (int i = 0; i < 15; i++) { brickSprite[i].SetTextureRegion(0, 0, 190, 49); } break; case 1: PostQuitMessage(1); break; } } } else { buttonSprite[i].SetColor(Color(1, 1, 1)); buttonSprite[i].SetScale(1); } } } //---------------------------------------------------------------------------------------------- // Called when the mouse is released //---------------------------------------------------------------------------------------------- void MyProject::OnMouseDown() { // this is called when the left mouse button is clicked // mouse position is stored in mousePos variable }
Editor is loading...