Fixed joystick/keyboard GUI handling.

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/trunk/supertuxkart@1341 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
cosmosninja 2007-12-12 03:54:29 +00:00
parent b3ab2d474d
commit 9218c15a18

View File

@ -1225,66 +1225,60 @@ WidgetManager::decrease_scroll_speed(const bool fast)
}
}
//FIXME: find_left_widget() doesn't works properly yet
/** find_left_widget() returns the closest widget to the left of START_WGT.
* We use the center of the widgets as the reference points; then, we
* filter any widget that is not to the left, and favor the ones that are
* closest in the Y-axis. If there is only one widget that is closest in the
* Y-axis, we pick that one as the closest, but if there is more than one
* widget with the same vertical distance, we have to break the tie by
* choosing the one closest in the X-axis.
*/
int WidgetManager::find_left_widget(const int START_WGT) const
{
const int NUM_WIDGETS = m_widgets.size();
int closest_wgt = WGT_NONE;
int closest_dist = user_config->m_width;
int closest_x_dist = user_config->m_width;
int closest_y_dist = user_config->m_height;
const int START_WGT_Y_CENTER = m_widgets[START_WGT].widget->m_y +
m_widgets[START_WGT].widget->m_height / 2;
const int START_WGT_X_CENTER = m_widgets[START_WGT].widget->m_x +
m_widgets[START_WGT].widget->m_width / 2;
int curr_wgt_x_center, curr_wgt_y_center;
int x_dist, y_dist;
for( int i = 0; i < NUM_WIDGETS; ++i )
{
if(!(m_widgets[i].active)) continue;
if( m_widgets[i].widget->m_x + m_widgets[i].widget->m_width < m_widgets[START_WGT].widget->m_x + m_widgets[START_WGT].widget->m_width)
curr_wgt_y_center = m_widgets[i].widget->m_y + m_widgets[i].widget->m_height / 2;
curr_wgt_x_center = m_widgets[i].widget->m_x + m_widgets[i].widget->m_width / 2;
x_dist = START_WGT_X_CENTER - curr_wgt_x_center;
y_dist = abs( curr_wgt_y_center - START_WGT_Y_CENTER );
//Filter out all widgets that are not to the left and choose the
//widget that is closest in the Y-axis
if( x_dist > 0 && y_dist <= closest_y_dist )
{
const int START_WGT_Y_CENTER = m_widgets[START_WGT].widget->m_y + m_widgets[START_WGT].widget->m_height / 2;
const int START_WGT_X_CENTER = m_widgets[START_WGT].widget->m_x + m_widgets[START_WGT].widget->m_width / 2;
const int CURR_WGT_Y_CENTER = m_widgets[i].widget->m_y + m_widgets[i].widget->m_height / 2;
const int CURR_WGT_X_CENTER = m_widgets[i].widget->m_x + m_widgets[i].widget->m_width / 2;
closest_y_dist = y_dist;
const int X_DIST = START_WGT_X_CENTER - CURR_WGT_X_CENTER;
if( X_DIST > abs(CURR_WGT_Y_CENTER - START_WGT_Y_CENTER ))
//If this is the first widget with this vertical distance, pick
//it as the current closest widget
if( y_dist != closest_y_dist )
{
if( closest_dist > X_DIST )
{
closest_dist = X_DIST;
closest_wgt = i;
}
closest_x_dist = user_config->m_width; //Reset the distance
closest_wgt = i;
}
//If there is more than one widget with the same vertical
//distance, choose the one that is closest in the X-axis
else if( x_dist <= closest_x_dist )
{
closest_x_dist = x_dist;
closest_wgt = i;
}
}
#if 0
//Check if the widget with the id i is to the left of the start widget.
//To do so, simply checking if the X position of the i widget is smaller
//than the start widget(divides the screen in a left and right blocks),
//and that the distance between the two widgets in the X axis is bigger
//than the distance in the Y axis(so that widgets on top and the
//bottom are ignored).
if( m_widgets[i].widget->m_x <= m_widgets[START_WGT].widget->m_x &&
m_widgets[START_WGT].widget->m_x - m_widgets[i].widget->m_x >=
abs(m_widgets[START_WGT].widget->m_y - m_widgets[i].widget->m_y ))
{
//FIXME: instead of using plib's routines, we should use functions
//that works on integers that don't depend on external libraries.
sgVec2 a;
a[0] = m_widgets[START_WGT].widget->m_x;
a[1] = m_widgets[START_WGT].widget->m_y;
sgVec2 b;
b[0] = m_widgets[i].widget->m_x;
b[1] = m_widgets[i].widget->m_y;
//Now that we know that the i widget is to the left, we have
//to find if it's the closest one.
if( closest_dist * closest_dist > sgDistanceSquaredVec2( a,b ) )
{
closest_dist = (int)sgDistanceSquaredVec2( a,b );
closest_wgt = i;
}
}
#endif
}
return closest_wgt;
@ -1297,63 +1291,44 @@ int WidgetManager::find_right_widget(const int START_WGT) const
{
const int NUM_WIDGETS = m_widgets.size();
int closest_wgt = WGT_NONE;
int closest_dist = user_config->m_width;
int closest_x_dist = user_config->m_width;
int closest_y_dist = user_config->m_height;
const int START_WGT_Y_CENTER = m_widgets[START_WGT].widget->m_y +
m_widgets[START_WGT].widget->m_height / 2;
const int START_WGT_X_CENTER = m_widgets[START_WGT].widget->m_x +
m_widgets[START_WGT].widget->m_width / 2;
int curr_wgt_x_center, curr_wgt_y_center;
int x_dist, y_dist;
for( int i = 0; i < NUM_WIDGETS; ++i )
{
if(!(m_widgets[i].active)) continue;
//Check if the widget with the id i is on top of the start widget.
//First it is checked if the y value of the i widget is higher than
//the start widget(remember that for the widget manager a higher
//value means that it is more on top). Then we add more precision:
//if the vertical distance of the center of the two widgets is
//smaller than the horizontal distance between the center of the two
//widgets, then the i widget is definitely on top of the START_WGT
//widget.
if( m_widgets[i].widget->m_x > m_widgets[START_WGT].widget->m_x )
curr_wgt_y_center = m_widgets[i].widget->m_y + m_widgets[i].widget->m_height / 2;
curr_wgt_x_center = m_widgets[i].widget->m_x + m_widgets[i].widget->m_width / 2;
//Notice that the order of this substraction is the *only* difference
//from the find_left_widget() function
x_dist = curr_wgt_x_center - START_WGT_X_CENTER;
y_dist = abs( curr_wgt_y_center - START_WGT_Y_CENTER );
if( x_dist > 0 && y_dist <= closest_y_dist )
{
const int START_WGT_Y_CENTER = m_widgets[START_WGT].widget->m_y + m_widgets[START_WGT].widget->m_height / 2;
const int START_WGT_X_CENTER = m_widgets[START_WGT].widget->m_x + m_widgets[START_WGT].widget->m_width / 2;
const int CURR_WGT_Y_CENTER = m_widgets[i].widget->m_y + m_widgets[i].widget->m_height / 2;
const int CURR_WGT_X_CENTER = m_widgets[i].widget->m_x + m_widgets[i].widget->m_width / 2;
closest_y_dist = y_dist;
const int X_DIST = CURR_WGT_X_CENTER - START_WGT_X_CENTER;
if( X_DIST > abs(CURR_WGT_Y_CENTER - START_WGT_Y_CENTER ))
if( y_dist != closest_y_dist )
{
if( closest_dist > X_DIST )
{
closest_dist = X_DIST;
closest_wgt = i;
}
closest_x_dist = user_config->m_width;
closest_wgt = i;
}
else if( x_dist <= closest_x_dist )
{
closest_x_dist = x_dist;
closest_wgt = i;
}
}
#if 0
//Check if the widget with the id i is to the right of the start widget.
if( m_widgets[i].widget->m_x >= m_widgets[START_WGT].widget->m_x &&
m_widgets[i].widget->m_x - m_widgets[START_WGT].widget->m_x >=
abs(m_widgets[START_WGT].widget->m_y - m_widgets[i].widget->m_y ))
{
//FIXME: instead of using plib's routines, we should use functions
//that works on integers that don't depend on external libraries.
sgVec2 a;
a[0] = m_widgets[START_WGT].widget->m_x;
a[1] = m_widgets[START_WGT].widget->m_y;
sgVec2 b;
b[0] = m_widgets[i].widget->m_x;
b[1] = m_widgets[i].widget->m_y;
//Check if the widget found is closer than the closest
//widget we have found
if( closest_dist * closest_dist > sgDistanceSquaredVec2( a,b ) )
{
closest_dist = (int)sgDistanceSquaredVec2( a,b );
closest_wgt = i;
}
}
#endif
}
return closest_wgt;
@ -1367,35 +1342,46 @@ int WidgetManager::find_top_widget(const int START_WGT) const
{
const int NUM_WIDGETS = m_widgets.size();
int closest_wgt = WGT_NONE;
int closest_dist = user_config->m_height;
for(int i = 0; i < NUM_WIDGETS; ++i)
int closest_x_dist = user_config->m_width;
int closest_y_dist = user_config->m_height;
const int START_WGT_Y_CENTER = m_widgets[START_WGT].widget->m_y +
m_widgets[START_WGT].widget->m_height / 2;
const int START_WGT_X_CENTER = m_widgets[START_WGT].widget->m_x +
m_widgets[START_WGT].widget->m_width / 2;
int curr_wgt_x_center, curr_wgt_y_center;
int x_dist, y_dist;
for( int i = 0; i < NUM_WIDGETS; ++i )
{
if(!(m_widgets[i].active)) continue;
//Check if the widget with the ID i is on top of the start widget.
//First it is checked if the y value of the i widget is higher than
//the start widget(remember that for the widget manager a higher
//value means that it closer to the top of the screen). Then we add
//more precision: if the vertical distance of the center of the two
//widgets is smaller than the horizontal distance between the center
//of the two widgets, then the i widget is definitely on top of the
//START_WGT widget.
if( m_widgets[i].widget->m_y > m_widgets[START_WGT].widget->m_y )
curr_wgt_y_center = m_widgets[i].widget->m_y + m_widgets[i].widget->m_height / 2;
curr_wgt_x_center = m_widgets[i].widget->m_x + m_widgets[i].widget->m_width / 2;
y_dist = curr_wgt_y_center - START_WGT_Y_CENTER;
x_dist = abs( curr_wgt_x_center - START_WGT_X_CENTER );
//Filter out all widgets that are not on top and choose the
//widget that is closest in the X-axis
if( y_dist > 0 && x_dist <= closest_x_dist )
{
const int START_WGT_Y_CENTER = m_widgets[START_WGT].widget->m_y + m_widgets[START_WGT].widget->m_height / 2;
const int START_WGT_X_CENTER = m_widgets[START_WGT].widget->m_x + m_widgets[START_WGT].widget->m_width / 2;
const int CURR_WGT_Y_CENTER = m_widgets[i].widget->m_y + m_widgets[i].widget->m_height / 2;
const int CURR_WGT_X_CENTER = m_widgets[i].widget->m_x + m_widgets[i].widget->m_width / 2;
closest_x_dist = x_dist;
const int Y_DIST = CURR_WGT_Y_CENTER - START_WGT_Y_CENTER;
if( Y_DIST > abs(CURR_WGT_X_CENTER - START_WGT_X_CENTER ))
//If this is the first widget with this vertical distance, pick
//it as the current closest widget
if( x_dist != closest_x_dist )
{
if( closest_dist > Y_DIST )
{
closest_dist = Y_DIST;
closest_wgt = i;
}
closest_y_dist = user_config->m_height;
closest_wgt = i;
}
//If there is more than one widget with the same horizontal
//distance, choose the one that is closest in the Y-axis
else if( y_dist <= closest_y_dist )
{
closest_y_dist = y_dist;
closest_wgt = i;
}
}
}
@ -1411,27 +1397,42 @@ int WidgetManager::find_bottom_widget(const int START_WGT) const
{
const int NUM_WIDGETS = m_widgets.size();
int closest_wgt = WGT_NONE;
int closest_dist = user_config->m_height;
for(int i = 0; i < NUM_WIDGETS; ++i)
int closest_x_dist = user_config->m_width;
int closest_y_dist = user_config->m_height;
const int START_WGT_Y_CENTER = m_widgets[START_WGT].widget->m_y +
m_widgets[START_WGT].widget->m_height / 2;
const int START_WGT_X_CENTER = m_widgets[START_WGT].widget->m_x +
m_widgets[START_WGT].widget->m_width / 2;
int curr_wgt_x_center, curr_wgt_y_center;
int x_dist, y_dist;
for( int i = 0; i < NUM_WIDGETS; ++i )
{
if(!(m_widgets[i].active)) continue;
if( m_widgets[i].widget->m_y + m_widgets[i].widget->m_height < m_widgets[START_WGT].widget->m_y + m_widgets[START_WGT].widget->m_height)
curr_wgt_y_center = m_widgets[i].widget->m_y + m_widgets[i].widget->m_height / 2;
curr_wgt_x_center = m_widgets[i].widget->m_x + m_widgets[i].widget->m_width / 2;
//Notice that the order of this substraction is the *only* difference
//from the find_top_widget() function
y_dist = START_WGT_Y_CENTER - curr_wgt_y_center;
x_dist = abs( curr_wgt_x_center - START_WGT_X_CENTER );
if( y_dist > 0 && x_dist <= closest_x_dist )
{
const int START_WGT_Y_CENTER = m_widgets[START_WGT].widget->m_y + m_widgets[START_WGT].widget->m_height / 2;
const int START_WGT_X_CENTER = m_widgets[START_WGT].widget->m_x + m_widgets[START_WGT].widget->m_width / 2;
const int CURR_WGT_Y_CENTER = m_widgets[i].widget->m_y + m_widgets[i].widget->m_height / 2;
const int CURR_WGT_X_CENTER = m_widgets[i].widget->m_x + m_widgets[i].widget->m_width / 2;
closest_x_dist = x_dist;
const int Y_DIST = START_WGT_Y_CENTER - CURR_WGT_Y_CENTER;
if( Y_DIST > abs(CURR_WGT_X_CENTER - START_WGT_X_CENTER ))
if( x_dist != closest_x_dist )
{
if( closest_dist > Y_DIST )
{
closest_dist = Y_DIST;
closest_wgt = i;
}
closest_y_dist = user_config->m_height;
closest_wgt = i;
}
else if( y_dist <= closest_y_dist )
{
closest_y_dist = y_dist;
closest_wgt = i;
}
}
}