Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SFML создание класса игра 
V
    Опции темы
lenarano
Дата 28.10.2015, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 17.4.2014

Репутация: нет
Всего: нет



Делаю игру... Хочу перенести часть кода из main. Создала класс меню и 2 конструктора в нем
Код

#ifndef MENU_H
#define MENU_H


#include <SFML/Graphics.hpp>

class Menu{
public:

sf::String File;
sf::Texture texture;
sf::Sprite sprite;

Menu(sf::String F){
 File = F;//имя файла+расширение
 texture.loadFromFile("images/" + File);
 sprite.setTexture(texture);//заливаем спрайт текстурой
 
 }

Menu(sf::String F,int x,int y){
 File = F;//имя файла+расширение
 texture.loadFromFile("images/" + File);
 sprite.setTexture(texture);//заливаем спрайт текстурой
 sprite.setPosition(x,y);

 }

};
#endif MENU_H



За счет этого уже сократился код, но все еще осталось много. Нужно добавить функции, но не представляю как это реализовать. Вот мой код в main.
Код

////////////////////Меню/////////////////////
    Menu mainmenu("mainmenu.jpg");
    Menu saver("saver.jpeg");
    Menu manual("manual.png");
    Menu new_game("new_game.png",100,30);
    Menu about_the_program("about_the_program.png",100,90);
    Menu output("output.png",100,150);
    Menu tips("tips.png",300,30);
    bool Menu=1;
    int MenuNum=0;
    
    sf::Music menu;//создаем объект музыки
    menu.openFromFile("sounds/music_menu.ogg");//загружаем файл
    menu.play();

    while(Menu)
    {      
        new_game.sprite.setColor(sf::Color::Green);
        about_the_program.sprite.setColor(sf::Color::Green);
        output.sprite.setColor(sf::Color::Green);
        tips.sprite.setColor(sf::Color::Green);
        window.draw(mainmenu.sprite);
        if (sf::IntRect(100,30,200,50).contains(sf::Mouse::getPosition(window))) {new_game.sprite.setColor(sf::Color::Yellow); MenuNum=1;}
        if (sf::IntRect(100,90,300,50).contains(sf::Mouse::getPosition(window))) {about_the_program.sprite.setColor(sf::Color::Yellow); MenuNum=2;}
        if (sf::IntRect(100,150,300,50).contains(sf::Mouse::getPosition(window))) {output.sprite.setColor(sf::Color::Yellow); MenuNum=3;}
        if (sf::IntRect(300,30,130,50).contains(sf::Mouse::getPosition(window))) {tips.sprite.setColor(sf::Color::Yellow); MenuNum=4;}

        if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
        {
            if (MenuNum==1) Menu=false;
            if (MenuNum==2) {window.draw(saver.sprite); window.display(); while(!sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) ;}
            if (MenuNum==3)  {window.close();Menu=false;return 0;}
            if (MenuNum==4) {window.draw(manual.sprite); window.display(); while(!sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) ;}
        }


        window.draw(new_game.sprite);
        window.draw(about_the_program.sprite);
        window.draw(output.sprite);
        window.draw(tips.sprite);   

        window.display();
    }
    ////////////////


Добавлено через 2 минуты
Можно ли здесь что-то выкинуть и добавить в класс?

PM MAIL   Вверх
math64
Дата 28.10.2015, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Самое главное в меню не иконка, а действие которое выполняется при нажатии на него.
Если у тебя компилятор последней версии, почитай про лямбда-выражения.
Если твой компилятор не понимает лямбда-выражения, придётся пользоваться обычными указателями на функцию. Также нужен контейнер в котором будут собитраться меню (MenuBar) и базоый класс для Menu, MenuBar и прочего, выводимого на экран:
Код

class Menu;
typedef void (*OnMenuClick)(Menu*);
class Widget {
virtual ~Widget();
virtual draw() = 0;
virtual bool contains(int x, int y) = 0;
virtual void mousePressed(int x, int y, int button) = 0;
...
}
class Menu : public Widget {
public:
Menu(sf::String F, OnMenuClick p_onMenuClick);
Menu(sf::String F,int x,int y, OnMenuClick p_onMenuClick);
virtual void draw();
virtual bool  contains(int x, int y);
virtual void mousePressed(int x, int y, int button);
...
private:
sf::String File;
sf::Texture texture;
sf::Sprite sprite;
OnMenuClick m_onMenuClick;
};

class MenuBar : public Widget {
public:
MenuBar();
void addMenu(Menu*);
virtual void draw();
virtual bool  contains(int x, int y);
virtual void mousePressed(int x, int y, int button);
...
private:
Menu** m_menus;
int m_menuCount;
};


Добавлено через 4 минуты и 27 секунд
PS: вероятно, в твоей библиотеке уже есть базовый класс для графики, который я назвал Widget.
PM   Вверх
math64
Дата 28.10.2015, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



В обработчиках нажатий меню не должно быть вечных циклов, как этот:
Код

while(!sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) ;

Желательно добавить класс Application:
Код

class Application {
public:
   Application() { m_app = this; m_terminate = false; }
   ~Application();
   static Application* getApp() { return m_app; }
   void terminate() { m_termiante = true; }
   void addWidget(Widget*);
   void setKeyBoardFocus(Widget*);
   void exec() {
      while(!terminate) {
         // Если нажата кнопка мыши, найти виджет и вызвать widget->mousePressed(x,y,button);
         // Если нажата клавиша клавиатуры вызвать m_keyboardFocus->keyPressed(key);
      }
   }
private:
std::list<Widget*> m_widgets;
Widget* m_keyboardFocus;
static Application* m_app;
bool m_terminate;
}

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0825 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.