/**
* Triangles
* Copyright (C) 2016 POSITIVE MENTAL ATTITUDE
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include "MenuState.hpp"
#include "Triangles.hpp"
#include "Utility.hpp"
MenuState::MenuState(): State(), _padSelection(0) {}
void MenuState::init()
{
for(unsigned int i = 0; i < 30; ++i)
{
//_crazyTriangles[i].setColor(50, rand() % 50 + 125, rand() % 50 + 200, rand() % 150 + 105);
_crazyColors[i][3] = rand() % 150 + 105;
_crazyTriangles[i].setSize(rand() % 384 + (rand() % 20 == 0 ? 900 : 300));
_crazyTriangles[i].setRotation(rand() % 360);
}
std::ifstream ifs("data/credits.txt");
std::ostringstream oss;
oss << ifs.rdbuf();
_credits.setString(sf::String(oss.str()));
_credits.setFont(_context->assets->loadFont("data/ttf/canonical/Ubuntu-L.ttf"));
_credits.setColor(sf::Color::Black);
_music.openFromFile("data/audio/Past the Edge.ogg");
_music.play();
_waterSine.loadFromFile("data/shaders/water.vs", sf::Shader::Fragment);
_waterMap.create(1920, 1080);
_waterFrag.loadFromFile("data/shaders/water.frag", sf::Shader::Fragment);
_waterFrag.setParameter("heightmap", _waterMap.getTexture());
_subStatus = Main;
_logo.bind([this]()
{
_subStatus = Credits;
_quit.setTexture(_context->assets->loadTexture("data/menu/Back.png"));
});
_logo.setRotation(97.5f);
_logo.setTexture(_context->assets->loadTexture("data/menu/Logo.png"));
_play.bind([this]()
{
_status = State::Ingame;
});
_play.setRotation(80.f);
_play.setTexture(_context->assets->loadTexture("data/menu/Play.png"));
_settings.bind([this]()
{
_subStatus = Settings;
_quit.setTexture(_context->assets->loadTexture("data/menu/Back.png"));
});
_settings.setRotation(260.f);
_settings.setTexture(_context->assets->loadTexture("data/menu/Settings.png"));
_quit.bind([this]()
{
switch(_subStatus)
{
case Main:
_context->running = false;
break;
case Settings:
_context->window->recreate();
// move on
default:
_quit.setTexture(_context->assets->loadTexture("data/menu/Quit.png"));
_subStatus = Main;
}
});
_quit.setRotation(100.f);
_quit.setTexture(_context->assets->loadTexture("data/menu/Quit.png"));
_status = State::Ongoing;
}
void MenuState::refresh()
{
_crazy.create(_context->window->getSize().x, _context->window->getSize().y);
for(unsigned int i = 0; i < 30; ++i)
{
for(unsigned int j = 0; j < 3; ++j)
_crazyColors[i][j] = rand() % 50 - 25;
_crazyTriangles[i].setPosition(rand() % _context->window->getSize().x, rand() % _context->window->getSize().y);
}
float u = 1.f; // GUI size essentially; halves when screen size drops below 1024x768.
if(_context->window->getSize().x < 1024)
u = 0.5f;
/*
* SETTINGS
*/
_shaders.create(_context->assets->loadFont("data/ttf/canonical/Ubuntu-L.ttf"), "Shaders", &_context->shaders);
_shaders.setSize(250.f * u);
_shaders.setPosition(_context->window->getSize().x / 2.f + 250.f * u,
_context->window->getSize().y / 2.f - 200.f * u);
_shaders.setCharacterSize(40 * u);
_fullscreen.create(_context->assets->loadFont("data/ttf/canonical/Ubuntu-L.ttf"), "Fullscreen", &_context->fullscreen);
_fullscreen.flip(true);
_fullscreen.setSize(250.f * u);
_fullscreen.setPosition(_context->window->getSize().x / 2.f - 250.f * u,
_context->window->getSize().y / 2.f - 200.f * u);
_fullscreen.setCharacterSize(40 * u);
/*
* CREDITS
*/
_credits.setCharacterSize(32.f * u);
_credits.setPosition(_context->window->getSize().x / 2.f - _credits.getLocalBounds().width / 2.f, _context->window->getSize().y / 2.f - _credits.getLocalBounds().height / 2.f);
/*
* MAIN MENU
*/
_logo.setSize(325.f * u);
_play.setSize(225.f * u);
_settings.setSize(225.f * u);
_quit.setSize(175.f * u);
_logo.setPosition(_context->window->getSize().x / 2.f - 110.f * u, _context->window->getSize().y / 2.f - 200.f * u);
_play.setPosition(_context->window->getSize().x / 2.f + 260.f * u, _context->window->getSize().y / 2.f - 60.f * u);
_settings.setPosition(_context->window->getSize().x / 2.f - 260.f * u, _context->window->getSize().y / 2.f + 30.f * u);
_quit.setPosition(_context->window->getSize().x / 2.f + 260.f * u, _context->window->getSize().y / 2.f + 260.f * u);
}
void MenuState::coreThink(const sf::Event& event)
{
if(event.type == sf::Event::MouseButtonPressed && event.mouseButton.button == sf::Mouse::Left)
{
sf::Vector2i xy = _context->window->getMousePosition();
switch(_subStatus)
{
case Main:
_logo.click(xy);
_play.click(xy);
_settings.click(xy);
break;
case Settings:
_shaders.click(xy);
_fullscreen.click(xy);
break;
case Credits:
break;
}
_quit.click(xy);
}
if(event.type == sf::Event::Closed || (event.type == sf::Event::KeyPressed and event.key.code == sf::Keyboard::Escape))
_context->running = false;
if(event.type == sf::Event::JoystickMoved && event.joystickMove.axis == sf::Joystick::Axis::PovX)
{
if(event.joystickMove.position == -100)
switch(_padSelection)
{
case 1: _padSelection = 2; break;
default: break;
}
if(event.joystickMove.position == 100)
switch(_padSelection)
{
case 0: _padSelection = 1; break;
case 2: _padSelection = 1; break;
default: break;
}
}
if(event.type == sf::Event::JoystickMoved && event.joystickMove.axis == sf::Joystick::Axis::PovY)
{
if(event.joystickMove.position == -100)
switch(_padSelection)
{
case 1: _padSelection = 0; break;
case 2: _padSelection = 0; break;
case 3: _padSelection = 1; break;
default: break;
}
if(event.joystickMove.position == 100)
switch(_padSelection)
{
case 0: _padSelection = 2; break;
case 1: _padSelection = 3; break;
case 2: _padSelection = 3; break;
default: break;
}
}
}
void MenuState::coreInput()
{
}
void MenuState::coreUpdate(sf::Time delta)
{
float seconds = delta.asSeconds();
{
static float r = rand() % 256, g = rand() % 256, b = rand() % 256;
static int rInc = 1, gInc = 1, bInc = 1;
r += (rand() % 40) * seconds * rInc;
g += (rand() % 30) * seconds * gInc;
b += (rand() % 20) * seconds * bInc;
if(r >= 225.f)
{
r = 225.f;
rInc = -1;
}
if(g >= 225.f)
{
g = 225.f;
gInc = -1;
}
if(b >= 225.f)
{
b = 225.f;
bInc = -1;
}
if(r <= 60)
{
r = 60;
rInc = 1;
}
if(g <= 60)
{
g = 60;
gInc = 1;
}
if(b <= 60)
{
b = 60;
bInc = 1;
}
_color = sf::Color(r, g, b);
_logo.setColor(_color);
_quit.setColor(_color);
_settings.setColor(_color);
_play.setColor(_color);
_shaders.setColor(_color);
_fullscreen.setColor(_color);
for(unsigned i = 0; i < 30; ++i)
_crazyTriangles[i].setColor(sf::Color(r + _crazyColors[i][0] , g + _crazyColors[i][1], b + _crazyColors[i][2], _crazyColors[i][3]));
}
static bool ongoing = false;
static int k = -1;
static float d = 0;
static float direction = 0.f;
static float speed = 0.f;
static float r = 0;
if(!ongoing)
{
r = rand() % 2 + 1.f;
k = rand() % 30;
ongoing = true;
rand() % 2 == 0 ? direction = 1.f : direction = -1.f;
speed = 0.1f;
}
if(k != -1)
{
float x = delta.asSeconds() * 60.f * speed * direction;
_crazyTriangles[k].rotate(x);
d += delta.asSeconds();
2 * d < r ? speed += delta.asSeconds() * 3.5f : speed -= delta.asSeconds() * 3.5f;
if(d > r)
{
k = -1;
ongoing = false;
d = 0;
}
}
static sf::Clock clock;
_waterSine.setParameter("time", clock.getElapsedTime().asSeconds());
if(sf::Joystick::isConnected(0))
{
sf::Vector2f v;
switch(_padSelection)
{
case 0:
v = _logo.getPosition();
break;
case 1:
v = _play.getPosition();
break;
case 2:
v = _settings.getPosition();
break;
case 3:
v = _quit.getPosition();
break;
}
_context->window->lockMouse(sf::Vector2i(v));
}
_logo.update(_context->window->getMousePosition(), delta);
_play.update(_context->window->getMousePosition(), delta);
_settings.update(_context->window->getMousePosition(), delta);
_quit.update(_context->window->getMousePosition(), delta);
}
void MenuState::coreRender(const bool shaders)
{
//_crazy.clear(sf::Color(100, 150, 220));
_crazy.clear(_color);
for(unsigned int i = 0; i < 30; ++i)
_crazy.draw(_crazyTriangles[i]);
sf::Sprite crazy(_crazy.getTexture());
_waterMap.clear();
sf::RectangleShape rect(sf::Vector2f(1920.f, 1080.f));
if(shaders)
_waterMap.draw(rect, &_waterSine);
else
_waterMap.draw(rect);
_waterMap.display();
if(shaders)
_context->window->draw(crazy, &_waterFrag);
else
_context->window->draw(crazy);
switch(_subStatus)
{
case Main:
_context->window->draw(_logo);
_context->window->draw(_play);
_context->window->draw(_settings);
break;
case Settings:
_context->window->draw(_shaders);
_context->window->draw(_fullscreen);
break;
case Credits:
_context->window->draw(_credits);
break;
}
_context->window->draw(_quit);
}