top of page

3D Objects with OpenGL & Glut

  • YouTube Social  Icon

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

© 2016 by Daniel Bognar. Proudly created with Wix.com

  • Facebook Social Icon
bottom of page