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

SFML Poruszanie obiektów/aktywacja obiektów

Ostatnio zmodyfikowano 2015-03-15 21:25
Autor Wiadomość
miro741
Temat założony przez niniejszego użytkownika
SFML Poruszanie obiektów/aktywacja obiektów
» 2015-03-14 21:08:25
Siemanko siedzę na tym już parę dni i chcę aby wyświetliło mi 5 kwadratów,[][][][][] po czym jak kliknę np drugiego to żebym mógł nim sterować za pomocą strzałek. Mam zrobione wyświetlanie i poruszanie. Tylko brakuje mi tej aktywacji myszką
C/C++
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <SFML/Graphics.hpp>
#define wxmx 800 //zdefiniowanie wymiaru okna
#define wymy 600
#define ilosc 5 // zdefiniowanie ilosci kwadratow
using namespace std;

class kwadrat
{
private:
    float x1, x2, q1, q2, w1, w2, e1, e2, r1, r2;
public:
    void wspolrzedne()
    {
        x1 = 50; x2 = 50;
        q1 = 40; q2 = 40;
        w1 = 60; w2 = 60;
        e1 = 80; e2 = 80;
        r1 = 30; r2 = 30;
    }
   
    void rysuj()
    {
        void wspolrzedne();
        sf::RenderWindow okno( sf::VideoMode( wxmx, wymy ), "SFML kwadraty" );
        sf::Mouse myszka;
        sf::RectangleShape x( sf::Vector2f( x2, x1 ) );
        x.setPosition( 200, 10 );
        sf::RectangleShape q( sf::Vector2f( q2, q1 ) );
        q.setPosition( 0, 10 );
        sf::RectangleShape w( sf::Vector2f( w2, w1 ) );
        w.setPosition( 100, 10 );
        sf::RectangleShape e( sf::Vector2f( e2, e1 ) );
        e.setPosition( 300, 10 );
        sf::RectangleShape r( sf::Vector2f( r2, r1 ) );
        r.setPosition( 400, 10 );
       
        while( okno.isOpen() )
        {
            sf::Event zdarzenie;
            while( okno.pollEvent( zdarzenie ) )
            {
                if( zdarzenie.type == sf::Event::Closed )
                     okno.close();
               
            }
           
            while( okno.pollEvent( zdarzenie ) )
           
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) )
                 q.move( 0, - 1 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) )
                 q.move( 0, 1 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) )
                 q.move( - 1, 0 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) )
                 q.move( 1, 0 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) )
                 x.move( 0, - 1 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) )
                 x.move( 0, 1 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) )
                 x.move( - 1, 0 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) )
                 x.move( 1, 0 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) )
                 w.move( 0, - 1 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) )
                 w.move( 0, 1 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) )
                 w.move( - 1, 0 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) )
                 w.move( 1, 0 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) )
                 e.move( 0, - 1 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) )
                 e.move( 0, 1 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) )
                 e.move( - 1, 0 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) )
                 e.move( 1, 0 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) )
                 r.move( 0, - 1 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) )
                 r.move( 0, 1 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) )
                 r.move( - 1, 0 );
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) )
                 r.move( 1, 0 );
           
            okno.clear();
            okno.draw( x );
            okno.draw( q );
            okno.draw( w );
            okno.draw( e );
            okno.draw( r );
            okno.display();
        }
    }
   
   
};
int main()
{
    kwadrat pp; // przypisanie p1
    {
        pp.wspolrzedne();
        pp.rysuj();
       
    }
    return 0;
}
 i dalej nie wiem jak zrobić
P-128382
Lora
» 2015-03-14 21:29:47
Po co tyle tych if-ów? Wystarczyłyby cztery. Kliknięcie myszki możesz sprawdzać funkcją
sf::Mouse::isButtonPressed( sf::Mouse::Left )
 , a jej pozycję funkcją
sf::Mouse::getPosition( okno )
.
P-128387
miro741
Temat założony przez niniejszego użytkownika
» 2015-03-14 21:36:40
No ok powiedz mi gdzie umieścić i jak te 2 funkcje aby one zadziałały.
I których if się pozbyć ?
P-128388
Lora
» 2015-03-14 21:50:09
C/C++
if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) )
{
    q.move( 0, - 1 );
    x.move( 0, - 1 );
    w.move( 0, - 1 );
    e.move( 0, - 1 );
    r.move( 0, - 1 );
}
Sprawdzaj kliknięcie każdego kwadratu i przechowuj gdzieś który kwadrat został kliknięty.
C/C++
if( q.getGlobalBounds().contains(( sf::Vector2f ) sf::Mouse::getPosition( okno ) ) && sf::Mouse::isButtonPressed( sf::Mouse::Left ) )
{
    //...
}
     I po co ci te dwie komendy
while( okno.pollEvent( zdarzenie ) )
 ? Wyrzuć tę drugą.
@EDIT:
Tylko jeśli te kwadraty mogą zostać kliknięte i później odkliknięte to jako, że dzieje się to w pętli może się zdarzyć, że chciałeś kliknąć kwadrat jeden raz, a w rzeczywistości został on kliknięty kilka razy, ponieważ w czasie klikania pętla zrobiła kilka obiegów.
Żeby to trochę spowolnić możesz dodać dodatkowy warunek:
C/C++
if( q.getGlobalBounds().contains(( sf::Vector2f ) sf::Mouse::getPosition( okno ) ) && sf::Mouse::isButtonPressed( sf::Mouse::Left )
&& time.getElapsedTime().asSeconds() > 0.1 )
{
    //...
    time.restart();
}
time to obiekt klasy sf::Clock.
P-128391
miro741
Temat założony przez niniejszego użytkownika
» 2015-03-14 22:03:59
Gdzie mogę przechowywać to kliknięcie ?
P-128393
Brunon3
» 2015-03-14 22:08:26
W tablicy zmiennych typu
bool
. :P

-BD.
P-128394
Lora
» 2015-03-14 22:10:31
Możesz też użyć kontenera map<char, bool>, żeby przypisać nazwę każdego kwadratu do informacji czy jest zaznaczony. Będzie to bardziej czytelne.
P-128395
miro741
Temat założony przez niniejszego użytkownika
» 2015-03-14 22:34:55
czyli tworze

C/C++
bool * kw = & tablica[ 0 ];
if( * kw );

wsk++;
if( * kw );

wsk++;
if( * kw );

i gdzie to umie ś ci ć ? i czy dobrze my ś l ę ?

P-128405
« 1 » 2 3 4 5 6
  Strona 1 z 6 Następna strona