[SDL] Click Input & Rect Not Working Right
Jonathan Dearborn
grimfang4 at gmail.com
Wed Mar 10 21:06:44 PST 2010
At first glance, I find it odd that you're drawing inside your event loop.
If you could minimize the code a bit, it would make it easier.
Jonny D
On Wed, Mar 10, 2010 at 11:57 PM, GameCoder <g_andy at live.com> wrote:
> Hello All,
>
> I am having trouble. When I use the mouse event to click on a graphic rect,
> the event does not respond. When the user clicks on the graphics ball,
> points should be added, and the graphic should change to 'pop' graphic. I'll
> post my code to see if anyone know's what is up.
>
>
>
>
> Code:
>
>
> //Main h
> #include
> #include
> #include
> #include
> #include
> #include
> #include
> #include
>
> #include "SDL.h"
> #include "SDL_image.h"
> #include "SDL_mixer.h"
> #include "SDL_ttf.h"
>
> const int MAX_WIDTH = 640;
> const int MAX_HEIGHT = 480;
> const int MAX_DEPTH = 32;
> const char* szTitle = "Shoot Ball - DarkScar Games";
>
> const int MAX_FPS = 30;
>
> SDL_Surface* gScreen = NULL;
> SDL_Surface* gLogo = NULL;
> SDL_Surface* gTitle = NULL;
> SDL_Surface* gBackdrop = NULL;
>
> SDL_Rect LogoRect;
> SDL_Rect TitleRect;
> SDL_Rect BackdropRect;
>
> SDL_Surface* gBall[5];
> SDL_Rect BallRect[5];
>
> SDL_Event event;
>
> TTF_Font* Font = NULL;
>
> Uint8* keyState = SDL_GetKeyState(NULL);
>
> SDL_Color textColor = {255,255,0};
>
> Mix_Music* backMusic = NULL;
> Mix_Chunk* hit = NULL;
>
> const int Red_Ball = 500;
> const int Blue_Ball = 400;
> const int Purple_Ball = 300;
> const int Black_Ball = 200;
> const int Green_Ball = 100;
>
> const int Red_Points = 10;
> const int Blue_Points = 20;
> const int Purple_Points = 30;
> const int Black_Points = 40;
> const int Green_Points = 50;
>
> int ball_x[5];
> int ball_y[5];
> int ball_w[5];
> int ball_h[5];
>
> long unsigned int points = 0;
> unsigned int point_counter = 0;
>
> SDL_Surface* gCrosshair = NULL;
> SDL_Rect CrosshairRect;
>
> SDL_Surface* gPop = NULL;
> SDL_Rect PopRect;
>
> SDL_Surface* gPoints = NULL;
> SDL_Rect PointRect;
>
> SDL_Surface* gButton[2];
> SDL_Rect ButtonRect[2];
>
> int button_x[2];
> int button_y[2];
> int button_w[2];
> int button_h[2];
>
> int cross_x;
> int cross_y;
> int cross_w;
> int cross_h;
>
> int pop_x;
> int pop_y;
> int pop_w;
> int pop_h;
>
> int mx = 0;
> int my = 0;
>
> bool bLogo = true;
> bool bTitle = false;
> bool bGame = false;
>
> bool GameRunning = true;
>
> long lastick;
> int fpstickcounter;
> int fpscounter;
> int currentfps;
>
>
>
>
>
>
>
> Code:
>
>
> //Main.cpp
> #include "main.h"
>
> int main(int argc, char* argv[])
> {
>
> if(SDL_Init(SDL_INIT_EVERYTHING) == -1)
> {
> return 1;
> }
>
> gScreen = SDL_SetVideoMode(MAX_WIDTH,MAX_HEIGHT,MAX_DEPTH,SDL_HWSURFACE
> | SDL_DOUBLEBUF);
>
> SDL_WM_SetCaption(szTitle, NULL);
>
> gLogo = IMG_Load("Logo.png");
> LogoRect.x = 0;
> LogoRect.y = 0;
> LogoRect.w = MAX_WIDTH;
> LogoRect.h = MAX_HEIGHT;
>
> gTitle = IMG_Load("Title.png");
> TitleRect.x = 0;
> TitleRect.y = 0;
> TitleRect.w = MAX_WIDTH;
> TitleRect.h = MAX_HEIGHT;
>
> gBackdrop = IMG_Load("Backdrop.png");
> BackdropRect.x = 0;
> BackdropRect.y = 0;
> BackdropRect.w = MAX_WIDTH;
> BackdropRect.h = MAX_HEIGHT;
>
> cross_x = 320;
> cross_y = 180;
> cross_w = 64;
> cross_h = 64;
>
> gCrosshair = IMG_Load("Crosshair.png");
> CrosshairRect.x = cross_x;
> CrosshairRect.y = cross_y;
> CrosshairRect.w = cross_w;
> CrosshairRect.h = cross_h;
>
> srand((unsigned)time(0));
>
> ball_x[0] = 10;
> ball_y[0] = 10;
> ball_x[1] = 580;
> ball_y[1] = 10;
> ball_x[2] = 10;
> ball_y[2] = 430;
> ball_x[3] = 580;
> ball_y[3] = 430;
> ball_x[4] = 220;
> ball_y[4] = 100;
>
> ball_w[0] = 64;
> ball_h[0] = 64;
> ball_w[1] = 64;
> ball_h[1] = 64;
> ball_w[2] = 64;
> ball_h[2] = 64;
> ball_w[3] = 64;
> ball_h[3] = 64;
> ball_w[4] = 64;
> ball_h[4] = 64;
>
> gBall[0] = IMG_Load("RedBall.png");
> BallRect[0].x = ball_x[0];
> BallRect[0].y = ball_y[0];
> BallRect[0].w = ball_w[0];
> BallRect[0].h = ball_h[0];
>
> gBall[1] = IMG_Load("BlueBall.png");
> BallRect[1].x = ball_x[1];
> BallRect[1].y = ball_y[1];
> BallRect[1].w = ball_w[1];
> BallRect[1].h = ball_h[1];
>
> gBall[2] = IMG_Load("PurpleBall.png");
> BallRect[2].x = ball_x[2];
> BallRect[2].y = ball_y[2];
> BallRect[2].w = ball_w[2];
> BallRect[2].h = ball_h[2];
>
> gBall[3] = IMG_Load("BlackBall.png");
> BallRect[3].x = ball_x[3];
> BallRect[3].y = ball_y[3];
> BallRect[3].w = ball_w[3];
> BallRect[3].h = ball_h[3];
>
> gBall[4] = IMG_Load("GreenBall.png");
> BallRect[4].x = ball_x[4];
> BallRect[4].y = ball_y[4];
> BallRect[4].w = ball_w[4];
> BallRect[4].h = ball_h[4];
>
>
> SDL_SetColorKey(gBall[0],SDL_SRCCOLORKEY,SDL_MapRGB(gBall[0]->format,255,255,255));
>
> SDL_SetColorKey(gBall[1],SDL_SRCCOLORKEY,SDL_MapRGB(gBall[1]->format,255,255,255));
>
> SDL_SetColorKey(gBall[2],SDL_SRCCOLORKEY,SDL_MapRGB(gBall[2]->format,255,255,255));
>
> SDL_SetColorKey(gBall[3],SDL_SRCCOLORKEY,SDL_MapRGB(gBall[3]->format,255,255,255));
>
> SDL_SetColorKey(gBall[4],SDL_SRCCOLORKEY,SDL_MapRGB(gBall[4]->format,255,255,255));
>
> pop_x = 0;
> pop_y = 0;
> pop_w = 64;
> pop_h = 64;
>
> gPop = IMG_Load("Pop.png");
> PopRect.x = pop_x;
> PopRect.y = pop_y;
> PopRect.w = pop_w;
> PopRect.h = pop_h;
>
>
> SDL_SetColorKey(gPop,SDL_SRCCOLORKEY,SDL_MapRGB(gPop->format,255,255,255));
>
> button_x[0] = 210;
> button_x[1] = 210;
> button_y[0] = 150;
> button_y[1] = 200;
> button_w[0] = 200;
> button_h[0] = 30;
> button_w[1] = 200;
> button_h[1] = 30;
>
> gButton[0] = IMG_Load("NewGameButton.png");
> ButtonRect[0].x = button_x[0];
> ButtonRect[0].y = button_y[0];
> ButtonRect[0].w = button_w[0];
> ButtonRect[0].h = button_h[0];
>
> gButton[1] = IMG_Load("ExitGameButton.png");
> ButtonRect[1].x = button_x[1];
> ButtonRect[1].y = button_y[1];
> ButtonRect[1].w = button_w[1];
> ButtonRect[1].h = button_h[1];
>
> gPoints = TTF_RenderText_Solid(Font,"Points:",textColor);
>
> PointRect.x = 1;
> PointRect.y = 1;
> PointRect.w = 0;
> PointRect.h = 0;
>
> lastick = 0;
> fpstickcounter = 0;
> fpscounter = 0;
> currentfps = 0;
>
> if(TTF_Init() == -1)
> {
> return 1;
> }
>
> Font = TTF_OpenFont("Arial.ttf",20);
>
> if(Mix_OpenAudio(22050,MIX_DEFAULT_FORMAT,2,4096) == -1)
> {
> return 1;
> }
>
> hit = Mix_LoadWAV("hit.mid");
>
> while(GameRunning)
> {
> lastick = SDL_GetTicks();
> long Elapsedticks = SDL_GetTicks() - lastick;
>
> fpscounter += Elapsedticks;
>
> while(SDL_PollEvent(&event))
> {
> if(event.type == SDL_QUIT)
> {
> GameRunning = false;
> }
>
> if(event.type == SDL_MOUSEMOTION)
> {
> mx = event.motion.x;
> my = event.motion.y;
> }
>
> if(event.type == SDL_MOUSEBUTTONDOWN)
> {
> if(event.button.button == SDL_BUTTON_LEFT)
> {
> mx = event.button.x;
> my = event.button.y;
>
> if(mx > ButtonRect[0].x && mx < ButtonRect[0].x +
> ButtonRect[0].w && my > ButtonRect[0].y && my < ButtonRect[0].y +
> ButtonRect[0].h && bTitle == true)
> {
> bTitle = false;
> bGame = true;
> }
> else if(mx > ButtonRect[1].x && mx < ButtonRect[1].x +
> ButtonRect[1].w && my > ButtonRect[1].y && my < ButtonRect[1].y +
> ButtonRect[1].h && bTitle == true)
> {
> GameRunning = false;
> }
>
> if(mx > BallRect[0].x && mx < BallRect[0].x +
> BallRect[0].w && my > BallRect[0].y && my < BallRect[0].y + BallRect[0].h &&
> bGame == true)
> {
> points = Red_Points;
> Mix_PlayChannel(-1,hit,-1);
> }
> else if(mx > BallRect[1].x && mx < BallRect[1].x +
> BallRect[1].w && my > BallRect[1].y && my < BallRect[1].y + BallRect[1].h &&
> bGame == true)
> {
> points = Blue_Points;
> Mix_PlayChannel(-1,hit,-1);
> }
> else if(mx > BallRect[2].x && mx < BallRect[2].x +
> BallRect[2].w && my > BallRect[2].y && my < BallRect[2].y + BallRect[2].h &&
> bGame == true)
> {
> points = Purple_Points;
> Mix_PlayChannel(-1,hit,-1);
> }
> else if(mx > BallRect[3].x && mx < BallRect[3].x +
> BallRect[3].w && my > BallRect[3].y && my < BallRect[3].y + BallRect[3].h &&
> bGame == true)
> {
> points = Black_Points;
> Mix_PlayChannel(-1,hit,-1);
> }
> else if(mx > BallRect[4].x && mx < BallRect[4].x +
> BallRect[4].w && my > BallRect[4].y && my < BallRect[4].y + BallRect[4].h &&
> bGame == true)
> {
> points = Green_Points;
> Mix_PlayChannel(-1,hit,-1);
> }
> }
> }
>
> if(event.type == SDL_KEYDOWN)
> {
> if(keyState[SDLK_ESCAPE])
> {
> GameRunning = false;
> }
>
> if(keyState[SDLK_RETURN] && bLogo == true)
> {
> bLogo = false;
> bTitle = true;
> }
> }
>
> if(bLogo == true)
> {
> SDL_BlitSurface(gLogo,NULL,gScreen,&LogoRect);
> }
> else if(bTitle == true)
> {
> SDL_BlitSurface(gTitle,NULL,gScreen,&TitleRect);
> SDL_BlitSurface(gButton[0],NULL,gScreen,&ButtonRect[0]);
> SDL_BlitSurface(gButton[1],NULL,gScreen,&ButtonRect[1]);
> }
> else if(bGame == true)
> {
> SDL_BlitSurface(gBackdrop,NULL,gScreen,&BackdropRect);
> SDL_BlitSurface(gPoints,NULL,gScreen,&PointRect);
> SDL_BlitSurface(gBall[0],NULL,gScreen,&BallRect[0]);
> SDL_BlitSurface(gBall[1],NULL,gScreen,&BallRect[1]);
> SDL_BlitSurface(gBall[2],NULL,gScreen,&BallRect[2]);
> SDL_BlitSurface(gBall[3],NULL,gScreen,&BallRect[3]);
> SDL_BlitSurface(gBall[4],NULL,gScreen,&BallRect[4]);
> }
>
> BallRect[0].x++;
> BallRect[1].x++;
> BallRect[2].x++;
> BallRect[3].x++;
> BallRect[4].x++;
>
> if(BallRect[0].x < 0 || BallRect[0].x + BallRect[0].w >
> MAX_WIDTH)
> {
> BallRect[0].x--;
> }
> else if(BallRect[1].x < 0 || BallRect[1].x + BallRect[1].w >
> MAX_WIDTH)
> {
> BallRect[1].x--;
> }
> else if(BallRect[2].x < 0 || BallRect[2].x + BallRect[2].w >
> MAX_WIDTH)
> {
> BallRect[2].x--;
> }
> else if(BallRect[3].x < 0 || BallRect[3].x + BallRect[3].w >
> MAX_WIDTH)
> {
> BallRect[3].x--;
> }
> else if(BallRect[4].x < 0 || BallRect[4].x + BallRect[4].w >
> MAX_WIDTH)
> {
> BallRect[4].x--;
> }
> }
>
> if(SDL_Flip(gScreen) == -1)
> {
> return 1;
> }
>
> ++fpscounter;
>
> if(fpstickcounter >= 1000)
> {
> currentfps = fpscounter;
> fpscounter = 0;
> fpstickcounter = 0;
> }
> }
>
> SDL_FreeSurface(gLogo);
> SDL_FreeSurface(gTitle);
> SDL_FreeSurface(gBackdrop);
> SDL_FreeSurface(gBall[0]);
> SDL_FreeSurface(gBall[1]);
> SDL_FreeSurface(gBall[2]);
> SDL_FreeSurface(gBall[3]);
> SDL_FreeSurface(gBall[4]);
> SDL_FreeSurface(gPop);
>
> Mix_FreeMusic(backMusic);
> Mix_FreeChunk(hit);
>
> TTF_CloseFont(Font);
> TTF_Quit();
> Mix_CloseAudio();
> SDL_Quit();
>
> return 0;
> }
>
>
>
> [/code]
>
> _______________________________________________
> SDL mailing list
> SDL at lists.libsdl.org
> http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.libsdl.org/pipermail/sdl-libsdl.org/attachments/20100311/7a973111/attachment.htm>
More information about the SDL
mailing list