Witam!
Mam taki oto problem: tworzę pewną gierkę w konsoli, ale natrafiłem na problem z wyświetlaniem kolorów w menu - mianowicie przy drugim wywołaniu menu (przy pierwszym działa bezbłędnie) następuje przesunięcie kolorów - z opcji 1 na opcję 2, z 2 na 3 itd. Nie mam pojęcia czym może to być spowodowane... Poniżej kilka fragmentów kodu potencjalnie odpowiadających za ten błąd ( jeśli potrzebne będzie coś więcej, wystarczy poprosić ;) ):
Tworzenie wskaźnika na obiekt klasy menu
Menu* menu = new Menu(0);
Tworzenie menu po raz drugi (wcześniej użyłem "delete menu")
menu = new Menu(2); menu->addMenuItem(new MenuItem("Przegrales", 0, Color::GREEN, Color::BLACK, Color::GREEN, Color::BLUE), Menu::STATIC_ELEMENT); menu->addMenuItem(new MenuItem(":(", 1, Color::GREEN, Color::BLACK, Color::GREEN, Color::YELLOW), Menu::STATIC_ELEMENT); menu->addMenuItem(new MenuItem("restart", 2, Color::GREEN, Color::WHITE, Color::RED, Color::BLACK), Menu::START_GAME); menu->addMenuItem(new MenuItem("wyjdz", 3, Color::GREEN, Color::WHITE, Color::RED, Color::BLACK), Menu::CLOSE_APPLICATION); menu->menu_start(); delete menu;
menu.cpp (klasa Menu):
#include "menu.h" #include <iostream> #include <conio.h> #include <vector> #include <windows.h> #include <stdio.h> #include "virtualkeys.h" using namespace std; Menu::Menu(int choose, int selected_color, int selected_background_color) { this->choose = choose; this->selected_color = selected_color; this->selected_background_color = selected_background_color; this->isStarted = false; this->options = 0; } Menu::~Menu() { item.clear(); option_table.clear(); options = 0; } void Menu::addMenuItem(MenuItem* option, int function_id) { item.push_back(option); option_table.push_back(function_id); options++; } bool Menu::isStatic(int function_id) { if (function_id < 0) return true; else return false; } void Menu::close_application() { exit(0); } void Menu::start_game() { if(!isStarted) isStarted = true; else return; } void Menu::function_execution(int function_id) { switch(function_id) { case 0: close_application(); break; case 1: start_game(); break; default: return; } } void Menu::menu_start() { wypisz(); loop(); } void Menu::wypisz() { system("cls"); //czysc ekran for(int i = 0; i < item.size(); i++) { if (item[i]->getNumber() == choose) item[i]->change_color(); //jesli element jest wybrany zmien jego tlo i kolor cout << item[i]->getText() << endl; //wyswietl element item[i]->reset_color(); //ustaw domyslny kolor tekstu i tla } //petla wyswietlajaca wszystkie elementy menu } void Menu::loop() { char znak; //wybrany znak bool choosen = false; //czy zostala wybrana jakas opcja while(!choosen) { wypisz(); //wypisz opcje menu znak = getch(); //pobierz znak z klawiatury if (znak == KB_ENTER) choosen = true; //jesli znak to enter to wybrano opcje else if (znak == KB_UP) //jesli znak to strzalka w gore { do { choose--; //numer wybranej opcji zmnieszony o 1 if (choose < 0) choose = options - 1; //jesli numer opcji jest mniejszy niz 0 wybrana jest ostatnia opcja } while(isStatic(option_table[choose])); } else if (znak == KB_DOWN) //jesli znak to strzalka w gore { do { choose++; //numer wybranej opcji zwiekszony o 1 if (choose > options - 1) choose = 0; //jesli numer opcji jest wiekszy niz ilosc opcji wybierz pierwsza opcje } while(isStatic(option_table[choose])); } } //powtarzaj dopuki nie jest wybrana zadna opcja function_execution(option_table[choose]); //wykonaj odpowiednia funkcje if (isStarted) return; //jesli wybrano opcje game_start rozpocznij gre / resetuj ja }
plik menu.h
#ifndef MENU_H #define MENU_H #include "menuitem.h" #include <vector> class Menu { bool isStarted; std::vector<MenuItem*> item; //lista opcji std::vector<int> option_table; //id opcji do wywolania int choose; //obecnie wybrana opcja int options; //ilosc opcji int selected_color; int selected_background_color; //kolor tekstu i tla wybranej opcji void wypisz(); //wypisywanie listy pocji void loop(); //petla menu void function_execution(int); //wybieranie ktora funkcje wybrac bool isStatic(int); //sprawdzanie czy element mozna wybrac //funckje wykonywane przez function_execution void close_application(); //zamykanie aplikacji void start_game(); //rozpoczecie / restart gry //koniec funkcji wykonywanych przez function_execution public: Menu(int=0, int=Color::WHITE, int=Color::BLACK); ~Menu(); //konstruktor i destruktor void menu_start(); //rozpoczecie petli menu void addMenuItem(MenuItem*, int); //dodawanie opcji do menu enum OPTIONS { STATIC_ELEMENT = -1, CLOSE_APPLICATION = 0, START_GAME }; }; #endif // MENU_H
Pliki menuitem.cpp oraz menuitem.h (klasa MenuItem)
#ifndef MENUITEM_H #define MENUITEM_H #include <iostream> #include "color.h" class MenuItem :public Color { std::string text; //tekst opcji w menu int number; //numer opcji public: MenuItem(std::string="Napis", int=0, int=GRAY, int=BLACK, int=GRAY, int=BLACK); ~MenuItem(); //konstruktor i destruktor void reset_color(); void change_color(); //ustawianie koloru tekstu void setNumber(int); int getNumber(); void setText(std::string); std::string getText(); //gettery i settery }; #endif // MENUITEM_H
#include "menuitem.h" #include <iostream> using namespace std; MenuItem::MenuItem (string text, int number, int draw_color, int draw_background_color, int default_color, int default_background_color) :Color(draw_color, draw_background_color, default_color, default_background_color) { this->text = text; this->number = number; } MenuItem::~MenuItem() {} void MenuItem::reset_color() { paint(getDefaultColor(), getDefaultBackgroundColor()); //ustaw kolor na domyslny } void MenuItem::change_color() { paint(getDrawColor(), getDrawBackgroundColor()); //ustaw kolor na wlasny } void MenuItem::setNumber(int number) { this->number = number; } int MenuItem::getNumber() { return number; } void MenuItem::setText(string text) { this->text = text; } string MenuItem::getText() { return text; }
Z góry dziękuję za odpowiedź