Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [Résolu] Combo  (Lu 1252 fois)

0 Membres et 1 Invité sur ce sujet

MoonBreaker

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
[Résolu] Combo
« le: Mai 22, 2015, 06:15:17 pm »
Bonjour,

J'essaye de coder une sorte de liste combo (pour mon menu) dans laquelle j'insère des cases correspondant à mes parties de jeu.
Pour faire ça j'ai eu l'idée d'utiliser une vue qui défile avec la molette de souris mais j'ai quelques difficultés pour que ça corresponde vraiment à ce que je veux.

Pour se situer :
- j'ai une sf::RenderWindow win dans laquelle je dessine mon menu avec les boutons.
- quand je clique sur le bouton "jouer", j'ai un nouvel écran qui apparait dans lequel je dessine mon arrière plan et ma combo.
- dans ma combo j'ai un RectangleShape que je dessine dans ma fenêtre de rendu.
   * dans ce rectangle je met une vue.
   * j'assigne cette vue à un sf::RenderTexture
   * cette texture est dessiné dans ma fenêtre.

Dans mon esprit ça donne ça :

Où mon sf::RenderTexture est entouré de mon RectangleShape (avec la outile) et géré par ma vue.

Pour détailler un peu plus ce que je dessine dans ma RenderTexture :
Je dessine des cadres pour chaque partie, donc j'ai pas la place de tout afficher, c'est pour ça que je veux scroll. Je les dessine les uns en dessous des autres et je veux que quand je scroll, ils montent et ceux de dessous s'affiche et vis versa quand je descend.

Mon problème :
J'ai réussis à mettre en place la vue avec la RenderTexture ainsi que le scrolling. Mais quand je scroll ma texture descend et laisse du noir apparaitre. J'ai donc resize ma texture. J'ai mis en hauteur 10fois la taille de la vue.
Problème ca "zoom" .... ! Et ca affiche pas le dessous de la texture mais ça la fait juste glisser  :( !

Voici le code :

Combo.hpp
#ifndef                         __COMBO_HPP__
# define                        __COMBO_HPP__

# include                       <vector>

# include                       "Widget.hpp"
# include                       "ComboItem.hpp"

class                           Combo : public Widget
{
private:
  sf::View                      _view;

  sf::RectangleShape            _inBox;
  sf::RectangleShape            _box;
  sf::RenderTexture             _itemsContainer;

  std::vector<ComboItem *>      _items;

public:
  Combo(int win_width, int win_height);
  Combo(int width, int height, int posX, int posY);

  virtual void                  draw(sf::RenderWindow &win);
  virtual bool                  collide(sf::Vector2i pos);

  void                          addItem(ComboItem *item);

  void                          up();
  void                          down();
};

#endif


Combo.cpp
#include <iterator>
#include "CharteGraphique.hpp"
#include "Combo.hpp"

Combo::Combo(int win_width, int win_height)
{
  _box.setSize(sf::Vector2f(COMBO_WIDTH, COMBO_HEIGHT));
  _box.setPosition(win_width - MARGIN_RIGHT - COMBO_WIDTH,
   COMBO_MARGIN_TOP);
  _box.setFillColor(sf::Color::Transparent);
  _box.setOutlineThickness(COMBO_BORDER);
  _box.setOutlineColor(sf::Color(COMBO_BORDER_RED, COMBO_BORDER_GREEN,
COMBO_BORDER_BLUE));

  _inBox.setSize(sf::Vector2f(COMBO_WIDTH, COMBO_HEIGHT));
  _inBox.setPosition(0, 0);
  _inBox.setFillColor(sf::Color(BG_RED, BG_GREEN, BG_BLUE));

  _view.setSize(sf::Vector2f(COMBO_WIDTH, COMBO_HEIGHT));
  _view.setCenter(sf::Vector2f(COMBO_WIDTH / 2, COMBO_HEIGHT / 2));
  _itemsContainer.create(COMBO_WIDTH, COMBO_HEIGHT * 10);
  _itemsContainer.setView(_view);
}

Combo::Combo(int height, int widht, int posX, int posY)
{
}

void Combo::draw(sf::RenderWindow &win)
{
  win.draw(_box);

  _itemsContainer.clear();
  _itemsContainer.draw(_inBox);
  for (std::vector<ComboItem *>::iterator it = _items.begin();
       it != _items.end(); ++it)
    (*it)->draw(_itemsContainer);
  _itemsContainer.display();

  sf::Sprite sp(_itemsContainer.getTexture());
  sp.setPosition(_box.getPosition().x, _box.getPosition().y);
  win.draw(sp);
}

bool Combo::collide(sf::Vector2i pos)
{
}

void Combo::addItem(ComboItem *item)
{
  item->setPosition(COMBO_MARGIN_RIGHT + COMBO_BORDER,
    _items.size() * (COMBO_ITEM_HEIGHT + COMBO_BTW_ITEM) +
    COMBO_BTW_ITEM);
  _items.push_back(item);
}

void Combo::up()
{
  _view.move(0, -COMBO_SPEED);
  _itemsContainer.setView(_view);
}

void Combo::down()
{
  _view.move(0, COMBO_SPEED);
  _itemsContainer.setView(_view);
}

Et mon github pour plus de détail : https://github.com/MoonBreaker/Ninjario
Merci beaucoup !!
« Modifié: Mai 22, 2015, 07:50:21 pm par MoonBreaker »

MoonBreaker

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Re : Combo
« Réponse #1 le: Mai 22, 2015, 07:50:06 pm »
Je suis nul, j'ai changé :
_inBox.setSize(sf::Vector2f(COMBO_WIDTH, COMBO_HEIGHT));par :
_inBox.setSize(sf::Vector2f(COMBO_WIDTH, COMBO_HEIGHT * 10));
Je voyais plus ce que j'avais écrit et donc mon erreur !