3D Objects with OpenGL & Glut
GameScreenManager
#include "GameScreenManager.h"
#include "GameScreen.h"
#include "GameScreenMenu.h"
#include "GameScreenLevel1.h"
#include "GameScreenWin.h"
#include "GameScreenLose.h"
#include "Constants.h"
CURRENT_SCREEN m_NextScreen;
SCREEN_RESOLUTION m_NewResolution;
//--------------------------------------------------------------------------------------------------
GameScreenManager::GameScreenManager(SCREENS startScreen, RESOLUTIONS defaultResolution)
{
//calling essential functions in order to manage screen
m_CurrentScreen = NULL;
ChangeScreen(startScreen);
ChangeResolution(defaultResolution);
}
//--------------------------------------------------------------------------------------------------
GameScreenManager::~GameScreenManager()
{
//clean up data
delete m_CurrentScreen;
m_CurrentScreen = NULL;
}
//--------------------------------------------------------------------------------------------------
void GameScreenManager::Render()
{
//render current scene
m_CurrentScreen->Render();
}
//--------------------------------------------------------------------------------------------------
void GameScreenManager::Update(float deltaTime, SDL_Event e)
{
//updateing current scene based on which phase being called
m_CurrentScreen->Update(deltaTime, e);
if (m_NextScreen != NOCHANGE)
{
switch (m_NextScreen)
{
case NOCHANGE:
break;
case MENU:
ChangeScreen(SCREEN_MENU);
m_NextScreen = NOCHANGE;
break;
case LEVEL1:
ChangeScreen(SCREEN_LEVEL1);
m_NextScreen = NOCHANGE;
break;
case WIN:
ChangeScreen(SCREEN_HIGHSCORES);
m_NextScreen = NOCHANGE;
break;
case GAMEOVER:
ChangeScreen(SCREEN_GAMEOVER);
m_NextScreen = NOCHANGE;
break;
}
}
//setting up current sene resolution
if (m_NewResolution != NOCHANGE_RES)
{
switch (m_NewResolution)
{
case NOCHANGE_RES:
break;
case RES_1280_×_720:
ChangeResolution(SCREEN_RES_1280_×_720);
m_NewResolution = NOCHANGE_RES;
break;
case RES_1920_×_1080:
ChangeResolution(SCREEN_RES_1920_×_1080);
m_NewResolution = NOCHANGE_RES;
break;
case RES_3840_×_2160:
ChangeResolution(SCREEN_RES_3840_×_2160);
m_NewResolution = NOCHANGE_RES;
break;
case RES_7680_×_4320:
ChangeResolution(SCREEN_RES_7680_×_4320);
m_NewResolution = NOCHANGE_RES;
break;
}
}
}
//--------------------------------------------------------------------------------------------------
void GameScreenManager::ChangeScreen(SCREENS newScreen)
{
if (m_CurrentScreen != NULL)
{
delete m_CurrentScreen;
}
//calling and accessing into each screen scripts
GameScreenMenu* m_MenuScreen;
GameScreenLevel1* m_Level1Screen;
GameScreenWin* m_WinScreen;
GameScreenLose* m_LoseScreen;
//switch between screen with right key word
switch (newScreen)
{
case SCREEN_INTRO:
break;
case SCREEN_MENU:
m_MenuScreen = new GameScreenMenu();
m_CurrentScreen = (GameScreen*)m_MenuScreen;
m_MenuScreen = NULL;
break;
case SCREEN_LEVEL1:
m_Level1Screen = new GameScreenLevel1();
m_CurrentScreen = (GameScreen*)m_Level1Screen;
m_Level1Screen = NULL;
break;
case SCREEN_GAMEOVER:
m_LoseScreen = new GameScreenLose();
m_CurrentScreen = (GameScreen*)m_LoseScreen;
m_LoseScreen = NULL;
break;
case SCREEN_HIGHSCORES:
m_WinScreen = new GameScreenWin();
m_CurrentScreen = (GameScreen*)m_WinScreen;
m_WinScreen = NULL;
break;
default:
break;
}
}
//--------------------------------------------------------------------------------------------------
void GameScreenManager::ChangeResolution(RESOLUTIONS newResolution)
{
//define set and switch between screen resolution
switch (newResolution)
{
case SCREEN_RES_1280_×_720:
#undef SCREEN_WIDTH;
#define SCREEN_WIDTH 1280;
break;
case SCREEN_RES_1920_×_1080:
break;
case SCREEN_RES_3840_×_2160:
break;
case SCREEN_RES_7680_×_4320:
break;
default:
break;
}
}
//--------------------------------------------------------------------------------------------------
GameScreenLevelOne
#include "GameScreenLevel1.h"
#include <time.h>
#include <windows.h>
#include <GL\gl.h>
#include "Constants.h"
#include "Commons.h"
#include <iostream>
#include "SDL.h"
#include "Camera.h"
#include "Character.h"
#include <time.h>
using namespace::std;
//--------------------------------------------------------------------------------------------------
GameScreenLevel1::GameScreenLevel1() : GameScreen()
{
//set camera perspective
float m_Aspect = (float)SCREEN_WIDTH / (float)SCREEN_HEIGHT;
float m_Near = 0.5f;
float m_Far = 1800.0f;
float m_FieldOfView = 60.0f;
glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
gluPerspective(m_FieldOfView, m_Aspect, m_Near, m_Far);
m_Camera = Camera::GetInstance();
m_Camera->SetAsPerspective(Vector3D(0.0f, 0.0f, -1200.0f), Vector3D(0.0f, 0.0f, 0.0f), Vector3D(0.0f, 0.0f, 0.0f), m_Near, m_Far, m_FieldOfView, m_Aspect);
m_Camera->SetRoll(0.0f);
m_Camera->SetPitch(0.0f);
m_Camera->SetYaw(0.0);
m_Level1Win = false;
//enable lights
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
//generate balls on a scene
for (int i = 0; i < 20; i++)
{
m_Dodgeballs.push_back(new Dodgeball(Vector3D(0.0f, 0.0f, 80.0f), "3D Models/dodgeball.3ds", "Texture/BallText.raw"));
}
//generate denzil and base mode on a scene
m_CharacterDenzil = new CharacterDenzil(Vector3D(0.0f, -475.0f, 40.0f), "3D Models/DenzilModel.3ds", "Texture/DenizText.raw");
m_Floor = new Object3D(Vector3D(0.0f, -80.0f, -40.0f), "3D Models/FloorModel.3ds", "Textures/Court.raw");
m_FinishPointObject = new FinishPoint(Vector3D(-250.0f, 600.0f, 0.0f));
/*
//play music
m_Level1Music = new Music();
m_Level1Music->LoadMusic("music path");
m_Level1Music->PlayMusic(0);
*/
//call effects in case if models being collided
m_Hurt = new SoundEffect();
m_Hurt->LoadEffect("Audio/Scream.wav");
m_Impact = new SoundEffect();
m_Impact->LoadEffect("Audio/ballimpact.wav");
//set timer and character counters
m_CurrentTime = 0.0f;
m_Hits = 0;
m_NullHour = "0";
m_NullMin = "0";
m_NullSec = "0";
m_TimeHour = 0.0f;
m_TimeMin = 0.0f;
m_TimeSec = 0.0f;
m_DodgeballSpin = 0.01f;
}
//-----------------------------------------------------------------------------------------------------
GameScreenLevel1::~GameScreenLevel1()
{
}
//--------------------------------------------------------------------------------------------------
void GameScreenLevel1::RenderHUD()
{
//generate text on scene with light
glColor3f(1.0f, 1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0, 100, 0, 100);
glDisable(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);
//generate status bar
stringstream ss;
ss << "Health: " << m_CharacterDenzil->GetHealth() << " " << "Time: " << m_NullHour << (int)m_TimeHour << " : " << m_NullMin << (int)m_TimeMin << " : " << m_NullSec << (int)m_TimeSec << endl;
OutputLine(1, 95, ss.str());
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glEnable(GL_TEXTURE_2D);
glEnable(GL_LIGHTING);
}
//--------------------------------------------------------------------------------------------------
void setLight()
{
//set lights position on scene
lighting light =
{
{ 1.2f, 2.2f, 0.2f, 1.0f },
{ 3.7f, 5.7f, 0.7f, 1.0f },
{ 0.5f, 0.5f, 0.5f, 1.0f }
};
//fix up lights position
float light_pos[] = { 0.0f, 60.0f, 0.0f, 1.0f };
float light_pos1[] = { 0.0f, -60.0f, 0.0f, 1.0f };
//enable lights via glut
glLightfv(GL_LIGHT0, GL_AMBIENT, light.ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light.diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light.specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
glLightfv(GL_LIGHT1, GL_AMBIENT, light.ambient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, light.diffuse);
glLightfv(GL_LIGHT1, GL_SPECULAR, light.specular);
glLightfv(GL_LIGHT1, GL_POSITION, light_pos1);
}
//--------------------------------------------------------------------------------------------------
void GameScreenLevel1::Render()
{
//call rendering function from each model, light and hud module
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
GameScreen::Render();
glPushMatrix();
glRotatef(m_DodgeballSpin, 0.0f, 1.0f, 1.0f);
for (int i = 0; i < m_Dodgeballs.size(); i++)
{
m_Dodgeballs[i]->Render();
}
glPopMatrix();
glPushMatrix();
m_CharacterDenzil->Render();
glPopMatrix();
m_Floor->Render();
m_FinishPointObject->Render();
RenderHUD();
setLight();
}
//------------------------------------------------------------------------------------------
void GameScreenLevel1::Update(float deltaTime, SDL_Event e)
{
//update timer and character points if it is being collided
GameScreen::Update(deltaTime, e);
m_CharacterDenzil->Update(deltaTime, e);
m_Floor->Update(deltaTime);
m_FinishPointObject->Update(deltaTime, e);
m_DodgeballSpin += 0.01f;
m_CurrentTime += deltaTime;
m_TimeSec += deltaTime;
if (m_TimeMin > 59)
{
m_TimeMin = 0;
m_NullMin = "0";
m_TimeHour += 1;
}
if (m_TimeSec > 59)
{
m_NullSec = "0";
m_TimeSec = 0;
m_TimeMin += 1;
}
if (m_TimeMin > 10)
{
m_NullMin = "";
}
if (m_TimeSec > 10)
{
m_NullSec = "";
}
for (int i = 0; i < m_Dodgeballs.size(); i++)
{
m_Dodgeballs[i]->Update(deltaTime, e);
Collision::SphereCollision(m_Dodgeballs[i]->GetBoundingSphere(), m_Dodgeballs[i]->GetBoundingSphere());
if (Collision::SphereCollision(m_CharacterDenzil->GetBoundingSphere(), m_Dodgeballs[i]->GetBoundingSphere()))
{
if (m_CharacterDenzil->GetHealth() > 1)
{
m_CharacterDenzil->SetHealth(-1);
m_Dodgeballs.erase(m_Dodgeballs.begin() + i);
m_Impact->PlayEffect(1, 0);
m_Hits += 1;
}
else
{
m_Hurt->PlayEffect(2, 0);
m_NextScreen = GAMEOVER;
}
}
Collision::SphereCollision(m_CharacterDenzil->GetBoundingSphere(), m_FinishPointObject->GetBoundingSphere());
if (Collision::SphereCollision(m_CharacterDenzil->GetBoundingSphere(), m_FinishPointObject->GetBoundingSphere()))
{
m_Level1Win = true;
m_NextScreen = WIN;
}
}
}
//--------------------------------------------------------------------------------------------------