|
From: Markus R. <god...@us...> - 2009-07-29 15:35:29
|
Module: performous
Branch: master
Commit: b2bad5d7d2794d071d001952445f42191eb8e3f9
Author: Markus Raab <un...@ma...>
Date: Fri Jul 24 18:58:40 2009 +0200
lots of fixes
dirty implementation
now selection works
you can press enter to quit
(but there song is replayed?,
but score is shown)
---
game/players.cc | 27 ++++++++++++++++++---------
game/players.hh | 37 ++++++++++++++++++++-----------------
game/screen_players.cc | 32 ++++++++++++++++----------------
3 files changed, 54 insertions(+), 42 deletions(-)
diff --git a/game/players.cc b/game/players.cc
index c9830d3..ec2c129 100644
--- a/game/players.cc
+++ b/game/players.cc
@@ -8,19 +8,18 @@ Players::Players(std::string filename):
m_filtered(),
m_filename(filename),
m_filter(),
- math_cover()
+ math_cover(),
+ m_dirty(false)
{
load();
m_filtered = m_players;
}
-Players::~Players()
-{
+Players::~Players() {
save();
}
-void Players::load()
-{
+void Players::load() {
std::ifstream in (m_filename.c_str());
std::string str;
@@ -30,8 +29,7 @@ void Players::load()
}
}
-void Players::save()
-{
+void Players::save() {
std::ofstream out (m_filename.c_str());
for (players_t::const_iterator it = m_players.begin(); it!=m_players.end(); ++it)
@@ -40,14 +38,18 @@ void Players::save()
}
}
-void Players::addPlayer (std::string const& name)
-{
+void Players::update() {
+ if (m_dirty) filter_internal();
+}
+
+void Players::addPlayer (std::string const& name) {
PlayerItem pi;
pi.name = name;
players_t::const_iterator it = std::find(m_players.begin(), m_players.end(), pi);
if (it != m_players.end()) return; // dont do anything, player exists
+ m_dirty = true;
m_players.push_back(pi);
}
@@ -57,9 +59,14 @@ void Players::setFilter(std::string const& val) {
filter_internal();
}
+#include <iostream> //TODO remove
+
void Players::filter_internal() {
+ m_dirty = false;
+
if (m_filter == "")
{
+ std::cout << "empty filter" << std::endl; //TODO remove
// without filter get all names
m_filtered = m_players;
return;
@@ -75,8 +82,10 @@ void Players::filter_internal() {
players_t(m_players.begin(), m_players.end()).swap(m_filtered); // Invalid regex => copy everything
}
math_cover.reset();
+ // TODO restore selection
}
+
/*
#include <iostream>
diff --git a/game/players.hh b/game/players.hh
index e45ea59..ca4bf43 100644
--- a/game/players.hh
+++ b/game/players.hh
@@ -1,6 +1,7 @@
#pragma once
#include <vector>
#include <string>
+#include <boost/utility.hpp>
#include "animvalue.hh"
@@ -10,8 +11,7 @@
Used for Players Management.
*/
-struct PlayerItem
-{
+struct PlayerItem {
std::string name; /// unique name, link to highscore
/* Future ideas
std::string displayedName; /// artist name, short name, nick (can be changed)
@@ -29,8 +29,7 @@ struct PlayerItem
The current players plugged in a song can
be retrieved with Engine::getPlayers().*/
-class Players
-{
+class Players: boost::noncopyable {
public:
typedef std::vector<PlayerItem> players_t;
private:
@@ -41,6 +40,8 @@ class Players
std::string m_filter;
AnimAcceleration math_cover;
+ bool m_dirty;
+
public:
Players(std::string filename);
~Players();
@@ -52,8 +53,15 @@ class Players
load();
}
void save();
+ void update();
void addPlayer (std::string const& name);
+ /// const array access
+ PlayerItem operator[](std::size_t pos) const { return m_filtered[pos]; }
+ /// number of songs
+ size_t size() const { return m_filtered.size(); };
+ /// true if empty
+ int empty() const { return m_filtered.empty(); };
/// advances to next player
void advance(int diff) {
int size = m_filtered.size();
@@ -62,23 +70,18 @@ class Players
if (_current < 0) _current += m_filtered.size();
math_cover.setTarget(_current,this->size());
}
- /// array access
- PlayerItem operator[](std::size_t pos) { return m_filtered[pos]; }
- PlayerItem operator[](std::size_t pos) const { return m_filtered[pos]; }
- /// number of players
- std::size_t size() const { return m_filtered.size(); };
- /// true if empty
- int empty() const { return m_filtered.empty(); };
- /// filters playerlist by regular expression
- void setFilter(std::string const& regex);
- /// sets margins for animation
- void setAnimMargins(double left, double right) { math_cover.setMargins(left, right); }
- /// @return current PlayerItem (the copy is very cheap at the moment)
- PlayerItem current() const { return m_filtered[math_cover.getTarget()]; }
/// get current id
int currentId() const { return math_cover.getTarget(); }
/// gets current position
double currentPosition() { return math_cover.getValue(); }
+ /// gets current velocity
+ double currentVelocity() const { return math_cover.getVelocity(); }
+ /// sets margins for animation
+ void setAnimMargins(double left, double right) { math_cover.setMargins(left, right); }
+ /// @return current PlayerItem (the copy is very cheap at the moment)
+ PlayerItem current() const { return m_filtered[math_cover.getTarget()]; }
+ /// filters playerlist by regular expression
+ void setFilter(std::string const& regex);
private:
void filter_internal();
};
diff --git a/game/screen_players.cc b/game/screen_players.cc
index 27166d0..5253a17 100644
--- a/game/screen_players.cc
+++ b/game/screen_players.cc
@@ -11,18 +11,9 @@ ScreenPlayers::ScreenPlayers(std::string const& name, Audio& audio, Players& pla
{
m_players.setAnimMargins(5.0, 5.0);
m_playTimer.setTarget(getInf()); // Using this as a simple timer counting seconds
-
- // print all names
- std::cout << "Constructor of ScreenPlayers" << std::endl;
- for (size_t i=0; i<m_players.size(); i++)
- {
- std::cout << "Name " << i << ": " << m_players[i].name << std::endl;
- }
}
void ScreenPlayers::enter() {
- std::cout << "Entered ScreenPlayers" << std::endl;
-
theme.reset(new ThemeSongs());
m_emptyCover.reset(new Surface(getThemePath("no_cover.svg"))); // TODO use persons head
m_search.text.clear();
@@ -41,7 +32,7 @@ void ScreenPlayers::exit() {
}
void ScreenPlayers::manageEvent(SDL_Event event) {
- // ScreenManager* sm = ScreenManager::getSingletonPtr();
+ ScreenManager* sm = ScreenManager::getSingletonPtr();
if (event.type != SDL_KEYDOWN) return;
SDL_keysym keysym = event.key.keysym;
int key = keysym.sym;
@@ -50,25 +41,34 @@ void ScreenPlayers::manageEvent(SDL_Event event) {
if (key == SDLK_r && mod & KMOD_CTRL) { m_players.reload(); m_players.setFilter(m_search.text); }
if (m_search.process(keysym)) m_players.setFilter(m_search.text);
else if (key == SDLK_ESCAPE) {
- if (m_search.text.empty())/*TODO*/; // sm->activateScreen("Intro");
+ if (m_search.text.empty()) sm->activateScreen("Sing");
else { m_search.text.clear(); m_players.setFilter(m_search.text); }
}
// The rest are only available when there are songs available
else if (m_players.empty()) return;
else if (key == SDLK_SPACE || (key == SDLK_PAUSE || (key == SDLK_p && mod & KMOD_CTRL))) m_audio.togglePause();
- else if (key == SDLK_RETURN)/*TODO*/; // sm->activateScreen("Score");
+ else if (key == SDLK_RETURN)
+ {
+ if (m_players.empty())
+ {
+ m_players.addPlayer(m_search.text);
+ m_players.setFilter(m_search.text); // set new Player as current
+ }
+ sm->activateScreen("Sing");
+ }
else if (key == SDLK_LEFT) m_players.advance(-1);
else if (key == SDLK_RIGHT) m_players.advance(1);
else if (key == SDLK_PAGEUP) m_players.advance(-10);
else if (key == SDLK_PAGEDOWN) m_players.advance(10);
- // else if (key == SDLK_TAB && !(mod & KMOD_ALT)) m_players.randomize();
}
void ScreenPlayers::draw() {
+ m_players.update(); // Poll for new players
double length = m_audio.getLength();
double time = clamp(m_audio.getPosition() - config["audio/video_delay"].f(), 0.0, length);
if (m_songbg.get()) m_songbg->draw();
if (m_video.get()) m_video->render(time);
+ theme->bg.draw();
std::string music, songbg, video;
double videoGap = 0.0;
std::ostringstream oss_song, oss_order;
@@ -77,10 +77,10 @@ void ScreenPlayers::draw() {
// Format the song information text
if (m_search.text.empty()) {
oss_song << "No players found!";
- oss_order << "Visit performous.org\n";
+ oss_order << "Check players.txt in current\n";
+ oss_order << "directory for players";
} else {
- // TODO: create new player
- oss_song << "no players match search";
+ oss_song << "press enter to create player";
oss_order << m_search.text << '\n';
}
} else {
|