Quantcast
Channel: Forum Pasja Informatyki - Najnowsze pytania
Viewing all articles
Browse latest Browse all 65225

problem z kolorami menu głównego (c++)

$
0
0

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ź


Viewing all articles
Browse latest Browse all 65225

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>