added star highlighting, progress saving

This commit is contained in:
Ilshat Safiullin 2018-10-03 00:46:22 +05:00
parent 650ef4f460
commit 8b2950f9fb
8 changed files with 152 additions and 29 deletions

3
.gitignore vendored
View File

@ -75,4 +75,5 @@ iOSInjectionProject/
/windows/DoubleHitBalls-win/DoubleHitBalls-win/resources /windows/DoubleHitBalls-win/DoubleHitBalls-win/resources
*.db *.db
*.opendb *.opendb
/proj.android-studio/app/release/ /proj.android-studio/app/release/
assets/levels/user_progress.json

View File

@ -26,7 +26,8 @@
"paddingLeft": 10, "paddingLeft": 10,
"paddingRight": 10, "paddingRight": 10,
"itemSpacing": 20, "itemSpacing": 20,
"children" : [{ "children" : [
{
"type": "HorizontalLinearLayout", "type": "HorizontalLinearLayout",
"name": "row1", "name": "row1",
"paddingBottom": 15, "paddingBottom": 15,

View File

@ -0,0 +1,16 @@
precision highp float;
uniform sampler2D Texture;
uniform bool Hover;
varying vec2 texCoord;
varying vec4 color;
void main()
{
vec4 texColor = texture2D(Texture,texCoord).rgba;
gl_FragColor = color * texColor.rgba;
if (Hover)
{
gl_FragColor.xyz *= 1.5;
}
}

View File

@ -28,7 +28,6 @@ bool GalaxyMenu::InitGalaxyMenu(std::string config_json, float scale) {
boost::property_tree::ptree error_pt; boost::property_tree::ptree error_pt;
error_pt.put("error", "something goes wrong at InitGalaxyMenu"); error_pt.put("error", "something goes wrong at InitGalaxyMenu");
int levelIndex = 1;
/*..Init Menu..*/ /*..Init Menu..*/
BOOST_FOREACH(auto menu_pt, config_pt.get_child("Space", error_pt)) { BOOST_FOREACH(auto menu_pt, config_pt.get_child("Space", error_pt)) {
@ -39,6 +38,9 @@ bool GalaxyMenu::InitGalaxyMenu(std::string config_json, float scale) {
galax.texture = menu_pt.second.get<std::string>("texture", "error"); galax.texture = menu_pt.second.get<std::string>("texture", "error");
galax.position = Eigen::Vector2f(menu_pt.second.get<float>("position.x_coord", 0.0f), menu_pt.second.get<float>("position.y_coord", 0.0f)); galax.position = Eigen::Vector2f(menu_pt.second.get<float>("position.x_coord", 0.0f), menu_pt.second.get<float>("position.y_coord", 0.0f));
//boost::property_tree::ptree stars = menu_pt.second.get<boost::property_tree::ptree>("Stars", error_pt); //boost::property_tree::ptree stars = menu_pt.second.get<boost::property_tree::ptree>("Stars", error_pt);
int levelStar = 0;
BOOST_FOREACH(auto stars_pt, menu_pt.second.get_child("Stars", error_pt)) { BOOST_FOREACH(auto stars_pt, menu_pt.second.get_child("Stars", error_pt)) {
StarObject star; StarObject star;
@ -50,18 +52,24 @@ bool GalaxyMenu::InitGalaxyMenu(std::string config_json, float scale) {
ResourceManager->TexList.AddTexture(star.texture); ResourceManager->TexList.AddTexture(star.texture);
star.position = Eigen::Vector2f(stars_pt.second.get<float>("position.x_coord", 0.0f), stars_pt.second.get<float>("position.y_coord", 0.0f)); star.position = Eigen::Vector2f(stars_pt.second.get<float>("position.x_coord", 0.0f), stars_pt.second.get<float>("position.y_coord", 0.0f));
int levelIndex = 0;
/*..Levels..*/ /*..Levels..*/
BOOST_FOREACH(auto levels_pt, stars_pt.second.get_child("levels")) { BOOST_FOREACH(auto levels_pt, stars_pt.second.get_child("levels")) {
std::string levelName = levels_pt.second.get<std::string>("name", "empty"); std::string levelName = levels_pt.second.get<std::string>("name", "empty");
std::shared_ptr<TGameLevel> lvl = std::make_shared<TGameLevel>(); std::shared_ptr<TGameLevel> lvl = std::make_shared<TGameLevel>(levelStar, levelIndex);
lvl->FillWithFile(ST::PathToResources + levelName + ".txt"); lvl->FillWithFile(ST::PathToResources + levelName + ".txt");
star.selectionMenu.gameLevels.push_back(lvl); star.selectionMenu.gameLevels.push_back(lvl);
++levelIndex;
} }
galax.Stars.push_back(star); galax.Stars.push_back(star);
++levelStar;
} }
galaxies.push_back(galax); galaxies.push_back(galax);
} }
@ -203,12 +211,15 @@ void GalaxyMenu::DrawGalaxyMenu() {
); // DrawRect ); // DrawRect
/*..Draw stars..*/ /*..Draw stars..*/
Renderer->PushShader("HoverableButtonShader");
if (stars_params.size() >= i) { if (stars_params.size() >= i) {
for (int j = 0; j < stars_params[i].size(); j++) { for (int j = 0; j < stars_params[i].size(); j++) {
if (planetHoverIndex == j) { if (planetHoverIndex == j) {
RenderUniform1i("Hover", 1);
glBindTexture(GL_TEXTURE_2D, SE::ResourceManager->TexList[galaxies[i].Stars[j].textureName]); glBindTexture(GL_TEXTURE_2D, SE::ResourceManager->TexList[galaxies[i].Stars[j].textureName]);
} }
else { else {
RenderUniform1i("Hover", 0);
glBindTexture(GL_TEXTURE_2D, SE::ResourceManager->TexList[galaxies[i].Stars[j].textureName]); glBindTexture(GL_TEXTURE_2D, SE::ResourceManager->TexList[galaxies[i].Stars[j].textureName]);
} }
SE::Renderer->DrawRect( SE::Renderer->DrawRect(
@ -223,6 +234,7 @@ void GalaxyMenu::DrawGalaxyMenu() {
); // DrawRect ); // DrawRect
} }
} }
Renderer->PopShader();
/*..Draw level selection menu..*/ /*..Draw level selection menu..*/
//drawSelectionMenu(starIndex); //drawSelectionMenu(starIndex);
@ -494,16 +506,32 @@ int GalaxyMenu::negativeV(float val) {
} }
int GalaxyMenu::findPlanetByPos(Eigen::Vector2f pos) { int GalaxyMenu::findPlanetByPos(Eigen::Vector2f pos) {
for (int i = 0; i < stars_params.size(); i++) {
for (int j = 0; j < stars_params[i].size(); j++) { float minimalDistance = std::numeric_limits<float>::max();
if (pos(0) >= (stars_params[i][j].first(0) - stars_params[i][j].second(0) / 2) && pos(0) <= (stars_params[i][j].first(0) + stars_params[i][j].second(0) / 2)) { int index = -1;
if (pos(1) >= (stars_params[i][j].first(1) - stars_params[i][j].second(1) / 2) && pos(1) <= (stars_params[i][j].first(1) + stars_params[i][j].second(1) / 2)) {
return j; for (int i = 0; i < stars_params.size(); i++)
{
for (int j = 0; j < stars_params[i].size(); j++)
{
if (pos(0) >= (stars_params[i][j].first(0) - stars_params[i][j].second(0) / 2) && pos(0) <= (stars_params[i][j].first(0) + stars_params[i][j].second(0) / 2))
{
if (pos(1) >= (stars_params[i][j].first(1) - stars_params[i][j].second(1) / 2) && pos(1) <= (stars_params[i][j].first(1) + stars_params[i][j].second(1) / 2))
{
float dx = pos(0) - stars_params[i][j].first(0);
float dy = pos(1) - stars_params[i][j].first(1);
float distance = dx * dx + dy * dy;
if (distance < minimalDistance)
{
minimalDistance = distance;
index = j;
}
} }
} }
} }
} }
return -1; return index;
} }
bool GalaxyMenu::checkMenuBound(Eigen::Vector2f pos) { bool GalaxyMenu::checkMenuBound(Eigen::Vector2f pos) {

View File

@ -439,8 +439,10 @@ void TBall::Update(size_t dt)
//=========================================== //===========================================
TGameLevel::TGameLevel() TGameLevel::TGameLevel(int levelStar, int levelIndex)
{ {
this->levelStar = levelStar;
this->levelIndex = levelIndex;
BkgTexture = ""; BkgTexture = "";
@ -462,6 +464,16 @@ TGameLevel::TGameLevel()
TGameLevel::~TGameLevel() TGameLevel::~TGameLevel()
{ {
} }
int TGameLevel::getStarIndex()
{
return levelStar;
}
int TGameLevel::getLevelIndex()
{
return levelIndex;
}
@ -1319,6 +1331,8 @@ void TGameLevel::Update(size_t dt)
if (noMoreBlocks && LevelState != CONST_LEVELSTATE_FINISH_FREEZE) if (noMoreBlocks && LevelState != CONST_LEVELSTATE_FINISH_FREEZE)
{ {
Application->SaveUserProgress(levelStar, levelIndex);
Application->fireworkEffect(); // Firework start Application->fireworkEffect(); // Firework start
Application->OpenNextLevel(); Application->OpenNextLevel();

View File

@ -130,6 +130,9 @@ protected:
//std::string LevelScreenTexture; //std::string LevelScreenTexture;
std::string LevelFileName; std::string LevelFileName;
int levelIndex;
int levelStar;
GLuint prerenderedImage; GLuint prerenderedImage;
Vector2f ReflectorPos; Vector2f ReflectorPos;
@ -190,7 +193,7 @@ protected:
void ReloadLevel(); void ReloadLevel();
public: public:
TGameLevel(); TGameLevel(int levelStar, int levelIndex);
~TGameLevel(); ~TGameLevel();
void FillWithFile(const std::string& filename); void FillWithFile(const std::string& filename);
@ -199,6 +202,9 @@ public:
//void SetLevelScale(); //void SetLevelScale();
//Vector2f GetLevelScale(); //Vector2f GetLevelScale();
int getStarIndex();
int getLevelIndex();
void SetStandBy(); void SetStandBy();
void SetLoading(); void SetLoading();
bool IsLoaded(); bool IsLoaded();

View File

@ -54,9 +54,73 @@ const float CONST_CREDITS_SHOW_TIME = 150.f;
TMyApplication* Application; TMyApplication* Application;
int currentStar;
std::vector<int> finishedLevels;
void TMyApplication::LoadUserProgress()
{
boost::property_tree::ptree userProgressJson;
try
{
boost::property_tree::json_parser::read_json(ST::PathToResources + "levels/user_progress.json", userProgressJson);
currentStar = userProgressJson.get<int>("currentStar");
for (auto& index : userProgressJson.get_child("finishedLevels"))
{
finishedLevels.push_back(index.second.get_value<int>());
}
}
catch (...)
{
currentStar = 0;
finishedLevels.clear();
}
}
void TMyApplication::SaveUserProgress(int levelStar, int levelIndex)
{
if (levelStar < currentStar)
{
return;
}
auto iter = std::find(finishedLevels.begin(), finishedLevels.end(), levelIndex);
if (iter != finishedLevels.end())
{
return;
}
finishedLevels.push_back(levelIndex);
if (finishedLevels.size() == Menu.GalaxMenu.galaxies[0].Stars[currentStar].selectionMenu.gameLevels.size())
{
finishedLevels.clear();
if (currentStar < Menu.GalaxMenu.galaxies[0].Stars.size() - 1)
{
currentStar += 1;
}
}
boost::property_tree::ptree userProgressJson;
userProgressJson.put("currentStar", currentStar);
boost::property_tree::ptree finishedLevelsTree;
for (int index : finishedLevels)
{
boost::property_tree::ptree finishedLevel;
finishedLevel.put_value(index);
finishedLevelsTree.push_back(std::make_pair("", finishedLevel));
}
userProgressJson.put_child("finishedLevels", finishedLevelsTree);
boost::property_tree::json_parser::write_json(ST::PathToResources + "levels/user_progress.json", userProgressJson);
}
void TMyApplication::InnerInit() void TMyApplication::InnerInit()
{ {
Application = this; Application = this;
#ifdef TARGET_WIN32 #ifdef TARGET_WIN32
@ -76,6 +140,8 @@ void TMyApplication::InnerInit()
ST::PathToResources = ""; ST::PathToResources = "";
#endif #endif
LoadUserProgress();
if (Console != NULL) if (Console != NULL)
{ {
*Console<<"APP INIT\n"; *Console<<"APP INIT\n";
@ -93,6 +159,7 @@ void TMyApplication::InnerInit()
//ResourceManager->ShaderManager.AddShader("DefaultShader", "shaders/texture-shader.vertex", "shaders/texture-shader.fragment"); //ResourceManager->ShaderManager.AddShader("DefaultShader", "shaders/texture-shader.vertex", "shaders/texture-shader.fragment");
ResourceManager->ShaderManager.AddShader("DefaultShader", "shaders/gui_transparent.vertex", "shaders/gui_transparent.fragment"); ResourceManager->ShaderManager.AddShader("DefaultShader", "shaders/gui_transparent.vertex", "shaders/gui_transparent.fragment");
ResourceManager->ShaderManager.AddShader("HoverableButtonShader", "shaders/gui_transparent.vertex", "shaders/hoverable-button.fragment");
ResourceManager->ShaderManager.AddShader("BlackAndWhiteShader", "shaders/gui_transparent_blackandwhite.vertex", "shaders/gui_transparent_blackandwhite.fragment"); ResourceManager->ShaderManager.AddShader("BlackAndWhiteShader", "shaders/gui_transparent_blackandwhite.vertex", "shaders/gui_transparent_blackandwhite.fragment");
ResourceManager->ShaderManager.AddShader("ColorShader", "shaders/color-shader.vertex", "shaders/color-shader.fragment"); ResourceManager->ShaderManager.AddShader("ColorShader", "shaders/color-shader.vertex", "shaders/color-shader.fragment");
ResourceManager->ShaderManager.AddShader("FrameShader", "shaders/frameshader_vertex.txt", "shaders/frameshader_fragment.txt"); ResourceManager->ShaderManager.AddShader("FrameShader", "shaders/frameshader_vertex.txt", "shaders/frameshader_fragment.txt");
@ -137,7 +204,6 @@ void TMyApplication::InnerInit()
std::cout << "menu error" << std::endl; std::cout << "menu error" << std::endl;
} }
} }
void TMyApplication::InnerDeinit() void TMyApplication::InnerDeinit()
@ -403,9 +469,7 @@ void TMyApplication::InnerDraw()
{ {
//glDisable(GL_DEPTH_TEST); //glDisable(GL_DEPTH_TEST);
Renderer->PushShader("DefaultShader");
OnDrawSignal(); OnDrawSignal();
Renderer->PopShader();
} }
@ -755,17 +819,7 @@ void TMyApplication::InnerOnMouseMove(TMouseState& mouseState) {
bool TMyApplication::IsLevelOpened(int levelStar, int levelIndex) bool TMyApplication::IsLevelOpened(int levelStar, int levelIndex)
{ {
if (levelStar == 0) return levelStar <= currentStar;
{
return true;
}
if (levelStar == 1 && levelIndex < 3)
{
return true;
}
return false;
} }

View File

@ -137,6 +137,9 @@ public:
bool Loaded; bool Loaded;
TMyApplication() : TApplication(), Loaded(false), Inited(false) { } TMyApplication() : TApplication(), Loaded(false), Inited(false) { }
void LoadUserProgress();
void SaveUserProgress(int levelStar, int levelIndex);
virtual void InnerInit(); virtual void InnerInit();