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/NinjarioMerci beaucoup !!