PogoBijoux/main.cpp

207 lines
5.9 KiB
C++
Raw Normal View History

2022-07-19 19:39:33 +02:00
#include <irrlicht.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include "TitleMenu.h"
#include "LevelSwitcher.h"
#include "Base.h"
#include "RayCastHandler.h"
LevelSwitcher levelSwitcher;
RayCastHandler rayCastHandler;
int main()
{
irr::u32 then;
printf("Welcome to PogoBijoux!\n\n\n You can close the game at any time by pressing ESC.\n\nEnter the # of the level you want to go to: ");
scanf("%i", &levelSwitcher.currentLevel);
float leftRightVel;
float angularVel;
float rotVel;
pb.screenWidth = 1000;
pb.screenHeight = 700;
pb.device = createDevice(irr::video::EDT_OPENGL, irr::core::dimension2d<irr::u32>(pb.screenWidth, pb.screenHeight), 16, false, true, false, &pb.er);
pb.driver = pb.device -> getVideoDriver();
pb.scnmgr = pb.device -> getSceneManager();
pb.guiEnv = pb.device -> getGUIEnvironment();
// Frame title //
pb.device -> setWindowCaption(L"PogoBijoux by MCL Software | Rate us on Itch.io!!!");
// Initialize audio engine //
initAudioEngine();
// Main menu //
if(!showTitleScreen())
{
return 0;
}
////////////
// Player //
////////////
pb.player = pb.scnmgr -> addCubeSceneNode(100);
pb.camera = pb.scnmgr -> addCameraSceneNode(pb.player, irr::core::vector3df(0, 0, 0), pb.player -> getAbsolutePosition(), true);
pb.camera -> setPosition(irr::core::vector3df(-20, 30, 0));
pb.camera -> setFarValue(100000.0F);
// Set shadow color //
pb.scnmgr -> setShadowColor(irr::video::SColor(150, 0, 0, 0));
// Store textures in 32-bits; this is needed for parallax mapping //
pb.driver -> setTextureCreationFlag(irr::video::ETCF_ALWAYS_32_BIT, true);
loadLevel(levelSwitcher.currentLevel);
//device -> getCursorControl() -> setVisible(false); // Hide the cursor, currently commented out, as the game currently doesn't use the mouse for controls.
while(pb.device -> run())
{
pb.driver -> beginScene(true, true, irr::video::SColor(255, 113, 113, 133));
// Compute frame delta time //
const irr::u32 now = pb.device -> getTimer() -> getTime();
const irr::f32 frameDeltaTime = (irr::f32)(now - then) / 1000.0F;
then = now;
if(pb.er.isKeyDown(irr::KEY_ESCAPE))
{
pb.device -> closeDevice();
}
if(pb.er.isKeyDown(irr::KEY_KEY_W))
{
angularVel = -pb.speed * frameDeltaTime;
}
else if(pb.er.isKeyDown(irr::KEY_KEY_S))
{
angularVel = pb.speed * frameDeltaTime;
}
else
{
angularVel = 0;
}
if(pb.er.isKeyDown(irr::KEY_KEY_A))
{
leftRightVel = -90;
}
else if(pb.er.isKeyDown(irr::KEY_KEY_D))
{
leftRightVel = 90;
}
else
{
leftRightVel = 0;
}
if(pb.er.isKeyDown(irr::KEY_F2))
{
// Display position and rotation //
printf("\nCoordinates: %f, %f, %f\nRotation: %f\n\n", pb.player -> getAbsolutePosition().X, pb.player -> getAbsolutePosition().Y, pb.player -> getAbsolutePosition().Z, pb.player -> getRotation().Y);
}
if(pb.er.isKeyDown(irr::KEY_F1))
{
// Get camera target and print it to output //
rayCastHandler.isPlayerLookingAtAABB(irr::core::aabbox3d<irr::f32>(irr::core::vector3df(432, 0, -300), irr::core::vector3df(500, 300, 466)));
}
/////////////////////
// Camera rotation //
/////////////////////
// Up / Down //
if(pb.er.isKeyDown(irr::KEY_UP) && pb.verticalCamRot < 100)
{
if(pb.verticalCamRot < -10)
pb.verticalCamRot -= (2 * pb.verticalCamRot / 10) * frameDeltaTime;
else
pb.verticalCamRot += 56 * frameDeltaTime;
}
else if(pb.er.isKeyDown(irr::KEY_DOWN) && pb.verticalCamRot > -120)
{
if(pb.verticalCamRot < -10)
pb.verticalCamRot += (2 * pb.verticalCamRot / 10) * frameDeltaTime;
else
pb.verticalCamRot -= 56 * frameDeltaTime;
}
// Left / Right //
if(pb.er.isKeyDown(irr::KEY_LEFT))
rotVel = -300 * frameDeltaTime;
else if(pb.er.isKeyDown(irr::KEY_RIGHT))
rotVel = 300 * frameDeltaTime;
else
rotVel = 0;
irr::core::vector3df playerRot = pb.player -> getRotation();
irr::core::vector3df playerPos = pb.player -> getAbsolutePosition();
pb.camera -> setTarget(irr::core::vector3df(playerPos.X - cos(irr::core::degToRad(playerRot.Y + leftRightVel)) * angularVel, playerPos.Y + pb.verticalCamRot, playerPos.Z + sin(irr::core::degToRad(playerRot.Y + leftRightVel)) * angularVel));
pb.player -> setRotation(irr::core::vector3df(playerRot.X, playerRot.Y + rotVel, playerRot.Z));
pb.player -> setPosition(irr::core::vector3df(playerPos.X - cos(irr::core::degToRad(playerRot.Y + leftRightVel)) * angularVel, playerPos.Y, playerPos.Z + sin(irr::core::degToRad(playerRot.Y + leftRightVel)) * angularVel));
pb.player -> updateAbsolutePosition();
// Water on Level 7 //
if(levelSwitcher.currentLevel == 7)
{
if(pb.player -> getAbsolutePosition().Y < -80)
{
waterSurface -> setRotation(irr::core::vector3df(0, 0, 180));
pb.showWaterOverlay = true;
}
else
{
waterSurface -> setRotation(irr::core::vector3df(0, 0, 0));
pb.showWaterOverlay = false;
}
}
levelSwitcher.checkIfPlayerShouldGoToNextLevel();
pb.scnmgr -> drawAll();
pb.drawIngameHUD();
pb.guiEnv -> drawAll();
pb.driver -> endScene();
pb.guiEnv -> clear();
levelSwitcher.proceedWithLevelSwitch();
}
stopAudioEngine();
pb.device -> drop();
return 0;
}