Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

C++ i SFML - problem z obsługą zdarzeń

Ostatnio zmodyfikowano 2015-05-24 23:20
Autor Wiadomość
majkkel
Temat założony przez niniejszego użytkownika
C++ i SFML - problem z obsługą zdarzeń
» 2015-05-24 17:03:16
Witam napisałem grę kółko i krzyżyk w c++ ale działała on tylko w okienku konsoli. Wy googlałem sobie informacje o bibliotece graficznej i wybrałem SFML. Gdy gracz kliknie na dane pole w grze to chcę wyświetlić stosowny obrazek. Kłania się tutaj obsługa zdarzeń i zdarzenie onClick. Gdy szukałem informacji o tym to w 100% przypadków było tak: "Musisz zrobić zdarzenie onClick dla tego obiektu". Problem polega na tym że wiem co zrobić, ale nie wiem jak to zrobić. Nikt nie pokazuje stosownych przykładów, a jak już pokazuje to są to duże i trudne dla mnie projekty.
Wrzucam tutaj kod swojej aplikacji(narazie tylko dla jednego obiektu pole, gdy opanuje jak zrobić to zdarzenie dla jednego obiektu, to zrozumiem też dla pozostałych):

////////////////////////////
main.cpp:

#include <SFML/Graphics.hpp>
#include <string>
#include "pole.h";

using namespace std;

int main()
{
sf::RenderWindow OknoAplikacji(sf::VideoMode(640, 380, 32), "Kolko i Krzyzyk");

Pole p1("pole1","img/nic.bmp",24,24,105,105);

sf::Texture tekstura1;
tekstura1.loadFromFile("img/nic.bmp");

sf::Sprite sprajt1;
sprajt1.setTexture(tekstura1);

while (OknoAplikacji.isOpen())
{
sf::Event zdarzenie;
while (OknoAplikacji.pollEvent(zdarzenie))
{
if (zdarzenie.type == sf::Event::Closed)
{
OknoAplikacji.close();
}
}

sprajt1.setPosition(p1.left, p1.top);

OknoAplikacji.clear(sf::Color(255, 255, 255));
OknoAplikacji.draw(sprajt1);
OknoAplikacji.display();
}
return 0;
}

///////////////////////////////
pole.h:

#include <string>

using namespace std;

class Pole
{
public:
string name;
string image;
float left;
float top;
float width;
float height;

Pole(string = "pole0", string = "img/nic.bmp", float = 24, float = 24, float = 105, float = 105);
};

//////////////////////////////////
pole.cpp:

#include <SFML/Graphics.hpp>
#include <string>
#include "pole.h";

using namespace std;

Pole::Pole(string n, string i, float l, float t, float w, float h)
{
name = n;
image = i;
left = l;
top = t;
width = w;
height = h;
}

Próbowałem zrobić metodę dla obiektu Pole, która tworzy teksurę i rysuje sprita, ale nic z tego nie wyszło, zostałem zaatakowany przez armię errorów. Póki co priorytetem jest dla mnie zrozumienie w jaki sposób tworzy się zdarzenia. Jeżeli czytasz ten post, to prosiłbym o zrobienie przykładowego zjawiska dla onClick, które podmieni obraz img/nic.bmp na img/kolko.bmp na podstawie kodu, który wysłałem. Z góry dziękuje i przepraszam za problem.
P-132704
czosnek17
» 2015-05-24 21:47:48
1. Sprawdź, czy przycisk myszy jest kliknięty
2. Jeżeli jest kliknięty, sprawdź czy kursor znajduje się nad spritem
3. Jeżeli tak, zmień teksturę sprita
sprite.setTexture( tekstura )

Punkt 1 i 2
http://en.sfml-dev.org/forums​/index.php?topic=11195.0
C/C++
if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) )
{
    // transform the mouse position from window coordinates to world coordinates
    sf::Vector2f mouse = window.mapPixelToCoords( sf::Mouse::getPosition( window ) );
   
    // retrieve the bounding box of the sprite
    sf::FloatRect bounds = sprite.getGlobalBounds();
   
    // hit test
    if( bounds.contains( mouse ) )
    {
        // mouse is on sprite!
    }
}

Kod wstawiaj w
[cpp][/cpp]
 :)
P-132720
majkkel
Temat założony przez niniejszego użytkownika
» 2015-05-24 23:20:25
Dziękuje za pomoc już opanowałem ten kod, który wysłałeś i zrozumiałem go w 100%. Jednak wcześniej nie miałem pojęcia o takiej metodzie, która porównuje współrzędne.
P-132724
« 1 »
  Strona 1 z 1