/* * 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 #include #include #include #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(172*globalScale,16*globalScale,24,22,globalScale); scoreboard.addComponent("jewel", SpriteComponent::spriteUIL1, jewelSrcRect, jewelDestRect); scoreboard.addGroup(groupUI_Layer1); tree.addComponent(292*globalScale,168*globalScale,192,142,globalScale); tree.addComponent("tree",SpriteComponent::spriteObject); tree.addGroup(groupObjects); //ecs implementation map->LoadMap("assets/maps/GS-Night.txt",48,32, globalScale); player.addComponent(50*globalScale,50*globalScale,40,40,globalScale); player.addComponent("player", SpriteComponent::spriteAnimation, "assets/textures/actors/owl_anim.json"); player.addComponent(); player.addComponent("player"); player.addGroup(groupPlayers); enemy.addComponent(180*globalScale,180*globalScale,32,32,globalScale); enemy.addComponent("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().collider; Vector2D playerPos = player.getComponent().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().collider; if(Collision::AABB(cCol, playerCol)) { player.getComponent().position = playerPos; } } // for(auto& p: projectiles) // { // if(Collision::AABB(player.getComponent().collider, p->getComponent().collider)) // { // std::cout << "Projectile hit player" << std::endl; // p->destroy(); // } // } camera.x = player.getComponent().position.x - camera.w/2; camera.y = player.getComponent().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); // }