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

[SFML 2.0] Wyświetlanie fragmentu grafiki

Ostatnio zmodyfikowano 2013-06-28 21:37
Autor Wiadomość
olozi
Temat założony przez niniejszego użytkownika
[SFML 2.0] Wyświetlanie fragmentu grafiki
» 2013-06-28 19:08:42
Mam problem gdyż, obraz jaki mi się wyświetla nie jest taki jakiego oczekuję. Funkcja "spalanie" działa bez zarzutów, ale jak dodałem drugi obraz (który pojawia się gdy dany fragment się "spali"), to efekt był dziwny. Po pewnych razach upływu pętli spalanie, powinien powstać okręg (dość łamany), a w środku tego okręgu nowa grafika,  natomiast na zewnątrz stara. Efekt jest taki, że pole na zewnątrz okręgu wyświetla się poprawnie, a w środku widzę na początku białe tło (to mój pierwotny obrazek), a dopiero z czasem ukazuje się drugi obrazek (stanowczo za późno), a na domiar złego grafika znajdująca się poza pierwotnym obrazkiem (od dołu i prawej strony obrazka) jest niewidoczna.



main.cpp
C/C++
#include <SFML/Graphics.hpp>
#include "menu.h"

int main()
{
    sf::RenderWindow oknoAplikacji( sf::VideoMode( 800, 600 ), "menu" /*, sf::Style::None*/ );
    oknoAplikacji.setActive( false );
    menu( & oknoAplikacji );
   
    return 0;
}

menu.cpp
C/C++
#include "menu.h"
#include "spalanie.h"

#include <SFML/Graphics.hpp>
#include <iostream>
#include <sstream>


void menu( sf::RenderWindow * oknoAplikacji )
{
    oknoAplikacji->setActive( true );
   
    sf::Clock stoper;
    bool dzialaj = true;
   
    sf::Texture tekstura;
    if( !tekstura.loadFromFile( "obrazek.jpg" ) ) //Wczytywanie tekstury
         dzialaj = false;
    //, sf::IntRect(10,10,32,32) //laduje czesc obrazka
    //tekstura.setSmooth(true); //Wygladzanie krawedzi
    sf::Sprite sprajt; //Tworzenie sprajta
    sprajt.setTexture( tekstura ); //Ladujemy teksture do
    sprajt.setPosition( 600, 30 );
   
   
   
    sf::Texture teksturaDoUzywania;
    sf::Sprite sprajtDoUzywania;
   
   
    sf::RectangleShape prostokat( sf::Vector2f( 120, 50 ) );
    //prostokat.setFillColor(sf::Color(100, 250, 50));
    prostokat.setPosition( 600, 30 );
   
   
    bool spalanie = false;
   
    while( dzialaj )
    {
        sf::Event zdarzenie;
        while( oknoAplikacji->pollEvent( zdarzenie ) ) {
            switch( zdarzenie.type ) {
               
            case sf::Event::Closed:
                dzialaj = false;
                break;
               
            case sf::Event::KeyPressed:
                if( zdarzenie.key.code == sf::Keyboard::Escape )
                     dzialaj = false;
               
                break;
               
            case sf::Event::LostFocus: //Okno stracilo zaznaczenie
                dzialaj = false;
                break;
            }
        }
       
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) ) {
            if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) )
            {
                sf::Image zrzutEkranu = oknoAplikacji->capture(); ///Zrzuca obraz ekranu do obrazka
                teksturaDoUzywania.loadFromImage( zrzutEkranu, sf::IntRect( pozycjaMyszyWzgledemOkna1.x - 80 + 1, pozycjaMyszyWzgledemOkna1.y - 60 + 1, pozycjaMyszyWzgledemOkna1.x + 80 - 20, pozycjaMyszyWzgledemOkna1.y + 60 - 20 ) );
               
                //pozycjaMyszyWzgledemOkna1 = sf::Mouse::getPosition( *oknoAplikacji );
                spal( pozycjaMyszyWzgledemOkna1.x - 80 + 1, pozycjaMyszyWzgledemOkna1.y - 60 + 1, pozycjaMyszyWzgledemOkna1.x + 80 - 20, pozycjaMyszyWzgledemOkna1.y + 60 - 20, pozycjaMyszyWzgledemOkna1.x, pozycjaMyszyWzgledemOkna1.y );
                //std::cout << "poszlo" << std::endl;
                spalanie = true;
               
                sprajt.setPosition( pozycjaMyszyWzgledemOkna1.x - 80, pozycjaMyszyWzgledemOkna1.y - 60 );
            }
            else if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) ) {
                opcjaSpalania( 1 );
                while( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) ) { }
            }
            else if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) ) {
                opcjaSpalania( - 1 );
                while( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) ) { }
            }
        }
       
       
        oknoAplikacji->clear( sf::Color::White );
       
       
        if( spalanie )
        {
            oknoAplikacji->draw( sprajt );
            spalanie = spalaj( &* oknoAplikacji, & prostokat, & teksturaDoUzywania );
        }
       
        oknoAplikacji->display();
    }
}

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

#include <SFML/Graphics.hpp>
#include <cstdlib>
#include <iostream>

int xKoniec, yKoniec, xPoczatek, yPoczatek, iloscPowtorzen = 0;
int tab[ 800 ][ 600 ];

int jakoscKomputera = 1;
sf::Sprite sprajts;


void opcjaSpalania( int szybkoscSpalania )
{
    if( jakoscKomputera + szybkoscSpalania < 5 && jakoscKomputera + szybkoscSpalania > 0 )
         jakoscKomputera += szybkoscSpalania;
   
}

void spal( int x_Poczatek, int y_Poczatek, int x_Koniec, int y_Koniec, int x_Start, int y_Start )
{
    xPoczatek = x_Poczatek;
    yPoczatek = y_Poczatek;
    xKoniec = x_Koniec - x_Poczatek;
    yKoniec = y_Koniec - y_Poczatek;
   
    iloscPowtorzen = 0;
   
    srand( time( NULL ) );
   
    for( int i = 0; i < xKoniec; i++ ) {
        for( int j = 0; j < yKoniec; j++ ) {
            tab[ i ][ j ] = rand() % 10 + 1;
        }
    }
   
    while( x_Start % jakoscKomputera != 0 )
         x_Start++;
   
    while( x_Poczatek % jakoscKomputera != 0 )
         x_Poczatek++;
   
    while( y_Start % jakoscKomputera != 0 )
         y_Start++;
   
    while( y_Poczatek % jakoscKomputera != 0 )
         y_Poczatek++;
   
   
   
    tab[ x_Start - x_Poczatek ][ y_Start - y_Poczatek ] = 0;
    //tab[x_Start][y_Start]=0;
   
    std::cout << "wpisano " << x_Start << " " << y_Start << std::endl;
}

bool spalaj( sf::RenderWindow * oknoAplikacji, sf::RectangleShape * kwadracik, sf::Texture * wygladEkranuPrzedSpalaniem )
{
    kwadracik->setSize( sf::Vector2f( jakoscKomputera, jakoscKomputera ) ); //Zmienia wymiary prostokata
   
    for( int i = 0; i < xKoniec; i += jakoscKomputera ) {
        for( int j = 0; j < yKoniec; j += jakoscKomputera ) {
            if( tab[ i ][ j ] <= 0 && tab[ i ][ j ] >= - 15 )
            {
                if( i - jakoscKomputera >= 0 )
                if( tab[ i - jakoscKomputera ][ j ] > 0 ) {
                    tab[ i - jakoscKomputera ][ j ] --;
                }
                if( i + jakoscKomputera < xKoniec )
                if( tab[ i + jakoscKomputera ][ j ] > 0 ) {
                    tab[ i + jakoscKomputera ][ j ] --;
                }
                if( j - jakoscKomputera >= 0 )
                if( tab[ i ][ j - jakoscKomputera ] > 0 ) {
                    tab[ i ][ j - jakoscKomputera ] --;
                }
                if( j + jakoscKomputera < yKoniec )
                if( tab[ i ][ j + jakoscKomputera ] > 0 ) {
                    tab[ i ][ j + jakoscKomputera ] --;
                }
               
                tab[ i ][ j ] --;
                if( tab[ i ][ j ] == - 15 )
                     iloscPowtorzen++;
               
            }
           
           
           
            if( tab[ i ][ j ] > - 15 ) {
                sprajts.setTexture( * wygladEkranuPrzedSpalaniem ); //Ladujemy teksture do sprajta
                sprajts.setTextureRect( sf::IntRect( i, j, i + jakoscKomputera, j + jakoscKomputera ) );
                sprajts.setPosition( xPoczatek + i, yPoczatek + j );
                oknoAplikacji->draw( sprajts );
               
                if( tab[ i ][ j ] <= 0 )
                {
                    kwadracik->setFillColor( sf::Color( 0, 0, 0, 0 - tab[ i ][ j ] * 17 ) );
                    kwadracik->setPosition( xPoczatek + i, yPoczatek + j );
                    oknoAplikacji->draw( * kwadracik );
                }
            }
           
        }
    }
    std::cout << "wyswietlono " << iloscPowtorzen << std::endl;
   
    if( iloscPowtorzen <=( xKoniec * yKoniec ) /( jakoscKomputera * jakoscKomputera ) - 50 )
         return true;
    else
         return false;
   
}
P-86490
olozi
Temat założony przez niniejszego użytkownika
» 2013-06-28 20:03:18
PS. Jak można to usprawnić?
P-86510
olozi
Temat założony przez niniejszego użytkownika
» 2013-06-28 21:37:52
Znalazłem błąd.
funkcja: sprajt.setTextureRect(sf::IntRect(60, 10, 300, 300)); //Wycina dany fragment (x, y, szerokosc, wysokosc)
a mi się wydawało, że ja daje parametry, od kąd do kąd
P-86535
« 1 »
  Strona 1 z 1