Make everything work as before redesign
This commit is contained in:
		
							parent
							
								
									ed300edcf6
								
							
						
					
					
						commit
						7dc4ef2bb8
					
				| @ -65,5 +65,7 @@ void Application::update() | ||||
| 
 | ||||
| void Application::draw() | ||||
| { | ||||
|     _game_window.clear(); | ||||
|     _game->draw(_game_window); | ||||
|     _game_window.display(); | ||||
| } | ||||
|  | ||||
| @ -8,6 +8,9 @@ ClassicGame::ClassicGame() : | ||||
|     _timeline(std::make_unique<ClassicTimeline>()), | ||||
|     _view_manager(std::make_unique<ClassicViewManager>()) | ||||
| { | ||||
|     _timeline->fetchVisibleNotes(_view_manager); | ||||
|     _timeline->init(); | ||||
| 
 | ||||
|     _keys_to_buttons = | ||||
|     { | ||||
|         {sf::Keyboard::Up, Button::UP},      // Load from settings
 | ||||
|  | ||||
| @ -1,6 +1,7 @@ | ||||
| #include "classicnote.h" | ||||
| #include "classicsprite.h" | ||||
| #include <SFML/Graphics/RenderTarget.hpp> | ||||
| #include <iostream> | ||||
| 
 | ||||
| ClassicNote::ClassicNote(const std::vector<microsec>& intervals, microsec perfect_offset, | ||||
|                          Action action, const Coordinates& coord) : | ||||
| @ -22,12 +23,16 @@ void ClassicNote::draw(sf::RenderTarget& target, sf::RenderStates states) const | ||||
| 
 | ||||
| ClassicNote::GRADE ClassicNote::input(ClassicInputType&& input_data) | ||||
| { | ||||
|     auto grade = ClassicNote::GRADE::BAD; | ||||
| 
 | ||||
|     if (input_data == _action) | ||||
|     { | ||||
|         return _evaluator.calculatePrecision(input_data.timestamp()); | ||||
|         grade = _evaluator.calculatePrecision(input_data.timestamp()); | ||||
|     } | ||||
| 
 | ||||
|     return ClassicNote::GRADE::BAD; | ||||
|     std::cout << "User input: " << static_cast<int>(grade) << "\n"; | ||||
| 
 | ||||
|     return grade; | ||||
| } | ||||
| 
 | ||||
| Action ClassicNote::action() const | ||||
| @ -43,7 +48,8 @@ std::shared_ptr<ClassicSprite> ClassicNote::sprite() const noexcept | ||||
| void ClassicNote::setSprite(const std::shared_ptr<ClassicSprite>& sprite) noexcept | ||||
| { | ||||
|     _sprite = sprite; | ||||
|     _sprite->setCoordinates(_coordinates.x, _coordinates.y); | ||||
|     if (_sprite) | ||||
|         _sprite->setCoordinates(_coordinates.x, _coordinates.y); | ||||
| } | ||||
| 
 | ||||
| inline const Coordinates& ClassicNote::getCoordinates() const noexcept | ||||
|  | ||||
| @ -14,7 +14,6 @@ ClassicTimeline::ClassicTimeline() | ||||
|     std::string song_filename = "/home/naiji/METEOR.flac"; | ||||
| 
 | ||||
|     _music.openFromFile(song_filename); | ||||
|     _music.play(); | ||||
|     _music.setVolume(10); | ||||
| 
 | ||||
|     _timeline.reserve(1000); | ||||
| @ -25,7 +24,7 @@ ClassicTimeline::ClassicTimeline() | ||||
|     microsec note_input_offset = 412162; | ||||
|     microsec bpm_iterator = starting_beat_offset; | ||||
|     microsec bpm_end = starting_beat_offset + (interval * amount_of_beats); | ||||
|     _visibility_offset = note_input_offset * 12; | ||||
|     _visibility_offset = note_input_offset * 6; | ||||
| 
 | ||||
|     _timeline.emplace_back(new ClassicNote({note_input_offset}, bpm_iterator, Action::PRESS_DOWN, {90, 90})); | ||||
|     bpm_iterator += interval; | ||||
| @ -42,14 +41,14 @@ ClassicTimeline::ClassicTimeline() | ||||
|         bpm_iterator += interval; | ||||
|     } | ||||
| 
 | ||||
|     expire(_last_visible_note); | ||||
|     expire(_active_note); | ||||
|     _top_note = _timeline.begin(); | ||||
|     _last_visible_note = _top_note; | ||||
| } | ||||
| 
 | ||||
| void ClassicTimeline::init() | ||||
| { | ||||
| 
 | ||||
|     _music.play(); | ||||
| } | ||||
| 
 | ||||
| ClassicTimeline::~ClassicTimeline() | ||||
| @ -70,8 +69,7 @@ void ClassicTimeline::clear() | ||||
| 
 | ||||
| void ClassicTimeline::update() | ||||
| { | ||||
|     const auto& offset = currentMusicOffset(); | ||||
|     std::cout << "Upadting at: " << offset << '\n'; | ||||
|     const microsec& offset = currentMusicOffset(); | ||||
|     checkCurrentActiveNote(offset); | ||||
|     checkForNextActiveNote(offset); | ||||
| } | ||||
| @ -100,7 +98,7 @@ ClassicTimeline::Iterator ClassicTimeline::getActiveNote() noexcept | ||||
|     return _active_note; | ||||
| } | ||||
| 
 | ||||
| bool ClassicTimeline::isExpired(const Iterator &iterator) | ||||
| bool ClassicTimeline::isExpired(const Iterator &iterator) const | ||||
| { | ||||
|     return iterator == _timeline.end(); | ||||
| } | ||||
| @ -115,15 +113,40 @@ microsec ClassicTimeline::currentMusicOffset() const | ||||
|     return _music.getPlayingOffset().asMicroseconds(); | ||||
| } | ||||
| 
 | ||||
| void ClassicTimeline::discardExpiredNotes(const std::unique_ptr<ClassicViewManager> &view_manager, const microsec &music_offset) | ||||
| { | ||||
|     if (_top_note == _timeline.begin()) | ||||
|         return; | ||||
| 
 | ||||
|     Iterator past_note = _top_note - 1; | ||||
|     std::shared_ptr<ClassicSprite> sprite = (*past_note)->sprite(); | ||||
|     while (sprite) | ||||
|     {                                               // CAREFULLY REWRITE
 | ||||
|         view_manager->resetNoteSprite(*past_note); | ||||
|         if (past_note == _timeline.begin()) | ||||
|             return; | ||||
|         --past_note; | ||||
|         sprite = (*past_note)->sprite(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| bool ClassicTimeline::isVisiblyClose(const Iterator &iterator, const microsec &music_offset) const | ||||
| { | ||||
|     return ((*iterator)->offset() - _visibility_offset) <= music_offset; | ||||
| } | ||||
| 
 | ||||
| void ClassicTimeline::fetchVisibleNotes(const std::unique_ptr<ClassicViewManager>& view_manager) | ||||
| { | ||||
|     Iterator note_iterator = _top_note; | ||||
|     auto music_offset = currentMusicOffset(); | ||||
|     microsec music_offset = currentMusicOffset(); | ||||
|     discardExpiredNotes(view_manager, music_offset); | ||||
| 
 | ||||
|     while (((*note_iterator)->offset() - _visibility_offset) <= music_offset) | ||||
|     Iterator note_iterator = _top_note; | ||||
|     while (isVisiblyClose(note_iterator, music_offset)) | ||||
|     { | ||||
|         if (note_iterator > _last_visible_note) | ||||
|             view_manager->initNoteSprite(*note_iterator); | ||||
|         ClassicNote* note = *note_iterator; | ||||
|         if (!note->sprite()) | ||||
|             view_manager->initNoteSprite(note); | ||||
| 
 | ||||
|         ++note_iterator; | ||||
|     } | ||||
| 
 | ||||
| @ -132,7 +155,9 @@ void ClassicTimeline::fetchVisibleNotes(const std::unique_ptr<ClassicViewManager | ||||
| 
 | ||||
| void ClassicTimeline::drawVisibleNotes(sf::RenderWindow &window) const | ||||
| { | ||||
|     if (_last_visible_note == _timeline.end() || _top_note > _last_visible_note) | ||||
|     bool no_visible_notes = isExpired(_last_visible_note) | ||||
|                          || _top_note > _last_visible_note; | ||||
|     if (no_visible_notes) | ||||
|         return; | ||||
| 
 | ||||
|     Iterator note_to_draw = _top_note; | ||||
|  | ||||
| @ -26,7 +26,7 @@ public: | ||||
| 
 | ||||
|     Iterator getActiveNote() noexcept; | ||||
| 
 | ||||
|     bool isExpired(const Iterator& iterator); | ||||
|     bool isExpired(const Iterator& iterator) const; | ||||
|     void expire(Iterator& iterator); | ||||
| 
 | ||||
| private: | ||||
| @ -41,6 +41,8 @@ private: | ||||
| 
 | ||||
|     void checkCurrentActiveNote(const microsec &music_offset); | ||||
|     void checkForNextActiveNote(const microsec &music_offset); | ||||
|     void discardExpiredNotes(const std::unique_ptr<ClassicViewManager>& view_manager, const microsec &music_offset); | ||||
|     bool isVisiblyClose(const Iterator& iterator, const microsec& music_offset) const; | ||||
| 
 | ||||
|     /* Difference between top and active note is that
 | ||||
|      * top note is the note handling input right now | ||||
|  | ||||
| @ -2,6 +2,7 @@ | ||||
| #include "classicsprite.h" | ||||
| #include "classicnote.h" | ||||
| #include <SFML/Graphics/RectangleShape.hpp> | ||||
| #include <iostream> | ||||
| 
 | ||||
| static constexpr std::size_t RESERVED_SIZE = 20; | ||||
| 
 | ||||
| @ -62,10 +63,12 @@ void ClassicViewManager::initNoteSprite(ClassicNote* note) | ||||
| 
 | ||||
|     note->setSprite(poll.top()); | ||||
|     poll.pop(); | ||||
|     std::cout << "Taking a sprite from poll.\n"; | ||||
| } | ||||
| 
 | ||||
| void ClassicViewManager::resetNoteSprite(ClassicNote* note) | ||||
| { | ||||
|     _sprite_dispatcher[note->action()].push(note->sprite()); | ||||
|     note->setSprite(nullptr); | ||||
|     std::cout << "Returning a sprite to poll.\n"; | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user