Wiedermal SDL =b



  • 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.



  • und jedesmal den thread killen wenn eine andere richtung gewählt wird?

    Nimm ein bisschen Abstand und lies dir diesen Satz nochmal durch. Kommt dir diese Vorgehensweise nicht selbst unglaublich abwegig vor?



  • 1. wieso kein thread? die beiden abläufe sind ja von einander abhängig, sollen
    aber neben einander [hier war edit, hab mich verschrieben xD] ablaufen. denn
    der pacman läuft ja weiter. nicht das ich für jeden schritt eine taste
    drücken muss oder gedrückt halten muss!

    2. meine idee war ja so: ein thread überprüft in einer endlos-schleife die
    eingabe und verändert je nach dem die den index. index desswegen, weil ich
    für die bewegung (sie ist animiert) 8 bilder habe. sprich mund auf, mund zu!
    und die bilder sind in einem array gespeichert:

    SDL_Surface *image[IMG];
    

    Der index gibt an was für ein bild geladen werden muss.
    Da der PacMan durchläuft sprich immer in eine richtung geht bis eine andere
    Richtung vorgegeben ist (oder er am rand anstößt), läuft das im main().

    3. meine andere überlegung war so, dass ich das einlesen im main() mache und den
    index global mache. sprich: index wird im main() verändert und der thread der
    den pacman ausgibt liest dann index und reagiert darauf.

    wieso für mich dabei threads in frage kommen bzw. wieso ich mir die überlegung
    gemacht habe ist simpel: das programm soll flüssiger werden und weiterlaufen,
    wenn ich zum beispiel das fenster verschiebe... wenn ich nämlich jetzt im moment
    das fenster verschiebe, bleibt das programm stehen, bis ich das fenster mit dem
    mauszeiger losgelassen habe...

    falls es da andere lösungen gibt, dann wären KONKRETE antworten wirklich hilfreich. keine lösungen, beispiele für techniken (es sollte in C möglich sein,
    nicht in C++) die mich auf einen grünen zweig bringen und nicht einzeilige sätze
    in denen steht: kein thread!, denn dies hilft mir nicht viel. würde ich keine
    hilfe benötigen, wär ich nicht hier!

    gruß
    ITEDVO



  • mir sind von meinen testern für mein spiel mehrmals gemeldet worden, dass sich
    das spiel nach einigen minuten aufhängt bzw. abstürzt. einer der tester war nun
    so gescheit und hat mir folgendes gesendet:

    Problemsignatur:
      Problemereignisname:	AppHangB1
      Anwendungsname:	PacMan.exe
      Anwendungsversion:	0.0.0.0
      Anwendungszeitstempel:	4d2ae9b7
      Absturzsignatur:	9213
      Absturztyp:	0
      Betriebsystemversion:	6.1.7600.2.0.0.256.1
      Gebietsschema-ID:	3079
      Zusätzliche Absturzsignatur 1:	9213ecc02d09c917ead5fd37705844dd
      Zusätzliche Absturzsignatur 2:	4f80
      Zusätzliche Absturzsignatur 3:	4f80372cd370e6685dd8ab0be6c046c0
      Zusätzliche Absturzsignatur 4:	9213
      Zusätzliche Absturzsignatur 5:	9213ecc02d09c917ead5fd37705844dd
      Zusätzliche Absturzsignatur 6:	4f80
      Zusätzliche Absturzsignatur 7:	4f80372cd370e6685dd8ab0be6c046c0
    

    ich kann damit aber nichts anfangen (source-code ohne threads, siehe oben)...

    kann ein surface überladen werden? oder ähnliches? wäre dankbar über hilfe bzw. wenn mir wer erkennt was das jetzt genau heisst...

    gruß
    ITEDVO



  • es will und kann mir also keiner helfen, naja... dann such ich mir halt für dieses thema ein anderes forum...


Anmelden zum Antworten