ARRka  1.05
courses.cpp
Idź do dokumentacji tego pliku.
1 
8 #include "inc/courses.h"
9 #include <QGraphicsScene>
10 #include <QDebug>
11 #include <QtAlgorithms>
12 #include <QTextStream>
13 #include <QSound>
14 
15 Courses::Courses(GameSettings *gSettings, QObject *parent) : QObject(parent)
16 {
17  _actualTermIndex = 1; //inicjalizacja aktualnego semestru
18  _failedToReadData = false;
19  player = new QMediaPlayer(this,QMediaPlayer::LowLatency);
20  player->setVolume(40);
21  //wczytanie kursów z dysku
22  if (!readCoursesFormDisc(gSettings)) {
23  qDebug() << "Failed";
24  _failedToReadData=true;
25  }
26 }
27 
29 {
30  qDeleteAll(_courseListToMove);
31  while (!_allTerms.empty()) {
32  if (_allTerms.front()->empty()) { //jeśli lista na pierwszym miejscu jest pusta
33  _allTerms.erase(_allTerms.begin());
34  }
35  else {
36  _allTerms.front()->erase(_allTerms.front()->begin()); //usuń pierwszy element pierwszej listy
37  }
38  }
39  qDeleteAll(_courseListToRepeat);
40 }
41 
43 {
44  Course * course; //przechowuje tymczasowo wczytywany kurs
45  QFile fileWithCourses; //uchwyt do pliku
46  int numberOfTerms = 7; //liczba semestrów do wczytania
47  QString fileName; //nazwa pliku do otwarcia
48 
49  int numberOfECTS = 0; //tymczasowa liczba ECTS przy czytaniu
50  QString courseName; //tymczasowa nazwa kursu przy czytaniu
51 
52  for (int j = 1; j <= numberOfTerms; ++j) {
53  fileWithCourses.setFileName(QString(":/terms/SEM_%1.txt").arg(j));
54  if (!fileWithCourses.open(QIODevice::ReadOnly | QIODevice::Text)) //jeśli nie wczytano pliku
55  return false;
56 
57  _allTerms.push_back(new QList<Course *>); //dodaj kolejny semestr
58  QTextStream in(&fileWithCourses);
59  in >> courseName >> numberOfECTS;
60  while (!in.atEnd()) {
61  course = new Course(gSettings,numberOfECTS,courseName,j,this);
62  _allTerms.at(j-1)->push_back(course);
63  connect(course,SIGNAL(failedCourse(Course*)),this,SLOT(on_Course_failedCourse(Course*)));
64  connect(course,SIGNAL(passedCourse(Course*)),this,SLOT(on_Course_passedCourse(Course*)));
65  in >> courseName >> numberOfECTS;
66  }
67  fileWithCourses.close();
68  }
69  return true;
70 }
71 
72 //Brzydko napisana
73 //Wypadałoby poprawić, ale brak czasu
75 {
76  if (_failedToReadData) { //jeśli nie załadowano poprawnie wszystkich plików z semestrami
77  emit failedToReadData();
78  return;
79  }
80  if (!_allTerms.empty() || !_courseListToRepeat.empty()) { //jeśli istnieją jeszcze kursy
82  if (_allTerms.front()->empty()) { //usuwanie zaliczonego semestru z listy
83  if (_courseListToMove.empty()) { //jeśli wszystkie kursy już przeleciały poza widok
84  if (_actualTermIndex < 7) {
86  _allTerms.pop_front(); //usuń zrealizowany semestr z listy
87  while (!_courseListToRepeat.empty()) { //jesli są kursy do poprawy, to dodaj je do następnego semestru
88  _allTerms.front()->push_front(_courseListToRepeat.front());
89  _courseListToRepeat.pop_front();
90  }
91  emit checkDeficitOverstep();
92  }
93  else { //jeśli aktualnie operujesz na semestrze 7
94  while (!_courseListToRepeat.empty()) { //jesli są kursy do poprawy, to dodaj je do następnego semestru
95  _allTerms.front()->push_front(_courseListToRepeat.front());
96  _courseListToRepeat.pop_front();
97  }
98  if (_allTerms.front()->empty()) //usuń zrealizowany semestr z listy
99  _allTerms.pop_front();
100  emit checkDeficitOverstep();
101  }
102  }
103  }
104  else { //jeśli jeszcze są kursy do zrealizowania w danym semestrze
105  Course * tmp = _allTerms.front()->front();
106 
107  scene()->addItem(tmp);
108  _courseListToMove.push_back(tmp);
109  _allTerms.front()->pop_front();
110  }
111  }
112  else { //jeśli nie ma już żadnych kursów na żadnej liście
113  emit gameFinished();
114  }
115 }
116 
117 
119 {
120  for (int i = 0; i < _courseListToMove.size(); ++i) {
121  _courseListToMove.at(i)->move();
122  }
123 }
124 
126 {
127  if (!(pCourse->isOnceMorePursued())) { //jeśli dany kurs nie jest poprawiany
128  emit increaseDeficit(pCourse->getNumberOfECTS());
129  pCourse->setToRepeat();
130  }
131  player->setMedia(QUrl::fromLocalFile("/home/grzesiu/Studia/SEM_6/WDS - Kreczmer/arrka/game/arrka/prj/res/sounds/bad.wav"));
132  player->play();
133  scene()->removeItem(pCourse);
134  pCourse->setRandomPos();
135  _courseListToRepeat.push_front(pCourse);
136  _courseListToMove.removeOne(pCourse);
137 }
138 
140 {
141  emit increaseECTS(pCourse->getNumberOfECTS());
142  scene()->removeItem(pCourse);
143  if (pCourse->isOnceMorePursued()) //jeśli kurs jest poprawiany
144  emit decreaseDeficit(pCourse->getNumberOfECTS());
145  _courseListToMove.removeOne(pCourse);
146  delete pCourse;
147 }
148 
QList< QList< Course * > * > _allTerms
Lista semestrów z wszystkimi nierealizowanymi do tej pory kursami.
Definition: courses.h:188
void on_Course_failedCourse(Course *pCourse)
Obsługa niezaliczonego przedmiotu.
Definition: courses.cpp:125
QList< Course * > _courseListToMove
Lista aktualnie wyświetlanych na ekranie kursów.
Definition: courses.h:175
QList< Course * > _courseListToRepeat
Lista kursów do poprawy.
Definition: courses.h:181
void checkDeficitOverstep()
Sprawdzenie przekroczenia deficytu.
void increaseDeficit(int ECTS)
Zwiększenie deficytu.
bool _failedToReadData
Flaga błędu odczytu danych kursów z zasobów.
Definition: courses.h:167
Modeluje pojęcie Course.
Definition: course.h:25
void moveCourses()
Przesuwa kursy widoczne na scenie w dół okna.
Definition: courses.cpp:118
void on_Course_passedCourse(Course *pCourse)
Obsługa zaliczonego przedmiotu.
Definition: courses.cpp:139
int _actualTermIndex
Indeks aktualnego semestru.
Definition: courses.h:161
QMediaPlayer * player
Odtwarzacz muzyki.
Definition: courses.h:194
void failedToReadData()
Błąd wczytywania danych z plików zasobów.
void setToRepeat()
Ustawia dany kurs jako do poprawy.
Definition: course.h:69
void increaseECTS(int ECTS)
Zwiększenie liczby punktów ECTS.
Courses(GameSettings *gSettings, QObject *parent=nullptr)
Konstruktor klasy Courses.
Definition: courses.cpp:15
bool isOnceMorePursued() const
Ponowna realizacja kursu.
Definition: course.h:65
int getNumberOfECTS() const
Zwraca liczbę ECTSów kursu.
Definition: course.h:49
void changeTerm(int term)
Zmiana semestru.
void spawnCourse()
Dodaje kurs na ekran.
Definition: courses.cpp:74
void decreaseDeficit(int ECTS)
Zmniejszenie deficytu.
Definuje ustawienia gryModeluje pojęcie ustawień gry, jako struktura odpowiednich pól...
Definition: gamesettings.h:17
void gameFinished()
Zakończenie gry.
Definicja klasy Courses.
bool readCoursesFormDisc(GameSettings *gSettings)
Wczytanie wszystkich kursów z plików.
Definition: courses.cpp:42
~Courses()
Destruktor klasy Courses.
Definition: courses.cpp:28
void setRandomPos()
Ustala losową pozycję kursu.
Definition: course.cpp:50