Как реализовать список исследований?
В игре уже есть система исследований. Проблема в том, что не могу ни в vector, ни в list затолкать класс "ResearchProject", чтобы можно было позже его "достать" и редактировать.
//Это ResearchProject.cpp
#include <SFML/Graphics.hpp>
#include "Objects.h";
#include "Learn.h"
using namespace sf;
using namespace std;
extern vector<String> bools;
extern ResearchProject Res;
void ResearchProject::load(string Codename, string Name, string Lore, string Mainlore, string texturest, int Rx, int Ry, int Need) {
button.enable(Color(255,255,255,200),"learn/"+texturest,"");
rx = Rx;
ry = Ry;
button.ok.setPosition(641+71*rx+1,151+71*ry+1);
name = Name;
lore = Lore;
mainlore = Mainlore;
codename = Codename;
shape.setPosition(639.5 + 71 * rx, 149.5 + 71 * ry);
shape.setRadius(37);
need = Need;
}
void ResearchProject::draw(RenderWindow& w) {
if (Res.codename==codename) {
shape.setFillColor(Color(0, 255, 0, 255));
w.draw(shape);
}
else if (find(bools.begin(), bools.end(), codename) != bools.end()) {
shape.setFillColor(Color(255,200,0,255));
w.draw(shape);
}
button.draw(w);
}
int ResearchProject::event(Event& e, Vector2i& mp) {
if (find(bools.begin(), bools.end(), codename) != bools.end()) {
return 0;
}
int ret=button.event(e,mp);
return ret;
}
Всегда при прокрутке циклом или при получении через .back создаётся новый объект, идентичный исходному (Да, совсем не понимаю указатели). Нужное исследование пытался получать через метод:
ResearchProject findRP(String codename) {
for (ResearchProject proj : projects) {
if (proj.codename == codename) {
cout << "founded " + proj.codename << endl;
cout << &proj << endl;
return proj;
}
}
}
Ещё стоит добавить, что при добавлении ResearchProject в список или vector, пропадает текстура и выдаётся ошибка:
an internal OpenGL call failed in Texture.cpp(98).
Expression:
glFlush()
Error description:
GL_INVALID_OPERATION
The specified operation is not allowed in the current state.
Вот метод, который создаёт его, даёт текстуру и добавляет в список:
void Learn::load() {
//...
ResearchProject TMdef;
TMdef.load("TMdef", "Тайм-менеджмент", "Основы управления временем. Без понимания\nэтих основ невозможно достойно управлять временем.", "Открывает исследования тайм-менеджмента.", "Ltime", 1, 0, 65);//"Ltime" - название файла текстуры, путь и формат позже дописывается в методе, всё работает вне списков.
projects.push_back(TMdef);
cout << &TMdef << endl;
cout << &findRP("TMdef") << endl;
cout << &projects.back << endl;
}
Ответы (1 шт):
В общем, решил проблему, изучив указатели. По простому, в vector-е, где хранились исследования, нужно было добавить "*" vector<ResearchProject*> Res, а позже все вызовы этого проекта использовать с rp->draw(w) вместо rp.draw(w).