problem mit sdl animation



  • ich habe folgenden code:

    er soll auf tastendruck(pfeiltaste oben) erst ein bild auf den bildschrim malen, das klappt. wenn an die taste ein zweites mal drückt, soll es in die nächste animationsphase gehen. im code sieht das so aus, dass ich den bildauscchnit der bitmap, in der das bild gespeichert ist, einfach um 80 pixel nach rechts verschiebe(jedes animationsfeld ist 80x80 groß).

    Wenn ich ein zweites mal die taste drücke malt es auch das bild etwas versetzt auf den bildschirm, jedoch das gleiche und nicht das der nächsten animationsphase.

    btw: bevor mich jetz tgleich einer flamed wie schlecht ich progge und wie unvollständig die klasse ist: ich mach die stück für stück und ist wohl grad bei so 1% fertigstellung

    hier der code:
    SDL_Sprite.h

    // SDL_Sprite.h
    #include "SDL.h"
    #include <string>
    using namespace std;
    const int ciSpriteWidth =79;
    const int ciSpriteHeight=79;
    class SDL_Animation
    {
    private:
    	int iAnimState;
    protected:
    		SDL_Surface *m_sprite, *m_target,*m_animTarget;
    		SDL_Rect dest;
    		SDL_Rect src;
    public:
    	SDL_Animation()
    	{
    		iAnimState=1;
    	}
    	void animWalk()
    	{
    		src.x=src.x+80;
    	}
    };
    class SDL_Sprite:public SDL_Animation  //Sprites
    {
    private:
    	SDL_Rect m_src;
    	SDL_Rect m_dest;
    public:
    	SDL_Sprite(SDL_Surface *target, SDL_Surface *newSurface)
    	{//target(i.e. screen), surface(i.e. "SDL_Surface testimage =SDL_LoadBMP(...),xpos,ypos
    		m_sprite = newSurface;
    		m_target = target;
    		m_src=src;
    		m_dest=dest;
    	};
    	SDL_Sprite();
    	void setImage()
    	{
    		m_src.x=0;
    		m_src.y=0;
    	}
    	void draw(int x, int y)
    	{
    		m_dest.x=x;
    		m_dest.y = y;
    		m_dest.w=79;
    		m_dest.h=79;
    		m_src.w=79;
    		m_src.h=79;
    		SDL_BlitSurface(m_sprite, &m_src, m_target, &m_dest);
    	}
    	void move(int x, int y);
    };
    

    main.cpp

    // main.cpp
    //LF XP Build 0001
    #ifdef WIN32
    #pragma comment(lib, "SDL.lib")
    #pragma comment(lib, "SDLmain.lib")
    #endif
    #include <stdlib.h>
    #include "SDL.h"
    #include <string>
    #include "SDL_Sprite.h"
    const int SCREEN_WIDTH = 800;
    const int SCREEN_HEIGHT = 600; // screen= Hingergrund, sGalaxy = galaxien.bmp
    
    int main(int argc, char **argv)
    {
    	SDL_Surface *screen; 
    	if(SDL_Init(SDL_INIT_VIDEO)<0)
    	{
    		printf("Error: Couldn initalize Video\n");
    		exit(1);
    	}
    	screen=SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT,32, SDL_DOUBLEBUF);
    	if(!screen)
    	{
    		printf("Error: No Screen found\n");
    		exit(1);
    	}
    
    	SDL_Surface *lol;
    	lol=SDL_LoadBMP("template1/0.bmp");
    	bool running=true; //Game continueing ? 8[ teh sucks
    	int state=0;
    	int bildpos=100;
    	while(running==true)
    	{
    		Uint8 *keys;
    		keys=SDL_GetKeyState(NULL);
    		int i=1;
    		int mouseX=0, mouseY=0;
    		SDL_GetMouseState(&mouseX,&mouseY);
    		SDL_Event event;
    		SDL_Sprite bild(screen,lol);
    		while(SDL_PollEvent(&event))
    		{
    			switch(event.type)
    			{
    			case SDL_QUIT: //teh quit sucks
    				running=false;
    				break;
    			case SDL_KEYDOWN: //Here keyboard input teh sucks
    				if(keys[SDLK_UP])
    				{
    					if(state==1)
    					{
    						bild.animWalk();
    						bildpos+=70;
    						bild.draw(bildpos,100);
    					}
    					else
    					{
    						bild.setImage();
    						bild.draw(bildpos,100);
    						state ++;
    					}
    				}
    				break;
    			case SDL_MOUSEMOTION: //everytime when mouse is moved, you can put conditions here
    				break;
    			}
    		}
    
    		SDL_Flip (screen);
    	}
    	atexit(SDL_Quit);
    	return 0;
    }
    


  • void draw(int x, int y)
        {
            m_dest.x=x;
            m_dest.y = y;
    

    mit dem entsprechenden draw aufruf sieht es doch genauso aus, wie du beschrieben hast.
    tip: debugger anschmeißen und schritt für schritt durchlaufen :xmas1:



  • ich komm einfach nicht auf den fehler so stressig...



  • Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Rund um die Programmierung in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Na, beim zweiten Aufruf muß dann ja m_src.x bzw. m_src.y += 79 (?) gemacht werden... 😕

    BTW: 1337-style Hacker-comments und dann noch Anfänger... 😉 :xmas1:



  • *g*


Anmelden zum Antworten