RazzorFlame Temat założony przez niniejszego użytkownika |
[SFML] Odczytywanie i wyswietlanie tablicy pikseli (cos typu bitmapy) - pomoc w wyszukiwaniu bledu » 2012-07-25 08:42:44 Otóż juz od dawna probuje sie z tym uporac. raz nawet udalo mi sie wyswietlic taka choby bitmape... Jednak teraz mam z tym problem. Program sie zawiesza i wyskakuje komunikat ze Program ten i ten przestal dzialac. Chcialbym abyscie przeanalizowali moj kod i jezeli to mozliwe to podali co jest zle a ja to poprawie. Sam tez nie szczędze czasu na przeszukiwaniu kodu. Tutaj main.cpp #include "classes.h"
int main() { sf::RenderWindow app( sf::VideoMode( 800, 600, 32 ), "Odczytywanie...", sf::Style::Close ); sf::Event ev; sf::Image img( 800, 600, sf::Color( 255, 0, 0 ) ); sf::Sprite bufor; img.SetSmooth( false ); bufor.SetImage( img ); MyBMP bmp1( "bmp1.sss", 80, 80, 5, 5, 0, 0 ); while( app.IsOpened() ) { while( app.GetEvent( ev ) ) { if( ev.Type == sf::Event::Closed ) app.Close(); } app.Clear( sf::Color( 255, 0, 0 ) ); ClearIMG( img, sf::Color( 255, 0, 0 ), 800, 600 ); app.Draw( bufor ); app.Display(); } return 0; }
Tutaj classes.h #include <SFML/Graphics.hpp> #include <SFML/Window.hpp> #include <SFML/System.hpp> #include <vector> #include <fstream> #include <iostream> #include <stdlib.h>
using namespace std;
class MyRGB { public: int r; int g; int b; MyRGB( int rr, int gg, int bb ); void SetRGB( int rr, int gg, int bb ); MyRGB GetRGB(); };
class MyBMP { public: int x; int y; int w; int h; int bx; int by; int iw; int ih; MyBMP(); MyBMP( char * filename, int xx, int yy, int ww, int hh, int bxx, int byy ); vector < vector < MyRGB > > pixels; void LoadBMP( char * filename ); void BlitOn( sf::Image & spr ); };
void ClearIMG( sf::Image & img, sf::Color col, int w, int h );
Tutaj classes.cpp #include "classes.h"
MyRGB::MyRGB( int rr, int gg, int bb ) { SetRGB( rr, gg, bb ); } void MyRGB::SetRGB( int rr, int gg, int bb ) { r = rr; g = gg; b = bb; } MyRGB MyRGB::GetRGB() { MyRGB color( r, g, b ); return color; }
MyBMP::MyBMP() { x = 0; y = 0; w = 0; h = 0; bx = 0; by = 0; iw = 0; ih = 0; } MyBMP::MyBMP( char * filename, int xx, int yy, int ww, int hh, int bxx, int byy ) { x = xx; y = yy; w = ww; h = hh; bx = bxx; by = byy; LoadBMP( filename ); } void MyBMP::LoadBMP( char * filename ) { string tonl; ifstream plik( filename ); plik >> iw >> ih; getline( plik, tonl ); char gr[ 3 ]; char gg[ 3 ]; char gb[ 3 ]; for( int mx = 0; mx < ih; mx++ ) { for( int my = 0; my < iw; my++ ) { plik >> gr[ 0 ] >> gr[ 1 ] >> gr[ 2 ]; plik >> gg[ 0 ] >> gg[ 1 ] >> gg[ 2 ]; plik >> gb[ 0 ] >> gb[ 1 ] >> gb[ 2 ]; pixels[ mx ].push_back( MyRGB( atoi( gr ), atoi( gg ), atoi( gb ) ) ); } } }
void MyBMP::BlitOn( sf::Image & spr ) { int px = bx, py = by; for( int mx = x; mx < x + w; mx++ ) { for( int my = y; my < y + h; my++ ) { spr.SetPixel( mx, my, sf::Color( pixels[ px ][ py ].r, pixels[ px ][ py ].g, pixels[ px ][ py ].b ) ); } px++; py = by; } }
void ClearIMG( sf::Image & img, sf::Color col, int w, int h ) { for( int x = 0; x < w; x++ ) { for( int y = 0; y < h; y++ ) { img.SetPixel( x, y, col ); } } }
A oto plik bmp1.sss: 5 5 000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000
Edit: Jeszcze nawet go nie wyswietlam a juz wyskakuje blad :< Edit x2: Nosz k***a juz chyba wiem o co chodzi ale jeszcze zostawiam temat bo nie wiem czy zadziala. Edit x3: Ahh nie wiem jak dodac do wektora to cos. Nie wiem jak to ujac. Moze zobaczycie co napisalem ale sie nie kompiluje i nie wiem o co cho: pixels.push_back( vector < MyRGB >( 0, 0, 0 ) ); |