简单处理下打砖块,统一打个执行程序包https://xianfa.github.io/download/FishGold.zip。 演示截图
游戏场景图,增加了碰撞处理,都是固定角度的反弹,就这么着吧。

处理角度处理的主要代码片段,这样的代码我不太满意,后续再看看怎么重构下。
for (int i=0; i<m_vBricks.size(); i++)
	{
		CImage *pCurBrick = m_vBricks.at(i);
		//砖顶碰撞判断
		if (vDirection.y > 0
			&& m_pBall->GetPosX() >= pCurBrick->GetPosX()
			&& m_pBall->GetPosX() <= pCurBrick->GetPosX() + pCurBrick->GetWidth()
			&& m_pBall->GetPosY() >= pCurBrick->GetPosY() - m_pBall->GetHeight() / 2
			&& m_pBall->GetPosY() <= pCurBrick->GetPosY() + m_pBall->GetHeight() / 2)
		{
			glm::vec3 vNewDirection = GetBounceDirection(vDirection, glm::vec3(0, -1, 0));
			m_pBall->SetVDirection(vNewDirection);
			pBrick = pCurBrick;
			break;
		}

		//砖底碰撞判断
		if (vDirection.y < 0
			&& m_pBall->GetPosX() >= pCurBrick->GetPosX()
			&& m_pBall->GetPosX() <= pCurBrick->GetPosX() + pCurBrick->GetWidth()
			&& m_pBall->GetPosY() >= pCurBrick->GetPosY() + pCurBrick->GetHeight() - m_pBall->GetHeight() / 2
			&& m_pBall->GetPosY() <= pCurBrick->GetPosY() + pCurBrick->GetHeight() + m_pBall->GetHeight() / 2)
		{
			glm::vec3 vNewDirection = GetBounceDirection(vDirection, glm::vec3(0, 1, 0));
			m_pBall->SetVDirection(vNewDirection);
			pBrick = pCurBrick;
			break;
		}

		//砖块左面碰撞判断
		if (vDirection.x > 0
			&& m_pBall->GetPosY() >= pCurBrick->GetPosY()
			&& m_pBall->GetPosY() <= pCurBrick->GetPosY() + pCurBrick->GetHeight()
			&& m_pBall->GetPosX() >= pCurBrick->GetPosX()
			&& m_pBall->GetPosX() <= pCurBrick->GetPosX() + m_pBall->GetWidth() / 2)
		{
			glm::vec3 vNewDirection = GetBounceDirection(vDirection, glm::vec3(-1, 0, 0));
			m_pBall->SetVDirection(vNewDirection);
			pBrick = pCurBrick;
			break;
		}

		//砖块右面碰撞判断
		if (vDirection.x < 0
			&& m_pBall->GetPosY() >= pCurBrick->GetPosY()
			&& m_pBall->GetPosY() <= pCurBrick->GetPosY() + pCurBrick->GetHeight()
			&& m_pBall->GetPosX() >= pCurBrick->GetPosX() + pCurBrick->GetWidth() - m_pBall->GetWidth() / 2
			&& m_pBall->GetPosX() <= pCurBrick->GetPosX() + pCurBrick->GetWidth())
		{
			glm::vec3 vNewDirection = GetBounceDirection(vDirection, glm::vec3(1, 0, 0));
			m_pBall->SetVDirection(vNewDirection);
			pBrick = pCurBrick;
			break;
		}
	}

特别说明

本来不想处理打砖块啦,因为OpenGL已经整合完成,但考虑到这些文章的标题,所以还是稍微完善下,就当个正式的结束,有始有终,后续看心情想完善的话再来完善这个程序。