SDL: Probleme/Fehler mit Pixeln



  • Hallo,

    ich bin dabei einen "Raumschiff-Shooter" mit C++ und SDL zu realisieren. Habe mit dem Code eines Tutorials angefangen (ProjectE) und dann selbst weitergemacht.

    Jetzt bin ich dabei, den Gleiter mit Schüssen auszustatten, diese wollte ich mit einzelnen Pixeln darstellen.

    Von dieser Seite habe ich die DrawPixel-Funktion fast vollständig übernommen:

    // CParticle.cpp
    //...
    CParticle* MyParticle = 0;
    //...
    void CParticle::DrawPixel(int x, int y, Uint32 color)
    {
    	switch ( g_pBackSurface->format->BytesPerPixel) {
            case 1: { /* vermutlich 8 Bit */
                Uint8 *bufp;
    
                bufp = (Uint8 *)g_pBackSurface->pixels + y* g_pBackSurface->pitch + x;
                *bufp = color;
            }
            break;
    
            case 2: { /* vermutlich 15 Bit oder 16 Bit */
                Uint16 *bufp;
    
                bufp = (Uint16 *)g_pBackSurface->pixels + y* g_pBackSurface->pitch/2 + x;
                *bufp = color;
            }
            break;
    
            case 3: { /* langsamer 24-Bit-Modus, selten verwendet */
                Uint8 *bufp;
    
                bufp = (Uint8 *)g_pBackSurface->pixels + y* g_pBackSurface->pitch + x * 3;
                if(SDL_BYTEORDER == SDL_LIL_ENDIAN) {
                    bufp[0] = color;
                    bufp[1] = color >> 8;
                    bufp[2] = color >> 16;
                } else {
                    bufp[2] = color;
                    bufp[1] = color >> 8;
                    bufp[0] = color >> 16;
                }
            }
            break;
    
            case 4: { /* vermutlich 32 Bit */
                Uint32 *bufp;
    
                bufp = (Uint32 *) g_pBackSurface->pixels + y* g_pBackSurface->pitch/4 + x;
                *bufp = color;
            }
            break;
        }
    }
    //...
    
    // Glider.h
    //...
    class CGlider : public CEntity
    {
    public:
    	void Initialize( eIdentifier eMyIdentifier );
    	void Uninitialize();
    	void Draw();
    	void Idle( DWORD dwDeltaTime );
    
    private:
    	void Fire();
    	enum {
    		NUM_SHOTS = 40,
    		NUM_PIXEL = 5
    	};
    	struct TPixel {
    		float x;
    		float y;
    		bool v;
    	};
    	struct TShot {
    		TPixel m_Pixel[ NUM_PIXEL ];
    	};
    	TShot m_aclShots[ NUM_SHOTS ];
    	CResourceBMP* m_pSurface;
    };
    //...
    
    // Glider.cpp 
    //...
    extern SDL_Surface* g_pBackSurface;
    extern CParticle* MyParticle;
    //...
    
    void CGlider::Initialize( eIdentifier eMyIdentifier )
    {
    	//...
    
    	for( int i = 0; i < NUM_SHOTS; ++i)
    	{
    		for( int j = 0; j < NUM_PIXEL; ++j)
    		{
    			m_aclShots[ i ].m_Pixel[ j ].x = 0.0f;
    			m_aclShots[ i ].m_Pixel[ j ].y = 0.0f;
    			m_aclShots[ i ].m_Pixel[ j ].v = false;
    		}
    	}
    }
    
    void CGlider::Idle( DWORD dwDeltaTime )
    {
    	if( KEYBOARD->KeyDown( SDLK_LEFT ) && m_fX > -20.0 )
    	{
    		m_fX -= ( (float)dwDeltaTime / 3.0f );
    	}
    	if( KEYBOARD->KeyDown( SDLK_RIGHT ) && m_fX < 914 )
    	{
    		m_fX += ( (float)dwDeltaTime / 3.0f );
    	}
    	if( KEYBOARD->KeyDown( SDLK_SPACE ) )
    	{
    		Fire();
    	}
    
    	if( SDL_MUSTLOCK( g_pBackSurface) )
        {
            if( SDL_LockSurface( g_pBackSurface) < 0 ) {
               return;
            }
        }
    
    	for( int i = 0; i < NUM_SHOTS; ++i)
    	{
    		for( int j = 0; j < NUM_PIXEL; ++j)
    		{
    			m_aclShots[ i ].m_Pixel[ j ].y -= (float)dwDeltaTime / 3.0f;
    			if( m_aclShots[ i ].m_Pixel[ j ].y < 0.0f)
    				m_aclShots[ i ].m_Pixel[ j ].v = false;
    
    			if( m_aclShots[ i ].m_Pixel[ j ].v)
    				MyParticle->DrawPixel( m_aclShots[ i ].m_Pixel[ j ].x, m_aclShots[ i ].m_Pixel[ j ].y, SDL_MapRGB( g_pBackSurface->format, 60, 250, 10));
    		}
    	}
    
    	if ( SDL_MUSTLOCK( g_pBackSurface) )
        {
            SDL_UnlockSurface( g_pBackSurface);
        }
    }
    //...
    void CGlider::Fire()
    {
    	int i, j, a = 0;
    	for( i = 0; i < NUM_SHOTS; ++i)
    	{
    		for( j = 0; j < NUM_PIXEL; ++j)
    		{
    			if( !m_aclShots[ i ].m_Pixel[ j ].v)
    				++a;
    		}
    		if( a == NUM_PIXEL)
    			break;
    	}
    	if( i < NUM_SHOTS)
    	{
    		for( int j = 0; j < NUM_PIXEL; ++j)
    		{
    			m_aclShots[ i ].m_Pixel[ j ].x = m_fX + (m_usWidth /2);
    			m_aclShots[ i ].m_Pixel[ j ].y = m_fY + 20.0 +j;
    			m_aclShots[ i ].m_Pixel[ j ].v = true;
    		}
    	}
    }
    //...
    

    Wenn ich das ausführe, erhalte ich beim Beenden des Programms, eine Fehlermeldung: "Spiel.exe hat ein Problem festgestellt und muss beendet werden". 😞
    Erhöhe ich Anzahl der möglichen Schüsse (NUM_SHOTS), tritt dieser Fehler bereits beim Ausführen auf. Danach muss ich dann das Programm gewaltsam über den Taskmgr beenden, da es nicht mehr reagiert. 😕

    Ich verstehe nicht, wo der Fehler liegt. Habe schon versucht das Locken (22-27/42-45) an verschiedenen anderen Stellen einzusetzen - ohne Erfolg.
    Ich denke es liegt an diesen Zeilen, kann mir aber nicht weiterhelfen.

    EDIT: Also ich benutze Win XP (und SDL-1.2.13).
    Wenn ihr meint kann ich auch noch etwas mehr Code zeigen.
    Der Fehler muss allerdings mit dem Zeichnen der Pixel zusammenhängen, da er vorher nicht aufgetreten ist.

    EDIT 2: Warum antwortet keiner, kann mir keiner helfen, habe ich zu wenig Informationen gesagt oder will mir keiner sagen, was hier faul ist?
    Der Fehler kann eig nur in diesem Code sein (wenn es denn ein Programmierfehler ist). Bin ich zu doof ein paar Pixel auf den Screen zu kriegen (okay, zu sehen sind sie ja), oder was? Oder spinnt mein PC bzw. Windows?

    BITTE, ICH BRAUCHE EURE HILFE!

    MfG
    XCoder++


Log in to reply