作者:龙飞
有了按钮类,我们制作对话框就很轻松了。边写程序边说明吧。
bool
hand_dialog(
const
ScreenSurface
&
screen,
const
std::
string
&
dialog_text,
int
size)
{
const int CENTRE_X = (screen.point() -> w) / 2 ;
const int CENTRE_Y = (screen.point() -> h) / 2 ;
const int HALF_SUB_BUTTON_W = 64 / 2 ;
{
const int CENTRE_X = (screen.point() -> w) / 2 ;
const int CENTRE_Y = (screen.point() -> h) / 2 ;
const int HALF_SUB_BUTTON_W = 64 / 2 ;
先找出显示屏的中心点,然后是对话框按钮宽度的一半。这些是为了在屏幕中心的对称位置显示YES和NO
PictureSurface quitBG(
"
./images/dialog_bg.png
"
, screen);
quitBG.blit();
quitBG.blit();
载入对话框的背景
TextSurface quitDlg(dialog_text, screen,
215
,
195
,
122
, size);
int quitDlg_x = CENTRE_X - ((quitDlg.point() -> w) / 2 );
int quitDlg_y = CENTRE_Y - 50 ;
quitDlg.blit(quitDlg_x, quitDlg_y);
int quitDlg_x = CENTRE_X - ((quitDlg.point() -> w) / 2 );
int quitDlg_y = CENTRE_Y - 50 ;
quitDlg.blit(quitDlg_x, quitDlg_y);
载入对话框的提示文字
const
int
YES_X
=
CENTRE_X
-
40
-
HALF_SUB_BUTTON_W;
const int YES_Y = CENTRE_Y + 30 ;
Button yesButtonEffect( " ./images/h3_yes_off.png " , " ./images/h3_yes_over.png " , screen);
yesButtonEffect.setup(YES_X, YES_Y, 5 );
yesButtonEffect.blitOut();
const int YES_Y = CENTRE_Y + 30 ;
Button yesButtonEffect( " ./images/h3_yes_off.png " , " ./images/h3_yes_over.png " , screen);
yesButtonEffect.setup(YES_X, YES_Y, 5 );
yesButtonEffect.blitOut();
构建YES按钮
const
int
NO_X
=
CENTRE_X
+
40
-
HALF_SUB_BUTTON_W;
const int NO_Y = CENTRE_Y + 30 ;
Button noButtonEffect( " ./images/h3_no_off.png " , " ./images/h3_no_over.png " , screen);
noButtonEffect.setup(NO_X, NO_Y, 5 );
noButtonEffect.blitOut();
const int NO_Y = CENTRE_Y + 30 ;
Button noButtonEffect( " ./images/h3_no_off.png " , " ./images/h3_no_over.png " , screen);
noButtonEffect.setup(NO_X, NO_Y, 5 );
noButtonEffect.blitOut();
构建NO按钮
screen.flip();
显示屏幕
SDL_Event gameEvent;
while ( true ){
while ( SDL_PollEvent( & gameEvent) != 0 ){
if ( gameEvent.type == SDL_KEYDOWN ){
if ( gameEvent.key.keysym.sym == SDLK_ESCAPE ){
return false ;
}
}
quitBG.blit();
quitDlg.blit(quitDlg_x, quitDlg_y);
if ( yesButtonEffect.effectiveClick(gameEvent) == true )
return true ;
if ( noButtonEffect.effectiveClick(gameEvent) == true )
return false ;
screen.flip();
}
}
}
while ( true ){
while ( SDL_PollEvent( & gameEvent) != 0 ){
if ( gameEvent.type == SDL_KEYDOWN ){
if ( gameEvent.key.keysym.sym == SDLK_ESCAPE ){
return false ;
}
}
quitBG.blit();
quitDlg.blit(quitDlg_x, quitDlg_y);
if ( yesButtonEffect.effectiveClick(gameEvent) == true )
return true ;
if ( noButtonEffect.effectiveClick(gameEvent) == true )
return false ;
screen.flip();
}
}
}
主循环了。可以通过按下ESC或者按下NO按钮取消对话框,按下YES按钮则表示做出了选择。我们使用effectiveClick()方法,一次性的将接收事件,判断事件,显示按钮的不同状态集成性的完成了。