Wiedermal SDL =b



  • Guten Morgen!

    Ich sitze gerade in Religion fest und mir ist langweilig. Daher packe ich die Möglichkeit gleich beim Schopf und stelle die Frage, die mir seit einigen Wochen auf der Zunge liegt, hier im Forum.

    Ich arbeite gerade das Tutorial von SDL durch, so weit so gut nur frag ich mich jetzt wie ich den Bilschirm löschen (also alles leer (grundfarbe schwarz)) kann...

    ich hab versucht:

    SDL_Surface *screen;
    SDL_Surface *screen2;
    
    screen = SDL_SetVideoMode(280, 206, 16, SDL_DOUBLEBUF | SDL_FULLSCREEN);
    screen2=screen;
    
    while(!exitkey)
    {
    
      drawText(screen, font, "Beispieltext",15,21, rot+=10, green-=20, blau++);
      SDL_Delay(200);	
      SDL_Flip(screen);
    
      while(SDL_PollEvent(&event))
      {
    	switch(event.type)
    	{
    	    case SDL_QUIT:
    	    printf("Quit Event erhalten\n");
    	    exitkey = 1;
    	    break;
    	    case SDL_KEYDOWN:
    		switch(event.key.keysym.sym)
    		    {
    			case SDLK_SPACE:
    			    exitkey = 1;
    			    break;
    			case SDLK_RETURN:
                                   SDL_Flip(screen2); 
    			    SDL_Delay(2000);
    			    default:
    			    break;
    		    }
    
    		    default:
    			break;
    	   }
         }
    }
    

    das will aber nich ganz funktionieren... teile des bildschirmes bleiben erhalten...

    was gibt es sonst für möglichkeiten?

    gruß
    ITEDVO



  • SDL_FillRect( SDL_GetVideoSurface(), NULL, 0 );

    Ersetze 0 mit einer beliebigen Kombination von SDL_MapRGB (SDL_GetVideoSurface () -> Format, r, g, b) für verschiedene Farben.

    Ersetze NULL mit der Adresse einer SDL_Rect Struktur, um auszuwählen wie viel von der Oberfläche zu füllen ist.
    NULL bedeutet "fülle die gesamte Fläche".

    Gruss Sheldor



  • thx für die schnelle antwort...

    habs gleich ausprobiert, doch das eingefügte bild ist nun überschrieben, doch der Text bleibt... wieso?



  • Ich weiß, du bist jetzt schon mitten im SDL lernen, aber wenn du C++ benutzt muss ich dir raten: Benutz' SFML.

    www.sfml-dev.org !



  • itedvo schrieb:

    thx für die schnelle antwort...

    habs gleich ausprobiert, doch das eingefügte bild ist nun überschrieben, doch der Text bleibt... wieso?

    Zeig den Codeauschnitt mit dem du den Bildschirm löscht.

    gruss



  • hab den fehler schon gefunden... ich hab vergessen nach dem SDL_FilRect(); ein SDL_Flip(screen); zu machen... da wurde der bildschirm erst nach dem nächsten Flip aktualisiert. gelöscht wurde davor zwar schon, doch wurde wieder etwas neues geschrieben. logisch das es nicht funktionierte =b

    aber eine andere frage... ich hab ja die funktion

    drawText(screen, font, "Beispieltext",15,21, rot+=10, green-=20, blau++);
    

    wenn ich jetzt nur diesen bereich, also ein SDL_Rect welches die Schrift beinhaltet, löschen möchte, wie komme ich zu diesem bereich. bei bildern ist das ja kein problem, da ja die ganzen infos in einem SDL_Surface gespeichert sind.

    die funktion selber:

    void drawText(SDL_Surface* screen, TTF_Font* font, char* string,
    			int x, int y, int fR, int fG, int fB)
    {
    	SDL_Color color = { fR, fG, fB };
    
    	SDL_Surface* textSurface =  TTF_RenderText_Blended(font, string, color);
    
    	SDL_Rect textLocation = { x, y, 0, 0 };
    
    	SDL_BlitSurface(textSurface, NULL, screen, &textLocation);
    	SDL_FreeSurface(textSurface);
    }
    

    Der Anfangswert ist durch x und y gegeben, aber nicht das ende. und je nach auflösung/schriftgröße ist es ja unterschiedlich wie lange der text ist.

    gruß
    ITEDVO



  • Du willst einen bestimmten Bereich löschen ?

    int SDL_FillRect(SDL_Surface* dst, const SDL_Rect* rect, Uint32 color)
    

    Gruss Sheldor



  • ah... ja stimmt... ich dödl... xD
    der text ist ja in einem sourface gespeichert xD

    jetzt hab ich aber ein anderes problem -.-

    SDL_Surface *screen;
    	SDL_Surface *image;
    	SDL_Rect drect;
    	SDL_Rect srect;
    	short x, y=20;
    
    	if(SDL_Init(SDL_INIT_VIDEO) < 0 )
    		exit(1);
    
    	screen = SDL_SetVideoMode(800, 600, 16, SDL_DOUBLEBUF | SDL_SWSURFACE);
    	if(screen == NULL)
    		exit(1);
    
    	image = IMG_Load("test.bmp");
    
    	if(image == NULL){
    		system("echo Konnte Bild nicht laden!");
    		exit(1);
    	}
    
    	srect.w = image->w;
    	srect.h = image->h;
    	srect.x = 1;
    	srect.y = 1;
    	drect.x = 1;
    	drect.y = 10;
    	drect.h = image->h;
    	drect.w = image->w;
    
    	SDL_BlitSurface(image,&srect,screen,&drect); // hier gehts...
    	SDL_Flip(screen);
    
    	for(x=1; x<=201; x+=10){
    		SDL_FillRect(screen,NULL,0);
    		SDL_UpdateRects(screen,1,NULL);
    		drect.x = drect.x+1;
     		SDL_BlitSurface(image,&srect,screen,&drect); // gibt fehler aus
    /*
    First-chance exception at 0x68134a9a in bild_bewegen.exe: 0xC0000005: Access violation reading location 0x00000002.
    Unhandled exception at 0x68134a9a in bild_bewegen.exe: 0xC0000005: Access violation reading location 0x00000002.
    The program '[2624] bild_bewegen.exe: Native' has exited with code -1073741819 (0xc0000005).
    */
    		SDL_UpdateRects(screen,1,&drect);
    		SDL_Delay(200);
    	}
    
    	SDL_Delay(2000);
    
    	SDL_Quit();
    
    	return 0;
    

    wieso gibt er mir ausserhalb der schleife keinen fehler aus und in der schleife schon?

    thx jetzt schon für antwort, ihr seit super =b



  • weiß hier keiner ne antwort? schade...



  • ok, bin selber auf ne lösung gekommen, wenn ich aber auch noch immer nicht verstehe wieso... würde es aber gerne verstehen... aber das kann warten.

    ich habe jetzt ein kleines programm geschrieben welches einem erlaubt einen übergroßen pacman über das fenster nach unten, oben, rechts oder links zu steuern. funktioniert auch ganz gut...

    nur: wenn ich auf der taste oben bleibe bewegt er sich nicht so lange wie die taste gedrückt wird. wie kann ich dies erreichen? hier der source-code:

    // bild_bewegen.cpp : Defines the entry point for the application.
    //
    
    #include "stdafx.h"
    #include "bewege_animation.h"
    #include <time.h>
    #include <SDL.h>
    #include <SDL_ttf.h>
    #include <SDL_image.h>
    
    #pragma comment (lib,"sdl.lib")
    #pragma comment (lib,"sdl_image.lib")
    #pragma comment (lib,"sdl_ttf.lib")
    
    // Global Variables:
    HINSTANCE hInst;								// current instance
    
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    	SDL_Surface *screen;
    	SDL_Surface *image, *image2;
    	SDL_Rect drect;
    	SDL_Rect srect;
    	SDL_Event event;
    	int x=25,y=25;
    	int exitkey=0;
    	int i=0, j=0;
    	struct tm* lzeit;
    	time_t zeit;
    	Uint8 *keys;
    
    	time(&zeit);
    
    	srand(time(NULL));
    
    	FILE* error;
    
    	error=fopen("log/error.txt","a+");
    
    	lzeit = localtime(&zeit);
    
    	fprintf(error,"Log um %d:%d:%d am %d.%d.%d\n", lzeit->tm_hour, lzeit->tm_min, lzeit->tm_sec, lzeit->tm_mday, lzeit->tm_mon, lzeit->tm_year+1900);
    
    	fprintf(error,"SDL_INIT: ");
    	if(SDL_Init(SDL_INIT_VIDEO) < 0 ){
    		fprintf(error,"%s\n",SDL_GetError());
    		exit(1);
    	}
    	else
    		fprintf(error,"OK!\n");
    
    	fprintf(error,"SDL_SetVideoMode: ");
    	screen = SDL_SetVideoMode(800, 600, 24, SDL_DOUBLEBUF | SDL_HWSURFACE);
    	if(screen == NULL){
    		fprintf(error,"%s\n",IMG_GetError());
    		exit(1);
    	}
    	else
    		fprintf(error,"OK!\n");
    
    	SDL_WM_SetCaption("PacMan", NULL);
    	SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
    
    	IMG_Init(IMG_INIT_JPG);
    	// image = IMG_Load("dragonball_z.jpg");
    	image = IMG_LoadTyped_RW(SDL_RWFromFile("images/PacMan1.jpg", "rb"), 1, "JPG");
    	image2 = IMG_LoadTyped_RW(SDL_RWFromFile("images/PacMan2.jpg", "rb"), 1, "JPG");
    
    	fprintf(error,"IMG_Load1: ");
    	if(image == NULL){
    		fprintf(error,"%s\n",IMG_GetError());
    		exit(1);
    	}
    	else
    		fprintf(error,"OK!\n");
    
    	fprintf(error,"IMG_Load2: ");
    	if(image2 == NULL){
    		fprintf(error,"%s\n\n\n",IMG_GetError());
    		exit(1);
    	}
    	else
    		fprintf(error,"OK!\n\n\n");
    
    	srect.w = image->w/2 - image->w/9;
    	srect.h = image->h - image->h/3;
    	srect.x = 1;
    	srect.y = 1;
    	drect.x = 25;
    	drect.y = 25;
    	drect.h = image->h - image->h/3;
    	drect.w = image->w/2 - image->w/9;
    	SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, 6, 6, 4)); // transperenz setzen
    	SDL_SetColorKey(image2, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, 6, 6, 6)); // transperenz setzen
    
    	while(exitkey!=1)
    	{
    		while(SDL_PollEvent(&event))
    		{
    			switch(event.type)
    			{
    				case SDL_QUIT:
    					printf("Quit Event erhalten\n");
    					exitkey = 1;
    					break;
    				case SDL_KEYDOWN:
    					keys = SDL_GetKeyState(NULL);
    					if (keys[SDLK_UP]) {
    						if (y > 10) {
    						    y-=10;
    							j++;
    				        }
    					}
    					if (keys[SDLK_DOWN]) {
    						y+=10;
    						j++;
    			        }
    					if (keys[SDLK_RIGHT]) {
    						x+=10;
    						j++;
    				    }
    			        if (keys[SDLK_LEFT]) {
    						if (x > 10) {
    			                x-=10;
    							j++;
    					    }
    					}
    
    			}
    		}
    
    		SDL_FillRect(screen, &drect, SDL_MapRGB(screen->format, 255, 255, 255));
    		drect.x=x;
    		drect.y=y;
    		if(j%2==0)
     			SDL_BlitSurface(image,&srect,screen,&drect);
    		else
    			SDL_BlitSurface(image2,&srect,screen,&drect);
    		SDL_Flip(screen);
    	}
    
    	SDL_FreeSurface(image);
    
    	SDL_Quit();
    
    	fclose(error);
    
    	return 0;
    }
    

    wer mal sehen will wie das aussieht: PN an mich, dann sende ich euch programm zu.

    gruß
    ITEDVO



  • SDL_EnableKeyRepeat (int delay, int intervall);
    

    intervall ist die Zeit zwischen zwei zu erzeugenden Tastaturevents bei gehaltener Taste.

    Gruss Sheldor



  • ah, danke... PacMan ich komme =b wenn ich fertig bin (kann etwas dauern, weihnachtszeit ist glühweinzeit xD) poste ich den code hier rauf =b



  • ok, ich steck wo fest... ist zwar nicht wirklich ein problem das mich das programm nicht fertigstellen lässt, aber dennoch wäre es für die übersicht besser...

    ich hab folgende funktion geschrieben:

    void init(FILE *error, SDL_Surface *screen){
    
    	fprintf(error,"SDL_INIT: ");
    	if(SDL_Init(SDL_INIT_VIDEO) < 0 ){
    		fprintf(error,"%s\n",SDL_GetError());
    		exit(1);
    	}
    	else
    		fprintf(error,"OK!\n");
    
    	screen = SDL_SetVideoMode(800, 600, 16, SDL_DOUBLEBUF | SDL_SWSURFACE);
    
    	fprintf(error,"SDL_SetVideoMode: ");
    	if(screen == NULL){
    		fprintf(error,"%s\n",IMG_GetError());
    		exit(1);
    	}
    	else
    		fprintf(error,"OK!\n");
    
    	IMG_Init(IMG_INIT_JPG);
    
    	SDL_WM_SetCaption("PacMan", NULL);
    	SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
    
    }
    

    danach hat aber screen keine werte bzw:

    CXX0030: Error: expression cannot be evaluated

    setze ich jedoch:

    screen = SDL_SetVideoMode(800, 600, 16, SDL_DOUBLEBUF | SDL_SWSURFACE);
    

    im main() funktionierts wie am schnürchen...

    ich vermute es hat was mit pointern zu tun, setze ich jedoch:

    void init(FILE *error, SDL_Surface **screen);
    

    gibts folgenden fehler:

    error C2227: left of '->format' must point to class/struct/union/generic type
    type is 'SDL_Surface **'

    was irgendwie klar ist... und jetzt der punkt an dem ich nich weiter weiß...

    wie mach ich das jetzt? also keine lösung wie: lass

    screen = SDL_SetVideoMode(800, 600, 16, SDL_DOUBLEBUF | SDL_SWSURFACE);
    

    im main()...

    gruß
    ITEDVO



  • Du übergibst einen Pointer auf einen Pointer auf einen SDL_Surface an deine Funktion, daher musst du bei der Zuweisung auch einmal dereferenzieren.

    *screen = SDL_SetVideoMode(800, 600, 16, SDL_DOUBLEBUF | SDL_SWSURFACE);
    

    Hoffe das hilft.



  • thank you =b als notlösung hab ichs im moment so gelöst:

    screen = init(error, screen);
    

    und die funktion daher auch angepasst:

    SDL_Surface* init(FILE *error, SDL_Surface *screen);
    

    werde morgen mal ausprobieren ob deine lösung stimmt. was schreib ich da, wird schon stimmen :xmas1:

    hatte gar nicht gesehen das geantwortet wurde, obwohl ich tagtäglich 5 mal reingeschaut hatte... was solls, is ja die benachrichtigung per e-mail gekommen xD

    ach ja, kennt wer ne kostenlose vollversion 2.-Lösung zu Advanced Installer der auch halbwegs gut funktioniert? Meine Programme immer nur per archivierung weiter zu geben find ich nich so toll und bis ich so weit bin selber eine installations-routine zu schreiben würde ich gerne ein tool dazu verwenden.

    wer was weiß: danke =B



  • hey ho...

    hab ein kleines problem mit den SDL_Threads... ich habs zwar schon für die console ausprobiert (dort hat es halbwegs gut funktioniert) doch wenn ich das jetzt für mein spiel übernehme funktionierts nich wirklich. sprich:

    ich habe einen thread erstellt, welcher in einer schleife einliesst was für eine taste gedrückt wurde... der wert der taste ist global damit ich sowohl vom main wie auch vom thread aus darauf zugreifen kann, denn: dieser thread bestimmt wann das programm geschlossen wird.

    jetzt liesst er mir aber nichts ein, sprich er holt mir kein event. kann mir einer sagen an was es liegt? hier mal der vorläufige source-code (bitte nicht schrecken, ist eine große Baustelle)...

    #include "stdafx.h"
    #include "PacMan.h"
    #include <time.h>
    #include <SDL.h>
    #include <SDL_ttf.h>
    #include <SDL_image.h>
    #include <sdl_thread.h>
    
    #pragma comment (lib,"sdl.lib")
    #pragma comment (lib,"sdl_image.lib")
    #pragma comment (lib,"sdl_ttf.lib")
    
    #define Right 0
    #define Up 2
    #define Left 4
    #define Down 6
    #define Punkt 8
    #define IMG 9
    #define START 1
    #define END -1
    #define MAX_P 5
    #define SPEED 20
    #define STOP 999
    
    int exitkey=0;
    int x=25,y=25;
    int index = 0;
    int j=0;
    
    int eingabe_thread(void *p);
    
    void load_images(SDL_Surface *image[], FILE *error);
    SDL_Surface* init(FILE *error, SDL_Surface *screen);
    void setLogTime(FILE *error, int mode);
    void Quit(SDL_Surface *image[], FILE *error);
    int prufRect(SDL_Rect rect[], int idx);
    void DrawPixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B);
    void drawText(SDL_Surface* screen, TTF_Font* font, char* string, int x, int y, int fR, int fG, int fB);
    void play_PacMan();
    
    // Global Variables:
    HINSTANCE hInst;								// current instance
    
    struct Kontrollpunkt{ 
    	int x; int y;
    } obj1;
    
    int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    {
    	SDL_Surface *screen;
    	SDL_Surface *image[IMG];
    	SDL_Rect drect;
    	SDL_Rect srect;
    	SDL_Rect sprect[MAX_P];
    	SDL_Rect prect[MAX_P];
    	int add=0;
    	int i=0, z=0;
    	TTF_Font *font = TTF_OpenFont("images/font/arial.ttf", 20);
    	FILE* error=fopen("log/error.txt","a+");
    	SDL_Thread *t_eingabe;
    
    	srand(time(NULL));
    
    	setLogTime(error, START);
    	screen = init(error, screen);
    	load_images(image,error);
    
    	srect.w = image[0]->w;
    	srect.h = image[0]->h;
    	srect.x = 1;
    	srect.y = 1;
    	drect.x = 25;
    	drect.y = 25;
    	drect.h = image[0]->h;
    	drect.w = image[0]->w;
    
    	for(i=0; i<MAX_P; i++){
    		prect[i].w = image[8]->w;
    		prect[i].h = image[8]->h;
    		prect[i].x = rand()%(800 - image[8]->w - 30) + 20;
    		prect[i].y = rand()%(600 - image[8]->h - 30) + 20;
    		sprect[i].w = image[8]->w;
    		sprect[i].h = image[8]->h;
    		sprect[i].x = 1;
    		sprect[i].y = 1;
    		if(prufRect(prect, i) < 0)
    			i--;
    	}
    
    	for(i=0; i<MAX_P; i++)
    		SDL_BlitSurface(image[8],&sprect[i], screen, &prect[i]);
    
    	for(i=0; i<IMG; i++)
    		SDL_SetColorKey(image[i], SDL_SRCCOLORKEY, SDL_MapRGB(image[i]->format, 255, 255, 255)); // transperenz setzen
    
    		t_eingabe = SDL_CreateThread(eingabe_thread,NULL);
    		while(exitkey != 1){
    		if(index != STOP){ 
    			SDL_FillRect(screen, &drect, SDL_MapRGB(screen->format, 255, 255, 255));
    
    		switch(index){
    			case Up:	
    				if(drect.y - 20 > 20){
    						y-=SPEED;
    						j++;
    						obj1.x = drect.x + drect.w/2;
    						obj1.y = drect.y;
    				}
    						break;
    			case Down:
    				if(drect.y + drect.h < 570){
    						y+=SPEED;
    						j++;
    						obj1.x = drect.x + drect.w/2;
    						obj1.y = drect.y + drect.h;
    				}
    						break;
    			case Right:
    				if(drect.x + drect.w < 778){
    						x+=SPEED;
    						j++;
    						obj1.x = drect.x + drect.w;
    						obj1.y = drect.y + drect.h/2;
    				}
    						break;
    			case Left:
    				if(drect.x > 20){
    						x-=SPEED;
    						j++;
    						obj1.x = drect.x;
    						obj1.y = drect.y + drect.h/2;
    				}
    						break;
    		}
    
    			drect.x=x;
    			drect.y=y;
    		}
    
    		for(i=0; i<MAX_P; i++){
    			if(obj1.x >= prect[i].x && obj1.x <= prect[i].x + prect[i].w && obj1.y >= prect[i].y && obj1.y <= prect[i].y + prect[i].h){
    				SDL_FillRect(screen, &prect[i], SDL_MapRGB(screen->format, 255, 255, 255));
    				for(z=0; z<1; z++){
    					prect[i].x=rand()%(800 - image[8]->w - 30) + 20;
    					prect[i].y=rand()%(600 - image[8]->h - 30) + 20;
    					if(prufRect(prect, i) < 0)
    						z=-1;
    				}
    				SDL_BlitSurface(image[8], &sprect[i], screen, &prect[i]);
    			}
    
    		}
    
    		if(index != STOP){
    			if(j%6==0)
     				add=0;
    			else
    				if(j%3==0)
    					add=1;
    			SDL_BlitSurface(image[index+add],&srect,screen,&drect);
    
    			SDL_Flip(screen);
    			SDL_Delay(100);
    		}
    		if(j==30000)
    			j=1;
    	}
    
    	SDL_KillThread(t_eingabe);
    
    	Quit(image,error);
    
    	return 0;
    }
    
    void load_images(SDL_Surface *image[], FILE *error){
    
    	int idx = 0;
    
    	for( ; idx < IMG; idx++){
    
    	switch(idx){
    		case 0:
    				image[idx] = IMG_LoadTyped_RW(SDL_RWFromFile("images/PacMan/PacMan_Right_1.jpg", "rb"), 1, "JPG");
    				break;
    		case 1:
    				image[idx] = IMG_LoadTyped_RW(SDL_RWFromFile("images/PacMan/PacMan_Right_2.jpg", "rb"), 1, "JPG");
    				break;
    		case 2: 
    				image[idx] = IMG_LoadTyped_RW(SDL_RWFromFile("images/PacMan/PacMan_Up_1.jpg", "rb"), 1, "JPG");
    				break;
    		case 3:
    				image[idx] = IMG_LoadTyped_RW(SDL_RWFromFile("images/PacMan/PacMan_Up_2.jpg", "rb"), 1, "JPG");
    				break;
    		case 4:
    				image[idx] = IMG_LoadTyped_RW(SDL_RWFromFile("images/PacMan/PacMan_Left_1.jpg", "rb"), 1, "JPG");
    				break;
    		case 5:
    				image[idx] = IMG_LoadTyped_RW(SDL_RWFromFile("images/PacMan/PacMan_Left_2.jpg", "rb"), 1, "JPG");
    				break;
    		case 6:
    				image[idx] = IMG_LoadTyped_RW(SDL_RWFromFile("images/PacMan/PacMan_Down_1.jpg", "rb"), 1, "JPG");
    				break;
    		case 7:
    				image[idx] = IMG_LoadTyped_RW(SDL_RWFromFile("images/PacMan/PacMan_Down_2.jpg", "rb"), 1, "JPG");
    				break;
    		case 8:
    				image[idx] = IMG_LoadTyped_RW(SDL_RWFromFile("images/Other/Punkt.jpg", "rb"), 1, "JPG");
    				break;
    	}
    
    	fprintf(error,"IMG_Load%d: ", idx+1);
    	if(image[idx] == NULL){
    		fprintf(error,"%s\n",IMG_GetError());
    		exit(1);
    	}
    	else
    		fprintf(error,"OK!\n");
    
    	}
    }
    
    SDL_Surface * init(FILE *error, SDL_Surface *screen){
    
    	int x=1, y=1;
    
    	fprintf(error,"SDL_INIT: ");
    	if(SDL_Init(SDL_INIT_VIDEO) < 0 ){
    		fprintf(error,"%s\n",SDL_GetError());
    		exit(1);
    	}
    	else
    		fprintf(error,"OK!\n");
    
    	screen = SDL_SetVideoMode(800, 600, 24, SDL_DOUBLEBUF | SDL_SWSURFACE);
    
    	SDL_ShowCursor(SDL_DISABLE);
    
    	fprintf(error,"SDL_SetVideoMode: ");
    	if(screen == NULL){
    		fprintf(error,"%s\n",IMG_GetError());
    		exit(1);
    	}
    	else
    		fprintf(error,"OK!\n");
    
    	IMG_Init(IMG_INIT_JPG);
    
    	SDL_WM_SetCaption("PacMan", NULL);
    	SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
    	SDL_EnableKeyRepeat (200, 100);
    
    	for( ; x<800-4; x++){
    		DrawPixel(screen, x, y, 105, 159, 175);
    		DrawPixel(screen, x, y+600-5, 105, 159, 175);
    	}
    	x=1;
    	for( ; y < 600-4; y++){
    		DrawPixel(screen, x, y, 105, 159, 175);
    		DrawPixel(screen, x+800-5, y, 105, 159, 175);
    	}	
    	y=3;
    	for( ; x<800-6; x++){
    		DrawPixel(screen, x, y, 105, 159, 175);
    		DrawPixel(screen, x, y+600-9, 105, 159, 175);
    	}
    	x=3;
    	for( ; y < 600-6; y++){
    		DrawPixel(screen, x, y, 105, 159, 175);
    		DrawPixel(screen, x+800-9, y, 105, 159, 175);
    	}
    
    	return screen;
    
    }
    void setLogTime(FILE *error, int mode){
    
    	struct tm* lzeit;
    	time_t zeit;
    
    	time(&zeit);
    
    	lzeit = localtime(&zeit);
    
    	if(mode == START)
    		fprintf(error,"Log um %d:%d:%d am %d.%d.%d\n", lzeit->tm_hour, lzeit->tm_min, lzeit->tm_sec, lzeit->tm_mday, lzeit->tm_mon, lzeit->tm_year+1900);
    	else
    		if(mode == END)
    			fprintf(error,"Log End um %d:%d:%d am %d.%d.%d\n\n\n", lzeit->tm_hour, lzeit->tm_min, lzeit->tm_sec, lzeit->tm_mday, lzeit->tm_mon, lzeit->tm_year+1900);
    		else
    			fprintf(error,"End of Log Failed! --> setLogTime(FILE *error, int mode) -> mode isn´t right value!\n\n\n");
    }
    
    void Quit(SDL_Surface *image[], FILE* error){
    
    	int i=0;
    
    	for( ; i<IMG; i++)
    		SDL_FreeSurface(image[i]);
    
    	setLogTime(error, END);
    
    	SDL_Quit();
    
    	fclose(error);
    
    }
    int prufRect(SDL_Rect rect[], int idx){
    
    	int i=0;
    
    	for( ; i<=idx; i++){
    		if(i != 0)
    			if(rect[i].x == rect[i-1].x || rect[i].y == rect[i-1].y)
    				return -1;
    	}
    
    	return 0;
    }
    
    void DrawPixel(SDL_Surface *screen, int x, int y,Uint8 R, Uint8 G,Uint8 B)
    {
        Uint32 color = SDL_MapRGB(screen->format, R, G, B);
    
        if ( SDL_MUSTLOCK(screen) )
        {
            if ( SDL_LockSurface(screen) < 0 ) {
                return;
            }
        }
    
        switch (screen->format->BytesPerPixel) {
            case 1: { /* vermutlich 8 Bit */
                Uint8 *bufp;
    
                bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
                *bufp = color;
            }
            break;
    
            case 2: { /* vermutlich 15 Bit oder 16 Bit */
                Uint16 *bufp;
    
                bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
                *bufp = color;
            }
            break;
    
            case 3: { /* langsamer 24-Bit-Modus, selten verwendet */
                Uint8 *bufp;
    
                bufp = (Uint8 *)screen->pixels + y*screen->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 *)screen->pixels + y*screen->pitch/4 + x;
                *bufp = color;
            }
            break;
        }
    
        if ( SDL_MUSTLOCK(screen) )
        {
            SDL_UnlockSurface(screen);
        }
    
    }
    void drawText(SDL_Surface* screen, TTF_Font* font, char* string, int x, int y, int fR, int fG, int fB)
    {
    	SDL_Color color = { fR, fG, fB };
    
    	SDL_Surface* textSurface =  TTF_RenderText_Blended(font, string, color);
    
    	SDL_Rect textLocation = { x, y, 0, 0 };
    
    	SDL_BlitSurface(textSurface, NULL, screen, &textLocation);
    	SDL_FreeSurface(textSurface);
    }
    
    int eingabe_thread(void *p){
    
    	SDL_Event event;
    	Uint8 *keys;
    
    	while(exitkey!=1)
    	{
    		while(SDL_PollEvent(&event))
    		{
    			switch(event.type)
    			{
    				case SDL_QUIT:
    					printf("Quit Event erhalten\n");
    					exitkey = 1;
    					break;
    				case SDL_KEYDOWN:
    					keys = SDL_GetKeyState(NULL);
    					if(j==0)
    						index=STOP;
    					else
    						if (keys[SDLK_UP]) {
    							if (y > 10)
    								index=Up;
    						}
    						else
    							if (keys[SDLK_DOWN]) {						
    								index=Down;
    							}
    							else
    								if (keys[SDLK_RIGHT]) {
    									index=Right;
    								}
    								else
    									if (keys[SDLK_LEFT]) {
    										if (x > 10) {
    											index=Left;
    										}
    									}
    									else
    										if (keys[SDLK_SPACE]) {
    											index = STOP;
    										}
    										else
    											if( keys[SDLK_RETURN]){
    												exitkey=1;
    											}
    
    			}
    		}
    	}
    
    	return 0;
    }
    

    danke jetzt schon mal für die hilfe...



  • Threads für Tastatureingaben ?



  • könntest du versuchen, das Problem auf < 200 Zeilen zu komprimieren? Dann schaut sich das vielleicht auch jemand an.



  • ja, zusammenfassung folgt heute oder morgen noch, komm irgendwie mit der zeit nich zurecht.

    hmm, sollte ich ev. die bewegung als thread machen? und jedesmal den thread killen wenn eine andere richtung gewählt wird?

    also ich mein das so:

    pacman bewegt sich, richtung muss eingelesen werden. lass ich alles in einem thread, dann bewegt er sich und bewegt er sich und reagiert nicht sofort bzw. es stockt. oder wenn ich richtungswechsel machen möchte bewegt er sich weiter in die vorherige richtung und kehrt erst dann um. ev. liegts an meiner überlegung. was wär jetzt besser?

    ein einlese-thread oder ein bewegungsthread?



  • kein Thread.


Anmelden zum Antworten