Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - MoonBreaker

Pages: [1]
1
Général / Re : Vue et position de la souris
« le: Mai 24, 2015, 11:49:55 am »
Oui mais ca c'est la position de la souris dans la fenêtre, moi je veux dans ma vue.

2
Général / Vue et position de la souris
« le: Mai 23, 2015, 08:40:35 pm »
EDIT explications plus claires:

Bonjour,

j'aimerai faire un systeme de combo pour mon GUI. Une combo c'est une liste avec des éléments à l'intérieur, si il y'a plus d'éléments que de place pour les afficher, on a un scrolling verticale.
Je veux positionner ma combo à un endroit précis sur ma fenêtre (X, Y) et cette combo fait une taille précise en largeur et en hauteur (W x H).
Pour faire le scrolling je voudrai utiliser une vue car c'est ce qui me semble le plus adapté.

Dans mon code je trace un rectangle pour faire des bordures.
Pour dessiner mes éléments de ma combo, j'utilise une texture de rendu. Celle ci mesurant la largeur d'un item et la hauteur de 10 (pour pouvoir les empiler).
Je dessine ensuite mes éléments dessus.
Pour ma vue, je la dimensionne comme mon rectangle (W x H) et je la place en (W / 2, H / 2) puis je la set sur ma texture de rendu.

L'affiche est bien MAIS maintenant je veux détecter la collision avec mes éléments, pour que je sache sur lequel j'ai cliqué avec la souris.
Mais je n'arrive pas a transformer les coordonnées de la souris dans la fenêtre en coordonnées de la souris dans ma vue.

J'ai essayé d'utiliser mapPixelToCoords et meme de mettre un viewport à ma vue mais rien ne marche !

Quelq'un peut m'aider ?
Merci


=========

Bonjour,

j'ai un petit souci pour connaître la position de ma souris par rapport à ma vue.
Dans mon jeu j'utilise une vue pour faire un défilement (une combo avec la liste de mes parties dedans). Cette vue mesure 400 par 500 (donc plus petit que ma fenêtre) et est positionnée dans la fenêtre en 550,30.

Au lancement du programme j'affiche quelques informations :
view size : x=400, y=500 // Taille de la vue
view position : (200,250) // Position du centre de la vue, 200,250 normale ?
box position : (550,30) // position de la "box" dans laquelle la vue est.

J'ai regardé le tuto pour convertir les coordonnées de la souris sur la fenêtre en coordonnées sur la vue mais ça ne me donne pas ce que je veux ....
J'ai utilisé ce code :
sf::Vector2i posFen = sf::Mouse::getPosition(win);
  sf::Vector2f pos = win.mapPixelToCoords(posFen, _itemsContainer.getView());
où _itemsContainer est une sf::RenderTexture.

Est ce que je dois gérer "à la main" la position de la souris ? Sachant que j'ai un scroll sur ma vue ça va pas être évident !
Ou alors est ce que j'utilise juste mal la fonction ?

Merci !

3
Graphique / Re : Combo
« 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 !

4
Graphique / [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 !!

5
Général / Re : Gestion des événements
« le: Mai 21, 2015, 07:16:34 pm »
Oh merci G. !!! Je suis vraiment bête de ne pas y avoir pensé !!

6
Général / [Résolu] Gestion des événements
« le: Mai 21, 2015, 05:32:28 pm »
Bonjour tout le monde,

je suis en train de coder un jeu avec la SFML et j'ai quelques problèmes au niveau de la gestion des événements.

Je suis sur le menu de mon jeu, j'ai donc quelques boutons et en cliquant sur ces boutons je vais sur d'autres "écrans".
Chaque écran a sa propre gestion du clavier et de la souris (par exemple la touche 'A' sur l'écran 1 ne fait pas forcément la même action sur l'écran 2) et mon souci est que je n'arrive pas à "cloisonner" les événements.

Je m'explique :
je suis sur le menu avec la touche "Echap" pour quitter, je clique sur le bouton paramètres, la touche echap sert aussi à quitter cet écran (et donc revenir sur le menu principal). Pour résumer :

menu principal => pramètres

Ici je clique sur echap, je quitte paramètres (ça c'est bon) mais je quitte aussi le menu principal (et donc le jeu) ! Car si je comprends bien ma sf::RenderWindow à une liste d'event et elle n'est pas "flush" donc quand je sort de paramètres, la touche active est encore echap et à l'appel de ma gestion du clavier du menu principal ben je rentre dans la condition de la touche echap.

Si vous avez des conseil pour m'aider à bien gérer les événements et comment flush la pile d'événements.

J'espere avoir été clair !

Merci !!

EDIT :
Si vous voulez j'ai un dépot git du projet  (https://github.com/MoonBreaker/Ninjario)
Vous pouvez voir la gestion des bouton, actions dans src/Menu.cpp et src/MenuParametres.cpp dans les fonctions keyboardEvent

Je suis novice dans la création de jeu, je fais celui la pour m'entrainer justement donc c'est peut etre pas super bien structuré !

Pages: [1]