309 lines
8.7 KiB
C++
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);
|
|
// }
|