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 #include <SFML/Graphics.hpp> #include "menu.h"
int main() { sf::RenderWindow oknoAplikacji( sf::VideoMode( 800, 600 ), "menu" ); oknoAplikacji.setActive( false ); menu( & oknoAplikacji ); return 0; }
menu.cpp #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" ) ) dzialaj = false; sf::Sprite sprajt; sprajt.setTexture( tekstura ); sprajt.setPosition( 600, 30 ); sf::Texture teksturaDoUzywania; sf::Sprite sprajtDoUzywania; sf::RectangleShape prostokat( sf::Vector2f( 120, 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: dzialaj = false; break; } } if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) ) { if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) ) { sf::Image zrzutEkranu = oknoAplikacji->capture(); teksturaDoUzywania.loadFromImage( zrzutEkranu, sf::IntRect( pozycjaMyszyWzgledemOkna1.x - 80 + 1, pozycjaMyszyWzgledemOkna1.y - 60 + 1, pozycjaMyszyWzgledemOkna1.x + 80 - 20, pozycjaMyszyWzgledemOkna1.y + 60 - 20 ) ); spal( pozycjaMyszyWzgledemOkna1.x - 80 + 1, pozycjaMyszyWzgledemOkna1.y - 60 + 1, pozycjaMyszyWzgledemOkna1.x + 80 - 20, pozycjaMyszyWzgledemOkna1.y + 60 - 20, pozycjaMyszyWzgledemOkna1.x, pozycjaMyszyWzgledemOkna1.y ); 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 #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; 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 ) ); 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 ); 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; }
|
|
olozi Temat założony przez niniejszego użytkownika |
» 2013-06-28 20:03:18 PS. Jak można to usprawnić? |
|
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 |
|
« 1 » |