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

[SFML 2.0] przekazywanie sf::Image za pomocą wskaźnika / referencji

Ostatnio zmodyfikowano 2012-10-23 12:30
Autor Wiadomość
Houston
Temat założony przez niniejszego użytkownika
[SFML 2.0] przekazywanie sf::Image za pomocą wskaźnika / referencji
» 2012-10-22 22:14:40
Witam, chciałem przekazać obrazek do funkcji sprawdzającej kolizje perPixel za pomocą wskaźnika ale wywala mi przy tym aplikację, nie ma żadnych błędów ani ostrzeżeń.

C/C++
...
bool obiekt::kolizja( sf::Image * image ) {
   
    color =( * image ).getPixel( x, y );
    if( color == sf::Color::Black )
         return false;
    else return true;
   
}

...

image = tex2.getTexture().copyToImage();
if( obiekt.kolizja( & image ) == true )...

Ratujcie ;)
P-67316
Mrovqa
» 2012-10-22 22:39:53
Spróbuj poprzez referencję:
C/C++
bool obiekt::kolizja( const sf::Image & image )
Resztę kodu dasz radę poprawić :)
P-67317
Houston
Temat założony przez niniejszego użytkownika
» 2012-10-22 22:51:20
Referencja była pierwszą rzeczą, której próbowałem :)
Nadal wywala.
P-67319
DejaVu
» 2012-10-22 22:53:25
C/C++
obiekt.getPixel( x, y );
Powyższa linijka jest jakaś DZIWNA. Co oznaczają zmienne x oraz y? Gdzie je ustawiasz?
P-67320
Houston
Temat założony przez niniejszego użytkownika
» 2012-10-22 23:21:53
Nie będę wrzucał całego kodu, bo to chyba nie ma sensu.W main() mam na pewno wszystko zadeklarowane.
Klasa i odpalanie pocisku w głównej pętli:

C/C++
class Pocisk
{
public:
    int x0, y0, x1, y1;
    float v0, angle, jakisWspolczynnik;
    sf::Color color;
   
    void ready( sf::CircleShape & pocisk, int x, int y ) // ustawienie pocisku w miejscu działa
    {
        pocisk.setPosition( x, y );
        x0 = x;
        y0 = y;
    }
   
    void move( sf::CircleShape & pocisk, int t ) // przemieszczenie pocisku dla danego czasu t
    {
        x1 = x0 + v0 * cos( angle );
        y1 = y0 + v0 * sin( angle ) - g * t * jakisWspolczynnik;
        x0 = x1;
        y0 = y1;
    }
   
    bool explode( sf::Image & image )
    {
        color = image.getPixel( x0, y0 );
        if( color == sf::Color::Black )
             return false;
        else return true;
       
    }
};


C/C++
if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) && shooting == false )
{
    shooting = true;
    pocisk.angle = //tu wyliczenie kąta
    pocisk.ready( kula, x, y ); // kula to sf::CircleShape, x,y to współrzędne działa
}

if( shooting = true )
{
    pocisk.move( kula, time ); //int time=0; takie prymitywne obsługiwanie czasu ;)
    time++;
    ...// tu rysowanie lecącego pocisku
}

if( shooting == true && pocisk.explode( image ) == true )
{
    shooting = false;
    time = 0;
    ...
    // tu skutki eksplozji
    ...
    image = rendertexture.getTexture().copyToImage(); // najpierw rysuję po teksturze rendertexture, później kopiuję do obrazka
    sprite.setTexture( rendertexture.getTexture() );
    window.draw( sprite );
}
P-67322
DejaVu
» 2012-10-23 01:01:52
Lepiej sprawdź czy faktycznie ta tekstura po skopiowaniu istnieje oraz czy współrzędne x,y nie wychodzą poza rozmiar obrazka.
P-67325
Houston
Temat założony przez niniejszego użytkownika
» 2012-10-23 12:30:32
O, na to bym nie wpadł. Rzeczywiście nie sprawdzałem, czy x,y nie wychodzi poza obrazek :)

Jeszcze taki mały problem: przy wyświetlaniu dwóch składowych wektora składowa X cały czas pokazuje 0, a Y działa poprawnie.

fragment kodu:
C/C++
float x = 10., y = 150.;
char buffer[ 50 ];
sf::Vector2f mysz = sf::Vector2f( sf::Mouse::getPosition( okno ) );

sf::Vector2f kierunek(( mysz.x - x ),( mysz.y - y ) );

sprintf( buffer, "%3.0f , %3.0f", kierunek.x, kierunek.y );
sf::Text tekst( bufer );
// dalej wyświetlanie na ekranie[/code]
P-67331
« 1 »
  Strona 1 z 1