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

[SFML] Problem, prawdopodobnie, z kontenerem obiektów

Ostatnio zmodyfikowano 2012-04-14 07:42
Autor Wiadomość
brago
Temat założony przez niniejszego użytkownika
[SFML] Problem, prawdopodobnie, z kontenerem obiektów
» 2012-04-12 17:25:00
witam,
mam problem, chcę zrobić coś typu zwykłego rpg'a 2d, widok z góry. W każdym bądź razie, mam póki co coś co powinno mi wyświetlać 
mapę z pliku, problem polega na tym, że nie wyświetla się nic, a kompilator nie wyrzuca żadnych błędów.
plik map.h:
C/C++
#include <vector>
#include "object.h"
#ifndef MAP_H_INCLUDED
#define MAP_H_INCLUDED


class map {
public:
    map( char * nazwa_pliku );
    sf::Sprite display( int x, int y );
private:
    std::vector < object > objects;
    std::vector < sf::Texture > textures;
    sf::RenderTexture widok;
    sf::View view;
   
};


#endif // MAP_H_INCLUDED

object.h:
C/C++
#ifndef OBJECT_H_INCLUDED
#define OBJECT_H_INCLUDED
#include <SFML/Graphics.hpp>

class object {
public:
    sf::Sprite sprite;
    int numer;
};


#endif // OBJECT_H_INCLUDED

map.cpp:
C/C++
#include "map.h"
#include <SFML/Graphics.hpp>
#include <string>
#include <fstream>
#include <iostream>
#include "object.h"
#include <vector>

map::map( char * nazwa_pliku ) {
    std::fstream plik;
    int x = 0, y = 0;
    plik.open( nazwa_pliku, std::ios::in );
    if( plik.good() == true )
    {
        std::string linia;
        getline( plik, linia );
        sf::Texture obraz;
        do {
            try {
                obraz.loadFromFile( linia ); }
            catch(...) { std::cout << "blad odczytu pliku" << std::endl;
            }
            textures.push_back( obraz );
            getline( plik, linia );
        } while( linia != "##sprites" );
       
        int i = 0;
        getline( plik, linia );
        do {
            //nadawanie numeru
            object obiekt;
            obiekt.numer = i;
            //nadawanie tekstury z wczytanego numeru oznaczaj¹cego nr w kolejnoœci
            obiekt.sprite.setTexture( textures.at( atoi( linia.c_str() ) ) );
            //nadawanie x i y
            getline( plik, linia );
            x = atoi( linia.c_str() );
            getline( plik, linia );
            y = atoi( linia.c_str() );
            obiekt.sprite.setPosition( x, y );
            getline( plik, linia );
            i++;
            objects.push_back( obiekt );
        } while( linia != "##end" );
       
        plik.close();
        widok.create( 960, 500 );
        view.reset( sf::FloatRect( 0, 0, 960, 500 ) );
    } };


sf::Sprite map::display( int x, int y ) {
    sf::Sprite wynik;
    view.setCenter( x, y );
    widok.setView( view );
    widok.clear( sf::Color::White );
    //for( objects::const_iterator i = objects.begin(); i != objects.end(); ++i ){
    //widok.draw(i->sprite);}
    for( int i = 0; i > objects.size(); i++ ) {
        widok.draw( objects.at( i ).sprite );
    }
    widok.display();
    wynik.setTexture( widok.getTexture() );
    return wynik;
};
mapa.map:
jeden.jpg
dwa.jpg
kamien.jpg
trzy.jpg
##sprites
0
120
120
0
220
120
1
234
234
2
532
765
3
300
500
##end
Będę wdzięczny za wszelkie sugestie, nie mam pojęcia o co może chodzić
P-54350
DejaVu
» 2012-04-12 17:30:45
Jeżeli sf::Texture to odpowidnik sf::Image z wersji 1.6 to:
C/C++
std::vector < sf::Texture * > textures;

/edit:
A wyjaśnienie masz tu: http://cpp0x.pl/forum/temat/?id=6840
P-54351
hincu
» 2012-04-12 18:00:29
problem pewnie lezy we wczytywaniu pliku : P wczytaj sobie najpierw jeden kafelek jesli bedzie wyswietlal sie dobrze znaczy ze jest ok jesli nie to blad przy wczytywaniu z pliku, o ile sie orienuje to w sfml 2.0 jest grafika wczytywana do sf::texture z texture do image : P skorzystaj tez z opcji wyrzucania errorow podziel wszystko sobie na funkcje jesli wczyta prawidlowo zwroc true jesli zas nie to false i tresc bledu tak powinienes dojsc co do czego
P-54353
RazzorFlame
» 2012-04-12 18:30:45
<< Post removed by: DejaVu - jeden temat = jeden problem, a Twój post to ewidentnie nie nawiązywał do zgłoszenia >>
P-54356
brago
Temat założony przez niniejszego użytkownika
» 2012-04-13 17:54:22
okej, zamieniłem <sf::Texture> na <sf::Texture * > i musiałem coś jeszcze zmienić żeby działało, więc zrobiłem tak:
C/C++
do {
    sf::Texture obraz;
    try {
        obraz.loadFromFile( linia ); }
    catch(...) { std::cout << "blad odczytu pliku" << std::endl;
    }
    textures.push_back( & obraz );
    //textures.loadFromFile(linia);//wczytywanie tekstur
    getline( plik, linia );
} while( linia != "##sprites" );

 dodałem sf::Sprite object::draw() gdzie jest setTexture i efekt ten sam, tzn pusto, zakładam, że nie zrozumiałem czegoś,
bo od niedawna mam związek z wskaźnikami...
P-54401
DejaVu
» 2012-04-13 20:38:07
No cóż... ewidentnie zrobiłeś to źle. Poczytaj o dynamicznej alokacji pamięci.
P-54408
brago
Temat założony przez niniejszego użytkownika
» 2012-04-14 06:59:29
no cóż, próbowałem robić to z new i delete, ale nie działało, nawet jeśli na sztywno coś wrzucę do display to nie działa, dałem
nawet widok.clear(sf::Color::Red), ale widok jest dalej biały tak jak kiedyś to sobie tam ustaliłem...
P-54441
DejaVu
» 2012-04-14 07:42:35
To może na początek weź najprostszy kod z tutoriala? Bo wynika z tego, że nie potrafisz poprawnie używać biblioteki SFML, a to z kolei wykracza poza zakres tego tematu.
P-54442
« 1 »
  Strona 1 z 1