KaijuSaveEarth/src/game/Game.cpp

309 lines
8.7 KiB
C++

/*
* Game.cpp
*
* Created on: Feb 9, 2020
* Author: ayoungblood
* Special Thanks to: Carl Birch of Let's Make Games
* Nic Allen
* Brian Lhota
*/
#include "Game.hpp"
#include "../assetmgr/TextureManager.h"
#include "../assetmgr/Map.h"
#include "../ecs/Components.h"
#include "Collision.h"
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include "../assetmgr/AssetManager.h"
#include "../ui/UIText.h"
#include "../ui/UINineSlice.h"
#include "../cjson/cJSON.h"
Map* map;
Manager manager;
UIText* text;
UINineSlice* my9Slice;
UIText* scoreboardText;
UINineSlice* scoreboard9Slice;
SDL_Renderer* Game::renderer = nullptr;
SDL_Event Game::event;
SDL_Rect Game::camera;
AssetManager* Game::assets = new AssetManager(&manager);
bool Game::isRunning = false;
auto& player(manager.addEntity());
auto& enemy(manager.addEntity());
auto& scoreboard(manager.addEntity());
auto& uiInfo(manager.addEntity());
auto& tree(manager.addEntity());
bool Game::debugCollisionBoxes = false;
int gScale = 0;
Game::Game() {
// TODO Auto-generated constructor stub
}
Game::~Game() {
// TODO Auto-generated destructor stub
}
void Game::init(const char *title, int width, int height, bool fullscreen, int globalScale)
{
camera = { 0, 0, width, height };
int flags = 0;
gScale = globalScale;
if(fullscreen)
{
flags = SDL_WINDOW_FULLSCREEN;
}
if(SDL_Init(SDL_INIT_EVERYTHING) == 0)
{
window = SDL_CreateWindow(title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, flags);
if(!window)
{
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,"Couldn't create window: %s", SDL_GetError());
}
renderer = SDL_CreateRenderer(window, -1, 0);
if(!renderer)
{
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create renderer: %s", SDL_GetError());
isRunning = false;
}
else
{
SDL_SetRenderDrawColor(renderer, 255,255,255,255);
isRunning = true;
}
//Initialize SDL_mixer
if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048)<0)
{
SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Couldn't initialize SDL audio mixer!, Error: %s", SDL_GetError());
}
assets->AddTexture("terrain", "assets/textures/tiles/GS-tiles2.png");
assets->AddTexture("player", "assets/textures/actors/owl_anim.png");
assets->AddTexture("font", "assets/textures/ui/ui-font-tombstone-serif.png");
assets->AddTexture("textBox", "assets/textures/ui/ui-element-tombstone.png");
assets->AddTexture("tree","assets/textures/objects/tree.png");
assets->AddTexture("jewel","assets/textures/objects/jewel.png");
assets->AddTexture("daynighticon","assets/textures/ui/day-night-icon.png");
assets->AddTexture("robber","assets/textures/actors/robberrodent.png");
assets->AddMusicTrack("simonZ","assets/audio/music/sailing16.ogg");
assets->AddSoundClip("bwoop","assets/audio/sfx/bwoop.wav");
map = new Map("terrain",globalScale,16);
const char* myText = "Beagle Rescue";
text = new UIText(myText, "font", 0, 0, 8, 12, globalScale);
text->ParseString(myText, 12, 22, globalScale);
SDL_Rect myDestRect = SDL_Rect();
myDestRect.x = 12;
myDestRect.y = 8;
myDestRect.w = 140;
myDestRect.h = 40;
my9Slice = new UINineSlice("textBox");
my9Slice->MakeSlices("textBox",128,128,16,111,16,111,myDestRect,globalScale);
const char* sbText = "500";
scoreboardText = new UIText(sbText, "font", 0, 0, 8, 12, globalScale);
scoreboardText->ParseString(sbText, 190, 22, globalScale);
SDL_Rect scoreboardDestRect = SDL_Rect();
scoreboardDestRect.x = 164;
scoreboardDestRect.y = 8;
scoreboardDestRect.w = 140;
scoreboardDestRect.h = 40;
scoreboard9Slice = new UINineSlice("textBox");
SDL_Rect jewelSrcRect = SDL_Rect();
jewelSrcRect.x = 0;
jewelSrcRect.y = 0;
jewelSrcRect.w = 24;
jewelSrcRect.h = 22;
SDL_Rect jewelDestRect = SDL_Rect();
jewelDestRect.x = 0;
jewelDestRect.y = 0;
jewelDestRect.w = 24*globalScale;
jewelDestRect.h = 22*globalScale;
scoreboard9Slice->MakeSlices("textBox",128,128,16,111,16,111,scoreboardDestRect,globalScale);
scoreboard.addComponent<TransformComponent>(172*globalScale,16*globalScale,24,22,globalScale);
scoreboard.addComponent<SpriteComponent>("jewel", SpriteComponent::spriteUIL1, jewelSrcRect, jewelDestRect);
scoreboard.addGroup(groupUI_Layer1);
tree.addComponent<TransformComponent>(292*globalScale,168*globalScale,192,142,globalScale);
tree.addComponent<SpriteComponent>("tree",SpriteComponent::spriteObject);
tree.addGroup(groupObjects);
//ecs implementation
map->LoadMap("assets/maps/GS-Night.txt",48,32, globalScale);
player.addComponent<TransformComponent>(50*globalScale,50*globalScale,40,40,globalScale);
player.addComponent<SpriteComponent>("player", SpriteComponent::spriteAnimation, "assets/textures/actors/owl_anim.json");
player.addComponent<KeyboardController>();
player.addComponent<ColliderComponent>("player");
player.addGroup(groupPlayers);
enemy.addComponent<TransformComponent>(180*globalScale,180*globalScale,32,32,globalScale);
enemy.addComponent<SpriteComponent>("robber", SpriteComponent::spriteAnimation, "assets/textures/actors/robberrodent.json");
enemy.addGroup(groupEnemies);
} else {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't Initialize SDL: %s", SDL_GetError());
isRunning = false;
}
}
//camera.x = camera.x*globalScale;
auto& tiles(manager.getGroup(Game::groupMap));
auto& players(manager.getGroup(Game::groupPlayers));
auto& colliders(manager.getGroup(Game::groupColliders));
auto& objects(manager.getGroup(Game::groupObjects));
auto& enemies(manager.getGroup(Game::groupEnemies));
// auto& projectiles(manager.getGroup(Game::groupProjectiles));
auto& gui(manager.getGroup(Game::groupUI_Layer0));
auto& uiText(manager.getGroup(Game::groupUI_Layer1));
void Game::handleEvents()
{
SDL_PollEvent(&event);
switch (event.type)
{
case SDL_QUIT:
isRunning = false;
break;
default:
break;
}
}
void Game::update()
{
SDL_Rect playerCol = player.getComponent<ColliderComponent>().collider;
Vector2D playerPos = player.getComponent<TransformComponent>().position;
if (Mix_PlayingMusic() == 0)
{
// std::cout << "Play Music Now" << std::endl;
Mix_PlayMusic(assets->GetMusicTrack("simonZ"), -1);
}
manager.refresh();
manager.update();
for (auto& c : colliders)
{
SDL_Rect cCol = c->getComponent<ColliderComponent>().collider;
if(Collision::AABB(cCol, playerCol))
{
player.getComponent<TransformComponent>().position = playerPos;
}
}
// for(auto& p: projectiles)
// {
// if(Collision::AABB(player.getComponent<ColliderComponent>().collider, p->getComponent<ColliderComponent>().collider))
// {
// std::cout << "Projectile hit player" << std::endl;
// p->destroy();
// }
// }
camera.x = player.getComponent<TransformComponent>().position.x - camera.w/2;
camera.y = player.getComponent<TransformComponent>().position.y - camera.h/2;
if(camera.x < 0)
camera.x = 0;
if (camera.y < 0)
camera.y = 0;
if (camera.x > map->width-camera.w)
camera.x = map->width-camera.w;
if (camera.y > map->height-camera.h)
camera.y = map->height-camera.h;
}
void Game::render()
{
SDL_RenderClear(renderer);
for (auto& t : tiles)
{
t->draw();
}
if (Game::debugCollisionBoxes)
{
for (auto& c : colliders)
{
c->draw();
}
}
for (auto& o : objects)
{
o->draw();
}
for (auto& e : enemies)
{
e->draw();
}
for (auto& p : players)
{
p->draw();
}
for (auto& guiElement : gui)
{
guiElement->draw();
}
for (auto& letter : uiText)
{
letter->draw();
}
// Vector2D origPt;
// Vector2D destPt;
// origPt.Zero();
// destPt.x = 320.0*gScale;
// destPt.y = 240.0*gScale;
// drawLine(origPt,destPt,255,0,0);
SDL_RenderPresent(renderer);
}
void Game::clean()
{
SDL_DestroyWindow(window);
SDL_DestroyRenderer(renderer);
IMG_Quit();
Mix_Quit();
SDL_Quit();
printf("Game Cleaned\n");
}
void Game::printDebug(char* debugInfo)
{
printf("%s",debugInfo);
printf("\n");
}
// void Game::drawLine(Vector2D srcpt, Vector2D destpt, int red, int green, int blue)
// {
// SDL_SetRenderDrawColor(renderer, red, green, blue, 255);
// SDL_RenderDrawLine(renderer, srcpt.x, srcpt.y, destpt.x, destpt.y);
// }