Compare commits

..

9 Commits

Author SHA1 Message Date
e2a787ab2f fix variadic macro 2025-03-29 16:53:51 +01:00
7ecd47f20c make text bigger 2025-03-29 16:49:45 +01:00
095dbfb0b9 static for mingw only 2025-03-29 16:47:23 +01:00
2f0c9ad012 make quit button useful 2025-03-29 16:46:57 +01:00
6fa0475acf remove implicit libsdl2 require 2025-03-29 16:34:19 +01:00
3d461163d3 remove exclamation marks 2025-03-19 18:26:10 +01:00
c9809a934f ignore imgui 2025-03-19 18:23:09 +01:00
e08f8be87d basic README 2025-03-19 18:22:03 +01:00
db921e3390 fix deps 2025-03-19 18:19:35 +01:00
8 changed files with 74 additions and 45 deletions

3
.gitignore vendored
View File

@@ -7,3 +7,6 @@ build/
# Vscode # Vscode
.vscode .vscode
# ImGui
**/imgui.ini

21
README.md Normal file
View File

@@ -0,0 +1,21 @@
# Perfect Ear
Train your ears to recognize piano notes !
## Screenshots
[[screenshots/success.png]]
[[screenshots/failure.png]]
## Build ⚙️
```bash
xmake # xmake will download all the required dependencies
```
## Run 🏃
```bash
xmake run
```

View File

@@ -3,7 +3,7 @@
namespace ph { namespace ph {
namespace gui { namespace gui {
void Render(); bool Render();
void Init(); void Init();
} // namespace gui } // namespace gui

BIN
screenshots/failure.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
screenshots/success.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -5,12 +5,12 @@
#include <random> #include <random>
#include <string> #include <string>
#define DISABLED_COND(code, cond) \ #define DISABLED_COND(cond, ...) \
{ \ { \
bool Disabled = cond; \ bool Disabled = (cond); \
if (Disabled) \ if (Disabled) \
ImGui::BeginDisabled(); \ ImGui::BeginDisabled(); \
code if (Disabled) ImGui::EndDisabled(); \ __VA_ARGS__ if (Disabled) ImGui::EndDisabled(); \
} }
@@ -65,11 +65,10 @@ static void RenderGameWindow() {
ImGui::Text("Quelle est la note ?"); ImGui::Text("Quelle est la note ?");
DISABLED_COND( DISABLED_COND(
if (ImGui::Button("Réécouter")) { !Hint, if (ImGui::Button("Réécouter")) {
audio::PlayNote(Answer); audio::PlayNote(Answer);
Hint = false; Hint = false;
}, })
!Hint)
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Voir la réponse")) { if (ImGui::Button("Voir la réponse")) {
@@ -84,51 +83,53 @@ static void RenderGameWindow() {
Right = false; Right = false;
} }
if (Cooldown > 0.0) DISABLED_COND(
ImGui::BeginDisabled(); Cooldown > 0.0f, for (int i = 0; i < NoteCount; i++) {
ImVec4 color = (i == Ab || i == Bb || i == Db || i == Eb || i == Gb) ? ImVec4{0, 0, 0, 1} : ImVec4{0.5, .5, .5, 1};
for (int i = 0; i < NoteCount; i++) { ImGui::PushStyleColor(ImGuiCol_Button, color);
ImVec4 color = (i == Ab || i == Bb || i == Db || i == Eb || i == Gb) ? ImVec4{0, 0, 0, 1} : ImVec4{0.5, .5, .5, 1}; bool green = (ShowAnswer && i == Answer);
ImGui::PushStyleColor(ImGuiCol_Button, color); if (green)
bool green = (ShowAnswer && i == Answer); ImGui::PushStyleColor(ImGuiCol_Button, {0, 1, 0, 1});
if (green) if (ImGui::Button(Notes[i].c_str())) {
ImGui::PushStyleColor(ImGuiCol_Button, {0, 1, 0, 1}); Cooldown = audio::NoteDuration();
if (ImGui::Button(Notes[i].c_str())) { Right = (i == Answer);
Cooldown = audio::NoteDuration(); if (Right && !ShowAnswer) {
Right = (i == Answer); audio::PlayNote(Answer);
if (Right && !ShowAnswer) { Score++;
audio::PlayNote(Answer); } else {
Score++; Score = 0;
} else { }
Score = 0;
} }
} if (green)
if (green) ImGui::PopStyleColor();
ImGui::PopStyleColor(); ImGui::PopStyleColor();
ImGui::PopStyleColor(); ImGui::SameLine();
ImGui::SameLine(); })
}
if (Cooldown > 0.0)
ImGui::EndDisabled();
} }
static void RenderMainWindow() { static bool RenderMainWindow() {
if (ImGui::Button("Nouvelle Partie")) { if (ImGui::Button("Nouvelle Partie")) {
InGame = true; InGame = true;
Right = true; Right = true;
} }
if (ImGui::Button("Quitter")) {} if (ImGui::Button("Quitter")) {
return false;
}
return true;
} }
void Render() { bool Render() {
ImGuiIO& io = ImGui::GetIO(); ImGuiIO& io = ImGui::GetIO();
ImGui::SetNextWindowPos(ImVec2(io.DisplaySize.x * 0.5f, io.DisplaySize.y * 0.5f), ImGuiCond_Always, ImVec2(0.5f, 0.5f)); ImGui::SetNextWindowPos(ImVec2(io.DisplaySize.x * 0.5f, io.DisplaySize.y * 0.5f), ImGuiCond_Always, ImVec2(0.5f, 0.5f));
ImGui::Begin("MainWindow", nullptr, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration); ImGui::Begin("MainWindow", nullptr, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration);
if (InGame) if (InGame)
RenderGameWindow(); RenderGameWindow();
else else {
RenderMainWindow(); if (!RenderMainWindow()) {
ImGui::End();
return false;
}
}
if (Cooldown > 0.0f) { if (Cooldown > 0.0f) {
ImGui::NewLine(); ImGui::NewLine();
@@ -143,6 +144,8 @@ void Render() {
#ifndef NDEBUG #ifndef NDEBUG
ImGui::ShowDemoWindow(); ImGui::ShowDemoWindow();
#endif #endif
return true;
} }
void Init() {} void Init() {}

View File

@@ -102,7 +102,7 @@ int main(int, char**) {
// io.Fonts->GetGlyphRangesJapanese()); IM_ASSERT(font != nullptr); // io.Fonts->GetGlyphRangesJapanese()); IM_ASSERT(font != nullptr);
ImFontConfig cfg; ImFontConfig cfg;
cfg.SizePixels = 30; cfg.SizePixels = 40;
io.Fonts->AddFontDefault(&cfg); io.Fonts->AddFontDefault(&cfg);
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
@@ -146,7 +146,10 @@ int main(int, char**) {
ImGui_ImplSDL2_NewFrame(); ImGui_ImplSDL2_NewFrame();
ImGui::NewFrame(); ImGui::NewFrame();
ph::gui::Render(); if (!done && !ph::gui::Render()) {
done = true;
}
// Rendering // Rendering
ImGui::Render(); ImGui::Render();

View File

@@ -1,16 +1,15 @@
add_rules("mode.debug", "mode.release") add_rules("mode.debug", "mode.release")
add_requires("libsdl") add_requires("libsdl2_mixer 2.8.1")
add_requires("libsdl_mixer", {system = true}) add_requires("imgui v1.91.8", {configs = {sdl2 = true, opengl3 = true}})
add_requires("imgui", {configs = {sdl2 = true, opengl3 = true}})
target("PerfectHear") target("PerfectHear")
set_kind("binary") set_kind("binary")
add_files("src/*.cpp") add_files("src/*.cpp")
add_includedirs("include") add_includedirs("include")
add_packages("libsdl", "libsdl_mixer", "imgui") add_packages("libsdl2", "libsdl2_mixer", "imgui")
if is_os("windows") then if is_plat("mingw") then
add_ldflags("-static") add_ldflags("-static")
end end