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
» 2015-03-15 19:15:56
C/C++
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <SFML/Graphics.hpp>
#define wxmx 800
#define wymy 600
#define ilosc 5
using namespace std;

int main()
{
   
    char kwadraty[ 5 ];
    int x;
    sf::RenderWindow okno( sf::VideoMode( wxmx, wymy ), "SFML kwadraty" );
    while( okno.isOpen() )
    {
        sf::Event zdarzenie;
       
        while( okno.pollEvent( zdarzenie ) )
        {
            if( zdarzenie.type == sf::Event::Closed )
                 okno.close();
           
            int aktywny = - 1;
           
            for( int i = 0; i < 5; i++ )
            {
               
                sf::RectangleShape x( sf::Vector2f( 82, 50 ) );
                x.setPosition( 200, 10 );
                if( x.getGlobalBounds().contains(( sf::Vector2f ) sf::Mouse::getPosition( okno ) ) && zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Left &&( i ) )
                     aktywny = i;
               
            }
           
           
            if( aktywny != - 1 )
            {
                if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) )
                {
                    kwadraty[ aktywny ].move( 0, - 1 );
                }
                if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) )
                {
                   
                    kwadrat[ aktywny ].move( 0, 1 );
                }
               
               
                okno.clear();
                okno.draw( x );
                okno.display();
                return 0;
            }
 zacząłem od nowa mówię zrobię najpierw aby po kliknięciu ruszał się jeden a później będę rozbudowywał to.
 ||=== Build: Debug in to (compiler: GNU GCC Compiler) ===|
In function ‘int main()’:|

error: request for member ‘move’ in ‘kwadraty[aktywny]’, which is of non-class type ‘char’|
error: no matching function for call to ‘sf::RenderWindow::draw(int&)’|

note: void sf::RenderTarget::draw(const sf::Drawable&, const sf::RenderStates&)|
note:   no known conversion for argument 1 from ‘int’ to ‘const sf::Drawable&’|
note: void sf::RenderTarget::draw(const sf::Vertex*, unsigned int, sf::PrimitiveType, const sf::RenderStates&)|

to mi wywaliło takie błędy choć zrobić aby to działało dla 1 to dalej już zrobię.

P-128485
Lora
» 2015-03-15 19:33:05
Ta tablica miała być tablicą
sf::RectangleShape
, a nie
char
.
return 0
 ma być pod koniec maina a nie w pętli. I coś z tymi pętlami pomieszałeś, w pętli zdarzeń ma być tylko obsługa zdarzeń (obsługa kliknięcia na kwadrat i zamykania okna w tym przypadku), reszta ma być poza tą pętlą.
C/C++
sf::RectangleShape x( sf::Vector2f( 82, 50 ) );
x.setPosition( 200, 10 );
if( x.getGlobalBounds().contains(( sf::Vector2f ) sf::Mouse::getPosition( okno ) ) && zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Left &&( i ) )
     aktywny = i;

To nie ma w ogóle sensu, przecież x będzie miał ciągle tę samą pozycje niezależną od pozycji kwadratów. Tak miało być:
C/C++
for( int i = 0; i < 5; i++ )
{
   
   
    if( kwadraty[ i ].getGlobalBounds().contains(( sf::Vector2f ) sf::Mouse::getPosition( okno ) ) && zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Left )
         aktywny = i;
   
}
i deklarację
int aktywny = - 1;
 daj przed rozpoczęciem głównej pętli gry (żeby się nie zmieniała z każdym obiegiem pętli z powrotem na -1).

edit:
i funkcje draw, clear i display mają być poza ifem, one mają się wykonywać w każdym obiegu głównej pętli gry.
P-128486
miro741
Temat założony przez niniejszego użytkownika
» 2015-03-15 19:45:12
C/C++
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <SFML/Graphics.hpp>
#define wxmx 800
#define wymy 600
#define ilosc 5
using namespace std;

int main()
{
    int aktywny = - 1;
    sf::RectangleShape kwadraty[ 5 ];
   
    sf::RenderWindow okno( sf::VideoMode( wxmx, wymy ), "SFML kwadraty" );
    sf::Event zdarzenie;
    sf::RectangleShape x( sf::Vector2f( 80, 40 ) );
    for( int i = 0; i < 5; i++ )
    {
       
       
        if( kwadraty[ i ].getGlobalBounds().contains(( sf::Vector2f ) sf::Mouse::getPosition( okno ) ) && zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Left )
             aktywny = i;
       
    }
   
    while( okno.isOpen() )
    {
       
       
        while( okno.pollEvent( zdarzenie ) )
        {
            if( zdarzenie.type == sf::Event::Closed )
                 okno.close();
           
            if( aktywny != 0 )
            {
                if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) )
                {
                    kwadraty[ aktywny ].move( 0, - 1 );
                }
               
            }
           
           
            okno.clear();
            okno.draw( x );
            okno.display();
        }
    }
    return 0;
   
   
}
 No oki poprawiłem i kompiluje wyświetla mi go ale nadal po kliknięciu nic się nie dzieje
P-128488
Lora
» 2015-03-15 19:48:22
Po co ci ten x? Normalnie zdefiniuj te kwadraty jak robiłeś to za pierwszym razem:
C/C++
kwadraty[ 0 ] = sf::RectangleShape( sf::Vector2f( x2, x1 ) );
kwadraty[ 0 ].setPosition( 200, 10 );
//itd.

I zamiast
okno.draw( x )
:
C/C++
for( int i = 0; i < 5; i++ )
{
    okno.draw( kwadraty[ i ] );
}

I ma być
aktywny != - 1
, a nie
aktywny != 0
EDIT:
Wciąż masz źle tą pętle
P-128489
Lora
» 2015-03-15 19:53:20
C/C++
while( okno.pollEvent( zdarzenie ) )
{
    if( zdarzenie.type == sf::Event::Closed )
         okno.close();
   
    for( int i = 0; i < 5; i++ )
    {
       
        if( kwadraty[ i ].getGlobalBounds().contains(( sf::Vector2f ) sf::Mouse::getPosition( okno ) ) && zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Left )
             aktywny = i;
       
    }
}
Tak ma wyglądać pętla zdarzeń. Reszta kodu który masz w tej pętli ma być za nią (ale wciąż ma być w głównej pętli gry, główna pętla gry to ta pętla
while( okno.isOpen() )
).
P-128490
miro741
Temat założony przez niniejszego użytkownika
» 2015-03-15 19:54:31
C/C++
#include <SFML/Graphics.hpp>
#define wxmx 800
#define wymy 600
#define ilosc 5
using namespace std;
int aktywny = - 1;
int main()
{
   
    sf::RectangleShape kwadraty[ 5 ];
   
    sf::RenderWindow okno( sf::VideoMode( wxmx, wymy ), "SFML kwadraty" );
    sf::Event zdarzenie;
    kwadraty[ 0 ] = sf::RectangleShape( sf::Vector2f( 40, 50 ) );
    kwadraty[ 0 ].setPosition( 200, 10 );
   
   
    while( okno.isOpen() )
    {
       
       
        while( okno.pollEvent( zdarzenie ) )
        {
            if( zdarzenie.type == sf::Event::Closed )
                 okno.close();
           
            for( int i = 0; i < 5; i++ )
            {
               
                if( kwadraty[ i ].getGlobalBounds().contains(( sf::Vector2f ) sf::Mouse::getPosition( okno ) ) && zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Left )
                     aktywny = i;
               
            }
        }
       
        if( aktywny != - 1 )
        {
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) )
            {
                kwadraty[ aktywny ].move( 0, - 1 );
               
               
                if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) )
                     kwadraty[ aktywny ].move( 0, 1 );
               
                if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) )
                     kwadraty[ aktywny ].move( - 1, 0 );
               
               
               
                okno.clear();
                for( int i = 0; i < 5; i++ )
                {
                    okno.draw( kwadraty[ i ] );
                }
                okno.display();
               
               
               
                return 0;
               
            }
        }
działa po kliknięciu rusza się ok wielkie dzięki wszystkim za pomoc a w szczególności LORA. Teraz tylko go rozbuduje. zamykam temat
P-128491
Lora
» 2015-03-15 19:55:59
Popatrz wyżej.
P-128492
Lora
» 2015-03-15 20:06:18
Możesz też poczytać o pętli stałokrokowej, bo na razie te kwadraty poruszają się z szybkością zależną od szybkości procesora.
P-128493
1 2 3 4 « 5 » 6
Poprzednia strona Strona 5 z 6 Następna strona