SDL Program Ain't Respond !

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include "SDL.h"
#include <iostream>
#include <string>
using namespace std;

SDL_Surface *load_image( std::string filename );
void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination );

int main( int argc, char* args[] )
{
	//The attributes of the screen
	const int SCREEN_WIDTH = 640;
	const int SCREEN_HEIGHT = 480;
	const int SCREEN_BPP = 32;

	//The surfaces that will be used
	SDL_Surface* background = NULL;
	SDL_Surface* message = NULL;
	SDL_Surface* screen = NULL;

	//Start SDL
	if(SDL_Init(SDL_INIT_EVERYTHING) == -1)
	{
		cout << "Initialization Failed !" << endl;
		return 1;
	}else{
		cout << "Initialization Succeeded !" << endl;
	}

	//Set up the screen
	screen = SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,SDL_SWSURFACE);

	//If there was an error in setting up the screen
	if(screen == NULL)
	{
		return 1;
	}

	//Set the window caption
	SDL_WM_SetCaption("Hello World",NULL);

	//Load the image
	message = load_image("hello.bmp");
	background = load_image("background.bmp");
	
	//Apply the background to the screen
	apply_surface(0,0,background,screen);
	apply_surface( 320, 0, background, screen );
	apply_surface( 0, 240, background, screen );
	apply_surface( 320, 240, background, screen );

	//Apply the message to screen
	apply_surface(180,140,message,screen);

	//Update the screen
	if(SDL_Flip(screen) == -1)
	{
		return 1;
	}

	//Wait 2 seconds
	SDL_Delay(12000);

	//Free the surface
	SDL_FreeSurface(message);
	SDL_FreeSurface(background);

	//Quit SDL
	SDL_Quit();

	//Return
	return 0;    
}

SDL_Surface *load_image( std::string filename )
{
	//Temporary storage for the image that's loaded
	SDL_Surface* loadedImage = NULL;

	//The optimized image that will be used
	SDL_Surface* optimizedImage = NULL;

	//Load the image
	loadedImage = SDL_LoadBMP(filename.c_str());

	if(loadedImage != NULL)
	{
		//Create an optimized image
		optimizedImage = SDL_DisplayFormat(loadedImage);

		//Free the old image
		SDL_FreeSurface(loadedImage);
	}

	return optimizedImage;
}

void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination )
{
	//Make a temporary rectangle to hold the offsets
	SDL_Rect offset;

	//Give the offset to the triangle
	offset.x = x;
	offset.y = y;

	//Blit the surface
	SDL_BlitSurface(source,NULL,destination,&offset);
}


My code works,BUT doesn't allow me to do anything,after some sec it won't respond (Not responding after the Caption). Any reason for this.My guessing is that the delay sucks.
1
2
	//Wait 2 seconds
	SDL_Delay(12000);

This will wait for 12 seconds and not 2.
Of course,but what led to the not responding thing ? I set to 2 then felt too short,forgot to edit comments.
When you say not responding, do you mean that the program doesn't close down after SDL_Delay has waited the (1)2 seconds?
Of course,but what led to the not responding thing ?


Your program is not responding because it's not responding. Responding involves checking your event queue and processing incoming events. You are not doing that. Instead you just let the events pile up. Windows sees this and thinks your program is hanged.


Look at SDL's event messaging system (SDL_Event and SDL_PeekEvent I think)
It just shows the picture,does nothing else...

Maybe when I click it ,it cannot handle the mouse clicking,right ? Because I didn't set windows procedure to handle the event.

But now when I use int main( int argc, char* args[] ) not WinMain(),I couldn't make WindowProcedure() or anything like that.
Yes,I'll take a look at SDL_Event, It might have solution for event handling.
Topic archived. No new replies allowed.