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

[SFML Gra] Przemieszczanie się obiektu po ekranie

Ostatnio zmodyfikowano 2014-09-07 17:59
Autor Wiadomość
Mattowy
Temat założony przez niniejszego użytkownika
[SFML Gra] Przemieszczanie się obiektu po ekranie
» 2014-09-07 13:05:09
Witam,

 Mój problem polega na tym, że jak kliknę na niektóre miejsca, na ekranie, to obiekt w kółko przesuwa się z lewej strony na prawą. Jak kliknę w inne miejsce, to po prostu się zatrzymuje. Nie chodzi tutaj o ruchy "na zmianę", tylko o jakieś miejsca. Jaka jest zasada? I jak wyeliminować błąd? Podejrzewam, że chodzi tutaj o okno.

Kody plików.

RObiekt.h

C/C++
#ifndef RObiekt_h
#define RObiekt_h

class RObiekt
{
   
public:
    double x;
    double y;
    double v;
    RObiekt( double f_x = 0.0, double f_y = 0.0, double f_v = 1.0 )
        : x( f_x )
         , y( f_y )
         , v( f_v )
    { }
    void PrzesunObiekt( double vX, double vY );
};

#endif

RObiekt.cpp
C/C++
#include "RObiekt.h"

void RObiekt::PrzesunObiekt( double vX, double vY ) {
    if( x < vX ) {
        x += v;
       
        if( x > vX )
             x = v;
       
    }
    else
    if( x > vX ) {
        x -= v;
       
        if( x < vX )
             x = vX;
       
    }
   
    if( y < vY ) {
        y += v;
       
        if( y > vY )
             y = vY;
       
    }
    else
    if( y > vY )
    {
        y -= v;
       
        if( y < vY )
             y = vY;
       
    }
   
}

main.cpp

C/C++
#include <SFML/Graphics.hpp>
#include <vector>
#include <iostream>
#include "RObiekt.h"



int main() {
   
   
    sf::RenderWindow win( sf::VideoMode( 1366, 768, 512 ), "Wytwarzanie gier C++", sf::Style::Default );
    win.setVerticalSyncEnabled( true );
   
    typedef std::vector < RObiekt > VObiektyT;
    VObiektyT vObiekty;
   
    sf::Texture textura;
    if( textura.loadFromFile( "Sprite_logo.jpg" ) ) //Ladowanie obrazka
         std::cerr << "Nie mozna wyswietlic logo" << std::endl;
   
    sf::CircleShape circle( 20 );
    circle.setOrigin( 20, 20 );
    circle.setTexture( & textura );
    circle.setOutlineColor( sf::Color::Green );
    circle.setOutlineThickness( 3 );
    circle.setScale( 1.0, 1.0 );
   
    bool temp = true; //zmienna pomocnicza do zmiany rozdzielczosci okna
    bool tmp = false; // zmienna pomocnicza - za pierwszym razem potrzebna, zeby wrzucic element do kontenera
    float X_pos, Y_pos; // zmienne pomocnicze do ustalenia pozycji.
   
    sf::Event eve;
   
   
    while( win.isOpen() ) {
       
        while( win.pollEvent( eve ) ) {
           
            if( eve.type == sf::Event::Closed )
                 win.close();
           
            if( eve.type == sf::Event::KeyPressed && eve.key.code == sf::Keyboard::Escape )
                 win.close();
           
            if( eve.type == sf::Event::KeyPressed && eve.key.code == sf::Keyboard::Space )
            {
                if( temp ) {
                    win.create( sf::VideoMode( 1366, 768, 512 ), "Wytwarzanie Gier C++", sf::Style::Fullscreen );
                    temp = false;
                    eve.key.code = sf::Keyboard::Unknown;
                }
                else {
                    win.create( sf::VideoMode( 1366, 768, 512 ), "Wytwarzanie Gier C++", sf::Style::Default );
                    temp = true;
                    eve.key.code = sf::Keyboard::Unknown;
                }
               
            }
           
            if( eve.type == sf::Event::MouseButtonPressed && eve.mouseButton.button == sf::Mouse::Left ) //gdy klikniemy lewy przycisk myszy
            {
                X_pos =( float ) sf::Mouse::getPosition( win ).x; //ustalenie pod zmienne aktualnej pozycji myszy
                Y_pos =( float ) sf::Mouse::getPosition( win ).y;
                if( !tmp ) {
                    vObiekty.push_back( RObiekt( X_pos, Y_pos, 1.5 ) ); // przy pierwszym kliknieciu wrzucimy element do kontenera i tmp zmieni wartosc
                    tmp = true;
                }
                eve.mouseButton.button = sf::Mouse::Right;
            }
           
        }
        win.clear( sf::Color::Black );
        if( tmp ) { //obiekt narysuje sie dopiero po kliknieciu ( w momencie klikniecia temp z false -> true )
            vObiekty.begin()->PrzesunObiekt( X_pos, Y_pos ); //obiekt sie przesuwa. Za pierwszym razem nie bedzie przesuniecia( X_pos == vObiekty[0].x && Y_pos == vObiekty[0].y )
            circle.setPosition(( float ) vObiekty.begin()->x,( float ) vObiekty.begin()->y );
            win.draw( circle );
        }
       
        win.display();
       
    }
   
    return 0;
}
P-116699
SeaMonster131
» 2014-09-07 13:41:50
Na pewno jeden błąd jest tutaj:
C/C++
if( x > vX )
     x = v;

P-116701
RazzorFlame
» 2014-09-07 15:38:01
C/C++
if( eve.type == sf::Event::KeyPressed && eve.key.code == sf::Keyboard::Space )
{
    if( temp ) {
        win.create( sf::VideoMode( 1366, 768, 512 ), "Wytwarzanie Gier C++", sf::Style::Fullscreen );
        temp = false;
        eve.key.code = sf::Keyboard::Unknown;
    }
    else {
        win.create( sf::VideoMode( 1366, 768, 512 ), "Wytwarzanie Gier C++", sf::Style::Default );
        temp = true;
        eve.key.code = sf::Keyboard::Unknown;
    }
   
}
Co to jest? Przy naciśnięci spacji tworzysz okno o rozmiarach 1366, 768 i o głębi 512 bitów? Człowieku WTF? Zamiast 512 wpisz 32 wtedy powinno działać. Tak samo na początku, kiedy pierwszy raz tworzysz okno.
P-116706
Mattowy
Temat założony przez niniejszego użytkownika
» 2014-09-07 17:31:30
W zasadzie dopiero próbuję się odnaleźć w świecie programowania i uczę się - całkiem sporo, sądzę. O co chodzi więc z głębią?

Aa i wszystko działa :)
P-116709
pekfos
» 2014-09-07 17:59:02
O co chodzi więc z głębią?
http://en.wikipedia.org/wiki​/Color_depth
P-116710
« 1 »
  Strona 1 z 1