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

[SFML, C++] Map/set iterator not dereferencable

Ostatnio zmodyfikowano 2011-10-10 19:33
Autor Wiadomość
Dark
Temat założony przez niniejszego użytkownika
[SFML, C++] Map/set iterator not dereferencable
» 2011-09-10 17:15:18
Mam problem, chociaż aplikacja się odpala to wywala mi errora właśnie z tym, oto kod:
main.cpp
C/C++
#include "head.h"

int main()
{
    sf::RenderWindow okno( sf::VideoMode( 800, 600, 32 ), "Crion" );
    okno.SetFramerateLimit( 60 ); // ustawienie limitu 60 klatek na sekundę
   
    Coords * DrawingAll = new Coords;
   
    DrawingAll->DrawAll( & okno );
   
   
   
    return 0;
}
head.h
C/C++
#ifndef head_h
#define head_h
#include <SFML/Graphics.hpp>
#include <iostream>
#include <vector>
#include <map>

using namespace std;

struct Point
{
    int X, Y;
};
class Coordinate
{
    int Width;
    int Height;
public:
    Point ObjectPoint;
    Coordinate()
    {
    }
    Coordinate( int X, int Y, int W, int H )
    {
        Width = W;
        Height = H;
        ObjectPoint.X = X;
        ObjectPoint.Y = Y;
    }
};

class Image
{
public:
    map < string, sf::Image > ImageMap;
    void AddImage( string FileName )
    {
        sf::Image & ImageI = ImageMap[ FileName ];
        if( ImageI.LoadFromFile( FileName ) )
        {
            ImageI.SetSmooth( false );
        }
        else
             cout << "Błąd wczytywania " << FileName << endl;
       
    }
    void ListOfImage()
    {
        if( !ImageMap.empty() )
        {
            map < string, sf::Image >::iterator itImageMap;
            short int Lp = 1;
            cout << "Lista obrazow" << endl;
            for( itImageMap = ImageMap.begin(); itImageMap != ImageMap.end(); itImageMap++ )
            {
                cout << Lp << ". " <<( * itImageMap ).first << endl;
                Lp++;
            }
        }
        else
             cout << "Brak images" << endl;
       
    }
};

class Sprite
    : public Image
{
protected:
    map < string, sf::Sprite >::iterator itSprajtMap;
public:
    map < string, sf::Sprite > SprajtMap;
   
    void AddNameSprite( string SprajtName, string ImageSrc )
    {
        sf::Sprite & SprajtO = SprajtMap[ SprajtName ];
        SprajtO.SetImage(( * ImageMap.find( ImageSrc ) ).second );
       
    }
   
    void ListSprajtIm()
    {
        if( !SprajtMap.empty() )
        {
            cout << "Sprajty" << endl;
           
            for( itSprajtMap = SprajtMap.begin(); itSprajtMap != SprajtMap.end(); itSprajtMap++ )
            if( itSprajtMap != SprajtMap.end() )
                 cout << "SprajtMap - " <<( * itSprajtMap ).first << endl;
           
        }
        else
             cout << "Brak jakiegokolwiek sprite'a" << endl;
       
    }
   
};

class Coords
    : public Sprite
{
protected:
    map < string, Coordinate > CoordsMap;
public:
    Coords()
    {
    }
    void DrawAll( sf::RenderWindow * window );
    void AddCoordSprite( string Name )
    {
        for( itSprajtMap = SprajtMap.begin(); itSprajtMap != SprajtMap.end(); itSprajtMap++ )
        {
            if( Name ==( * itSprajtMap ).first )
            {
               
                double dx =( * SprajtMap.find( Name ) ).second.GetPosition().x;
                double dy =( * SprajtMap.find( Name ) ).second.GetPosition().y;
                double dw =( * ImageMap.find( Name ) ).second.GetWidth();
                double dh =( * ImageMap.find( Name ) ).second.GetHeight();
                CoordsMap[ Name ] = Coordinate( dx, dy, dw, dh );
               
            }
           
        }
       
    }
   
};


#endif
game.cpp
C/C++
#include "head.h"

void Coords::DrawAll( sf::RenderWindow * okno )
{
    int map[ 14 ][ 20 ] =
    {
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // 1
        { 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1 }, // 2
        { 1, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1 }, // 3
        { 1, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 3, 3, 2, 3, 3, 3, 3, 3, 1 }, // 4
        { 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 3, 1 }, // 5
        { 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1 }, // 6
        { 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1 }, // 7
        { 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1 }, // 8
        { 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1 }, // 9
        { 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 3, 1 }, // 10
        { 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 1 }, // 11
        { 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 1 }, // 12
        { 1, 4, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1 }, // 13
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // 14
    };
   
    int y_map = 14;
    int x_map = 20;
    sf::Event Event;
   
    Sprite * SprajtyP = new Sprite;
   
    SprajtyP->AddImage( "platfa.png" ); // Dodawanie nowych obrazów i spritów
    SprajtyP->AddNameSprite( "platfa", "platfa.png" );
   
    SprajtyP->AddImage( "kamien1.png" );
    SprajtyP->AddNameSprite( "kamien", "kamien1.png" );
   
    SprajtyP->AddImage( "ludz1.png" );
    SprajtyP->AddNameSprite( "hero", "ludz1.png" );
   
    SprajtyP->ListOfImage();
    SprajtyP->ListSprajtIm();
   
    sf::String text;
    text.SetText( "Skok" );
    text.SetPosition( 400, 50 );
   
    sf::Sprite & Boh =( * SprajtyP->SprajtMap.find( "Boh" ) ).second;
    sf::Image & BohImg =( * SprajtyP->ImageMap.find( "ludz1.png" ) ).second;
    BohImg.CreateMaskFromColor( sf::Color::Black, 0 );
    Boh.SetCenter( BohImg.GetWidth() / 2.0f, BohImg.GetHeight() / 2.0f );
    sf::Sprite & platfa =( * SprajtyP->SprajtMap.find( "platfa" ) ).second;
    sf::Sprite & kamien =( * SprajtyP->SprajtMap.find( "kamien" ) ).second;
    sf::Image & ziemiaI =( * SprajtyP->ImageMap.find( "platfa.png" ) ).second;
   
    int klatka = 0;
    short int szerokosc_kafel_1 = ziemiaI.GetWidth();
    short int dlugosc_kafel_1 = ziemiaI.GetHeight();
   
    double a = 800; // wartość przyspieszenia ziemskiego m/s^2
    double v = 0; // prędkość początkowa
    double dt = 0; //inicjalizacja czasu jednej klatki
   
    double vx = 0; // inicjalizacja zmiennej prędkości w trakcie ruchu
    double ax = 1000; // przyspieszenie obiektu m/s^2
    double vx_max = 350; // prędkość maksymalna
    bool jump = true;
   
    for( int y = 0; y < y_map; y++ )
    {
        for( int x = 0; x < x_map; x++ )
        {
            if( map[ y ][ x ] == 4 )
            {
                Boh.SetPosition( x * szerokosc_kafel_1 + BohImg.GetWidth() / 2.0f, y * dlugosc_kafel_1 );
            }
        }
    }
   
    while( okno->IsOpened() )
    {
        for( int y = 0; y < y_map; y++ )
        {
            for( int x = 0; x < x_map; x++ )
            {
                if( map[ y ][ x ] == 2 )
                {
                    platfa.SetPosition( x * szerokosc_kafel_1, y * dlugosc_kafel_1 );
                    okno->Draw( platfa );
                }
                if( map[ y ][ x ] == 1 )
                {
                    kamien.SetPosition( x * szerokosc_kafel_1, y * dlugosc_kafel_1 );
                    okno->Draw( kamien );
                }
            }
        }
       
       
       
        bool stand;
       
        const sf::Input & Input = okno->GetInput();
       
        bool left = Input.IsKeyDown( sf::Key::Left );
        bool right = Input.IsKeyDown( sf::Key::Right );
        bool up = Input.IsKeyDown( sf::Key::Up );
        bool down = Input.IsKeyDown( sf::Key::Down );
        if( !left && !right && !up && !down )
             stand = true;
        else
             stand = false;
       
        dt = double( okno->GetFrameTime() );
       
        if( klatka <= 30 )
        {
            if( klatka < 15 )
           
                 Boh.SetSubRect( sf::IntRect( 0, 0, 40, 40 ) );
           
            else
                 Boh.SetSubRect( sf::IntRect( 0, 40, 40, 80 ) );
           
            klatka++;
        }
        else
             klatka = 0;
       
        v += a * dt;
       
        if( left )
        {
            if( vx - ax * dt > - vx_max )
                 vx -= ax * dt;
           
        }
        else if( right )
        {
            if( vx + ax * dt < vx_max )
                 vx += ax * dt;
           
        }
       
       
       
        else
        {
            if( jump )
            {
                if( vx > 0 )
                     vx -= ax * dt / 10;
               
                if( vx < 0 )
                     vx += ax * dt / 10;
               
                if( Boh.GetPosition().y < 400 )
                     v -= v * dt / 2;
               
                if( v <= - 55000 * dt )
                     v = - 55000 * dt;
               
            }
            else
            {
                if( vx > 0 )
                     vx -= ax * dt / 2;
               
                if( vx < 0 )
                     vx += ax * dt / 2;
               
            }
            if( vx <= vx_max / 10 && vx >= 0 )
                 vx = 0;
           
            if( vx >= - vx_max / 10 && vx <= 0 )
                 vx = 0;
           
        }
       
        Boh.Move( vx * dt, v * dt );
       
       
        if( Boh.GetPosition().y >= 400 )
        {
            Boh.SetY( 400 );
            jump = false;
        }
        else
             jump = true;
       
        if( Boh.GetPosition().y <= 0 )
             Boh.SetY( 0 );
       
        if( Boh.GetPosition().x <= 0 )
             Boh.SetX( 0 );
       
        if( Boh.GetPosition().x >= 750 )
             Boh.SetX( 750 );
       
        if( jump )
             okno->Draw( text );
       
        while( okno->GetEvent( Event ) )
        {
            if( Event.Type == sf::Event::Closed )
                 okno->Close();
           
            if(( Event.Type == sf::Event::KeyPressed ) &&( Event.Key.Code == sf::Key::Escape ) )
                 okno->Close();
           
            if( up && !jump )
                 v -= 55000 * dt;
           
        }
       
       
        okno->Draw( Boh );
        okno->Display();
        okno->Clear();
    }
}
P-40739
malan
» 2011-09-10 22:33:25
Co Ci powiedział Debugger?
P-40764
Dark
Temat założony przez niniejszego użytkownika
» 2011-09-11 21:00:08
tylko coś takiego w wielu miejscach co nie przeszkadza raczej w niczym
head.h(115): warning C4244: 'argument' : conversion from 'double' to 'int', possible loss of data
game.cpp(54): warning C4244: 'initializing' : conversion from 'unsigned int' to 'short', possible loss of data
a dokładnie to wyskakuje:
http://zapisz.net/view.php?filename=303_przechwytywanie.jpg
P-40825
akwes
» 2011-09-11 21:17:40
To mówi Compilator. Zapytaj Debuggera.
P-40827
Dark
Temat założony przez niniejszego użytkownika
» 2011-09-11 21:29:08
The thread 'Win32 Thread' (0xf84) has exited with code -1073741510 (0xc000013a).
The thread 'Win32 Thread' (0x574) has exited with code -1073741510 (0xc000013a).
The thread 'Win32 Thread' (0x10bc) has exited with code -1073741510 (0xc000013a).
The program '[4548] Project_B.exe: Native' has exited with code -1073741510 (0xc000013a).

Mam wrażenie, że coś jest źle w pliku game.cpp tylko nie wiem co takiego, żadnego błędu. Pewnie gdzieś wychodzę za rozmiar mapy.
P-40828
malan
» 2011-09-11 22:39:08
Pomieszałeś coś z std::map - to jest pewne. Postaw jakiś breakpoint na początku programu i śledź każdą linijkę - tym sposobem zobaczysz gdzie się wywala.
P-40833
Dark
Temat założony przez niniejszego użytkownika
» 2011-09-12 12:43:14
tylko, że mi nigdzie nie wywala errorów z breakpointami, tylko gdy okno się wyświetla jest błąd
P-40839
malan
» 2011-09-12 13:10:29
Wrzuć gdzieś cały projekt (razem z obrazkami).
P-40841
« 1 » 2 3
  Strona 1 z 3 Następna strona