2007-05-27 12:01:53 -04:00
|
|
|
// $Id$
|
|
|
|
//
|
|
|
|
// SuperTuxKart - a fun racing game with go-kart
|
|
|
|
// Copyright (C) 2004-2005 Steve Baker <sjbaker1@airmail.net>
|
|
|
|
// Copyright (C) 2006 Joerg Henrichs, SuperTuxKart-Team, Steve Baker
|
|
|
|
//
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU General Public License
|
2008-06-12 20:53:52 -04:00
|
|
|
// as published by the Free Software Foundation; either version 3
|
2007-05-27 12:01:53 -04:00
|
|
|
// of the License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program; if not, write to the Free Software
|
|
|
|
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
|
2009-07-18 13:48:36 -04:00
|
|
|
#include "states_screens/race_gui.hpp"
|
2007-11-26 09:28:15 -05:00
|
|
|
|
2009-07-27 07:56:09 -04:00
|
|
|
#include "irrlicht.h"
|
|
|
|
using namespace irr;
|
|
|
|
|
2008-09-17 23:24:19 -04:00
|
|
|
#include "audio/sound_manager.hpp"
|
2009-06-11 06:00:43 -04:00
|
|
|
#include "config/user_config.hpp"
|
2009-08-20 20:32:24 -04:00
|
|
|
#include "graphics/camera.hpp"
|
2009-03-11 01:10:56 -04:00
|
|
|
#include "graphics/irr_driver.hpp"
|
2009-06-02 08:37:29 -04:00
|
|
|
#include "graphics/material_manager.hpp"
|
2009-08-16 18:52:41 -04:00
|
|
|
#include "io/file_manager.hpp"
|
2009-06-02 08:37:29 -04:00
|
|
|
#include "input/input.hpp"
|
|
|
|
#include "input/input_manager.hpp"
|
2009-07-27 07:56:09 -04:00
|
|
|
#include "karts/kart_properties_manager.hpp"
|
2009-08-20 20:32:24 -04:00
|
|
|
#include "modes/world.hpp"
|
2009-06-02 21:36:48 -04:00
|
|
|
#include "race/race_manager.hpp"
|
2009-01-22 17:27:13 -05:00
|
|
|
#include "tracks/track.hpp"
|
|
|
|
#include "utils/constants.hpp"
|
2009-07-08 08:34:39 -04:00
|
|
|
#include "utils/string_utils.hpp"
|
2009-01-23 00:23:22 -05:00
|
|
|
#include "utils/translation.hpp"
|
2008-01-12 20:26:30 -05:00
|
|
|
|
2009-07-27 07:56:09 -04:00
|
|
|
/** The constructor is called before anything is attached to the scene node.
|
|
|
|
* So rendering to a texture can be done here. But world is not yet fully
|
|
|
|
* created, so only the race manager can be accessed safely.
|
|
|
|
*/
|
2008-02-10 18:17:25 -05:00
|
|
|
RaceGUI::RaceGUI()
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
2009-07-29 22:40:30 -04:00
|
|
|
m_marker_rendered_size = 32;
|
|
|
|
m_marker_ai_size = 14;
|
|
|
|
m_marker_player_size = 16;
|
|
|
|
m_map_rendered_width = 128;
|
|
|
|
m_map_rendered_height = 128;
|
|
|
|
m_map_width = 100;
|
|
|
|
m_map_height = 100;
|
|
|
|
m_map_left = 10;
|
|
|
|
m_map_bottom = 10;
|
2009-03-11 20:57:00 -04:00
|
|
|
|
2009-07-27 07:56:09 -04:00
|
|
|
m_speed_meter_icon = material_manager->getMaterial("speedback.png");
|
|
|
|
m_speed_bar_icon = material_manager->getMaterial("speedfore.png");
|
|
|
|
m_plunger_face = material_manager->getMaterial("plungerface.png");
|
2009-08-16 18:52:41 -04:00
|
|
|
m_music_icon = material_manager->getMaterial("notes.png");
|
2009-07-27 07:56:09 -04:00
|
|
|
createMarkerTexture();
|
2007-05-27 12:01:53 -04:00
|
|
|
} // RaceGUI
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
RaceGUI::~RaceGUI()
|
|
|
|
{
|
2009-07-27 07:56:09 -04:00
|
|
|
irr_driver->removeTexture(m_marker);
|
2007-05-27 12:01:53 -04:00
|
|
|
} // ~Racegui
|
|
|
|
|
2009-07-27 07:56:09 -04:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
/** Creates a texture with the markers for all karts in the current race
|
|
|
|
* on it. This assumes that nothing is attached to the scene node at
|
|
|
|
* this stage.
|
|
|
|
*/
|
|
|
|
void RaceGUI::createMarkerTexture()
|
|
|
|
{
|
|
|
|
unsigned int n=race_manager->getNumKarts();
|
|
|
|
unsigned int npower2 = 1;
|
|
|
|
// Textures must be power of 2, so
|
|
|
|
while(npower2<n) npower2*=2;
|
|
|
|
|
2009-07-29 22:40:30 -04:00
|
|
|
int radius = (m_marker_rendered_size>>1)-1;
|
2009-08-29 13:09:03 -04:00
|
|
|
IrrDriver::RTTProvider rttProvider(core::dimension2du(m_marker_rendered_size * npower2,
|
2009-09-08 08:50:52 -04:00
|
|
|
m_marker_rendered_size),
|
2009-08-05 08:45:11 -04:00
|
|
|
"RaceGUI::markers");
|
2009-11-23 00:20:05 -05:00
|
|
|
scene::ICameraSceneNode *camera = irr_driver->addCameraSceneNode();
|
2009-08-18 05:41:53 -04:00
|
|
|
core::matrix4 projection;
|
|
|
|
projection.buildProjectionMatrixOrthoLH((float)(m_marker_rendered_size*npower2),
|
|
|
|
(float)(m_marker_rendered_size), -1.0f, 1.0f);
|
|
|
|
camera->setProjectionMatrix(projection, true);
|
|
|
|
core::vector3df center( (float)(m_marker_rendered_size*npower2>>1),
|
|
|
|
(float)(m_marker_rendered_size>>1), 0.0f);
|
|
|
|
camera->setPosition(center);
|
|
|
|
camera->setUpVector(core::vector3df(0,1,0));
|
|
|
|
camera->setTarget(center + core::vector3df(0,0,4));
|
|
|
|
// The call to render sets the projection matrix etc. So we have to call
|
|
|
|
// this now before doing the direct OpenGL calls.
|
|
|
|
// FIXME: perhaps we should use three calls to irr_driver: begin(),
|
|
|
|
// render(), end() - so we could do the rendering by calling to
|
|
|
|
// draw2DPolygon() between render() and end(), avoiding the
|
|
|
|
// call to camera->render()
|
|
|
|
camera->render();
|
2009-12-03 04:10:57 -05:00
|
|
|
// We have to reset the material here, since otherwise the last
|
|
|
|
// set material (i.e from the kart selection screen) will be used
|
|
|
|
// when rednering to the texture.
|
|
|
|
video::SMaterial m;
|
|
|
|
m.setTexture(0, NULL);
|
|
|
|
irr_driver->getVideoDriver()->setMaterial(m);
|
2009-07-27 07:56:09 -04:00
|
|
|
for(unsigned int i=0; i<race_manager->getNumKarts(); i++)
|
|
|
|
{
|
2009-08-13 00:53:51 -04:00
|
|
|
const std::string& kart_ident = race_manager->getKartIdent(i);
|
|
|
|
const KartProperties *kp = kart_properties_manager->getKart(kart_ident);
|
2009-07-29 22:40:30 -04:00
|
|
|
core::vector2df center((float)((m_marker_rendered_size>>1)+i*m_marker_rendered_size),
|
|
|
|
(float)(m_marker_rendered_size>>1) );
|
2009-07-27 07:56:09 -04:00
|
|
|
int count = kp->getShape();
|
2009-10-15 19:51:41 -04:00
|
|
|
//core::array<core::vector2df> vertices;
|
|
|
|
video::S3DVertex *vertices = new video::S3DVertex[count+1];
|
2009-12-03 04:10:57 -05:00
|
|
|
unsigned short int *index = new unsigned short int[count+1];
|
2009-10-15 19:51:41 -04:00
|
|
|
video::SColor color = kp->getColor();
|
|
|
|
createRegularPolygon(count, (float)radius, center, color,
|
|
|
|
vertices, index);
|
|
|
|
|
|
|
|
irr_driver->getVideoDriver()->draw2DVertexPrimitiveList(vertices, count,
|
|
|
|
index, count-2, video::EVT_STANDARD, scene::EPT_TRIANGLE_FAN);
|
|
|
|
delete vertices;
|
|
|
|
delete index;
|
2009-07-27 07:56:09 -04:00
|
|
|
}
|
2009-08-18 05:41:53 -04:00
|
|
|
|
2009-09-08 08:50:52 -04:00
|
|
|
m_marker = rttProvider.renderToTexture(-1, /*is_2d_render*/true);
|
2009-11-23 00:20:05 -05:00
|
|
|
irr_driver->removeCameraSceneNode(camera);
|
2009-07-27 07:56:09 -04:00
|
|
|
} // createMarkerTexture
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
/** Creates the 2D vertices for a regular polygon. Adopted from Irrlicht.
|
|
|
|
* \param n Number of vertices to use.
|
|
|
|
* \param radius Radius of the polygon.
|
|
|
|
* \param center The center point of the polygon.
|
|
|
|
* \param v Pointer to the array of vertices.
|
|
|
|
*/
|
|
|
|
void RaceGUI::createRegularPolygon(unsigned int n, float radius,
|
|
|
|
const core::vector2df ¢er,
|
2009-10-15 19:51:41 -04:00
|
|
|
const video::SColor &color,
|
|
|
|
video::S3DVertex *v, unsigned short int *index)
|
2009-07-27 07:56:09 -04:00
|
|
|
{
|
|
|
|
float f = 2*M_PI/(float)n;
|
|
|
|
for (unsigned int i=0; i<n; i++)
|
|
|
|
{
|
|
|
|
float p = i*f;
|
|
|
|
core::vector2df X = center + core::vector2df(sin(p)*radius, -cos(p)*radius);
|
2009-10-15 19:51:41 -04:00
|
|
|
v[i].Pos.X = X.X;
|
|
|
|
v[i].Pos.Y = X.Y;
|
|
|
|
v[i].Color = color;
|
|
|
|
index[i] = i;
|
2009-07-27 07:56:09 -04:00
|
|
|
}
|
|
|
|
} // createRegularPolygon
|
|
|
|
|
2009-08-20 20:32:24 -04:00
|
|
|
|
2007-05-27 12:01:53 -04:00
|
|
|
//-----------------------------------------------------------------------------
|
2009-11-23 00:20:05 -05:00
|
|
|
/** Render all global parts of the race gui, i.e. things that are only
|
|
|
|
* displayed once even in splitscreen.
|
|
|
|
* \param dt Timestep sized.
|
2009-07-12 07:54:21 -04:00
|
|
|
*/
|
2009-11-23 00:20:05 -05:00
|
|
|
void RaceGUI::renderGlobal(float dt)
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
2008-10-04 14:50:45 -04:00
|
|
|
cleanupMessages(dt);
|
2009-11-23 00:20:05 -05:00
|
|
|
|
|
|
|
assert(RaceManager::getWorld() != NULL);
|
|
|
|
if(RaceManager::getWorld()->getPhase() >= READY_PHASE &&
|
|
|
|
RaceManager::getWorld()->getPhase() <= GO_PHASE )
|
|
|
|
{
|
|
|
|
drawGlobalReadySetGo();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Timer etc. are not displayed unless the game is actually started.
|
|
|
|
if(!RaceManager::getWorld()->isRacePhase()) return;
|
|
|
|
|
|
|
|
drawGlobalTimer();
|
|
|
|
if(RaceManager::getWorld()->getPhase() == GO_PHASE ||
|
|
|
|
RaceManager::getWorld()->getPhase() == MUSIC_PHASE)
|
|
|
|
{
|
|
|
|
drawGlobalMusicDescription();
|
|
|
|
}
|
|
|
|
|
|
|
|
drawGlobalMiniMap();
|
|
|
|
RaceGUI::KartIconDisplayInfo* info = RaceManager::getWorld()->getKartsDisplayInfo();
|
|
|
|
drawGlobalPlayerIcons(info);
|
|
|
|
} // renderGlobal
|
2007-05-27 12:01:53 -04:00
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
2009-11-23 00:20:05 -05:00
|
|
|
/** Render the details for a single player, i.e. speed, energy,
|
|
|
|
* collectibles, ...
|
|
|
|
* \param player_id Player id.
|
|
|
|
* \param viewport Viewport to use (already set in the camera).
|
|
|
|
* \param scaling Scaling to use.
|
2009-07-12 07:54:21 -04:00
|
|
|
*/
|
2009-11-29 08:04:57 -05:00
|
|
|
void RaceGUI::renderPlayerView(unsigned int player_id)
|
2009-07-12 07:54:21 -04:00
|
|
|
{
|
2009-11-29 08:04:57 -05:00
|
|
|
PlayerKart* player_kart = RaceManager::getWorld()->getLocalPlayerKart(player_id);
|
|
|
|
const core::recti &viewport = player_kart->getViewport();
|
|
|
|
const core::vector2df &scaling = player_kart->getScaling();
|
|
|
|
drawAllMessages (player_kart, viewport, scaling);
|
2009-11-23 00:20:05 -05:00
|
|
|
if(!RaceManager::getWorld()->isRacePhase()) return;
|
|
|
|
|
|
|
|
RaceGUI::KartIconDisplayInfo* info = RaceManager::getWorld()->getKartsDisplayInfo();
|
|
|
|
|
|
|
|
drawPowerupIcons (player_kart, viewport, scaling);
|
|
|
|
drawEnergyMeter (player_kart, viewport, scaling);
|
|
|
|
drawSpeed (player_kart, viewport, scaling);
|
|
|
|
drawLap (info, player_kart, viewport, scaling);
|
2009-11-29 08:04:57 -05:00
|
|
|
|
2009-11-23 00:20:05 -05:00
|
|
|
if(player_kart->hasViewBlockedByPlunger())
|
|
|
|
{
|
|
|
|
int offset_x = viewport.UpperLeftCorner.X;
|
|
|
|
int offset_y = viewport.UpperLeftCorner.Y;
|
|
|
|
float split_screen_ratio_x = scaling.X;
|
|
|
|
float split_screen_ratio_y = scaling.Y;
|
|
|
|
|
|
|
|
const int screen_width = viewport.LowerRightCorner.X-viewport.UpperLeftCorner.X;
|
|
|
|
const int plunger_size = viewport.UpperLeftCorner.Y-viewport.LowerRightCorner.Y;
|
|
|
|
int plunger_x = viewport.UpperLeftCorner.X + screen_width/2 - plunger_size/2;
|
|
|
|
|
|
|
|
video::ITexture *t=m_plunger_face->getTexture();
|
|
|
|
core::rect<s32> dest(plunger_x, offset_y,
|
|
|
|
plunger_x+plunger_size, offset_y+plunger_size);
|
|
|
|
const core::rect<s32> source(core::position2d<s32>(0,0), t->getOriginalSize());
|
|
|
|
|
|
|
|
static const video::SColor white = video::SColor(255, 255, 255, 255);
|
|
|
|
|
|
|
|
irr_driver->getVideoDriver()->draw2DImage(t, dest, source, 0,
|
|
|
|
&white, true);
|
|
|
|
}
|
|
|
|
} // renderPlayerView
|
2009-07-12 07:54:21 -04:00
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
/** Displays the racing time on the screen.s
|
2009-03-11 01:10:56 -04:00
|
|
|
*/
|
2009-11-23 00:20:05 -05:00
|
|
|
void RaceGUI::drawGlobalTimer()
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
2008-09-21 12:07:56 -04:00
|
|
|
assert(RaceManager::getWorld() != NULL);
|
|
|
|
|
|
|
|
if(!RaceManager::getWorld()->shouldDrawTimer()) return;
|
2009-07-08 08:34:39 -04:00
|
|
|
std::string s = StringUtils::timeToString(RaceManager::getWorld()->getTime());
|
2009-07-12 07:54:21 -04:00
|
|
|
core::stringw sw(s.c_str());
|
|
|
|
|
|
|
|
static video::SColor time_color = video::SColor(255, 255, 255, 255);
|
|
|
|
core::rect<s32> pos(UserConfigParams::m_width-120, 10,
|
|
|
|
UserConfigParams::m_width, 50);
|
|
|
|
gui::IGUIFont* font = irr_driver->getRaceFont();
|
|
|
|
font->draw(sw.c_str(), pos, time_color);
|
2009-11-23 00:20:05 -05:00
|
|
|
} // DRAWGLOBALTimer
|
2007-05-27 12:01:53 -04:00
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
2009-07-29 22:40:30 -04:00
|
|
|
/** Draws the mini map and the position of all karts on it.
|
|
|
|
*/
|
2009-11-23 00:20:05 -05:00
|
|
|
void RaceGUI::drawGlobalMiniMap()
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
2008-10-14 16:20:54 -04:00
|
|
|
// arenas currently don't have a map.
|
|
|
|
if(RaceManager::getTrack()->isArena()) return;
|
2009-07-29 22:40:30 -04:00
|
|
|
|
2009-07-27 07:56:09 -04:00
|
|
|
const video::ITexture *mini_map=RaceManager::getTrack()->getMiniMap();
|
2008-10-14 16:20:54 -04:00
|
|
|
|
2009-07-29 22:40:30 -04:00
|
|
|
int upper_y = UserConfigParams::m_height-m_map_bottom-m_map_height;
|
|
|
|
int lower_y = UserConfigParams::m_height-m_map_bottom;
|
|
|
|
core::rect<s32> dest(m_map_left, upper_y,
|
|
|
|
m_map_left + m_map_width, lower_y);
|
2009-07-27 07:56:09 -04:00
|
|
|
core::rect<s32> source(core::position2di(0, 0), mini_map->getOriginalSize());
|
2009-07-29 22:40:30 -04:00
|
|
|
irr_driver->getVideoDriver()->draw2DImage(mini_map, dest, source, 0, 0, true);
|
2009-07-16 20:22:58 -04:00
|
|
|
|
2009-07-29 22:40:30 -04:00
|
|
|
for(unsigned int i=0; i<race_manager->getNumKarts(); i++)
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
2009-07-29 22:40:30 -04:00
|
|
|
const Kart *kart = RaceManager::getKart(i);
|
2008-04-15 09:57:18 -04:00
|
|
|
if(kart->isEliminated()) continue; // don't draw eliminated kart
|
2009-07-29 22:40:30 -04:00
|
|
|
const Vec3& xyz = kart->getXYZ();
|
|
|
|
Vec3 draw_at;
|
|
|
|
RaceManager::getTrack()->mapPoint2MiniMap(xyz, &draw_at);
|
2009-08-26 11:18:14 -04:00
|
|
|
// int marker_height = m_marker->getOriginalSize().Height;
|
2009-07-29 22:40:30 -04:00
|
|
|
core::rect<s32> source(i *m_marker_rendered_size, 0,
|
|
|
|
(i+1)*m_marker_rendered_size, m_marker_rendered_size);
|
|
|
|
int marker_half_size = (kart->isPlayerKart() ? m_marker_player_size
|
|
|
|
: m_marker_ai_size )>>1;
|
|
|
|
core::rect<s32> position(m_map_left+(int)(draw_at.getX()-marker_half_size),
|
|
|
|
lower_y -(int)(draw_at.getY()+marker_half_size),
|
|
|
|
m_map_left+(int)(draw_at.getX()+marker_half_size),
|
|
|
|
lower_y -(int)(draw_at.getY()-marker_half_size));
|
|
|
|
irr_driver->getVideoDriver()->draw2DImage(m_marker, position, source, NULL, NULL, true);
|
|
|
|
} // for i<getNumKarts
|
2009-11-23 00:20:05 -05:00
|
|
|
} // drawGlobalMiniMap
|
2007-05-27 12:01:53 -04:00
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
2009-07-13 08:25:38 -04:00
|
|
|
// Draw players icons and their times (if defined in the current mode).
|
2009-11-23 00:20:05 -05:00
|
|
|
void RaceGUI::drawGlobalPlayerIcons(const KartIconDisplayInfo* info)
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
2008-09-21 12:07:56 -04:00
|
|
|
assert(RaceManager::getWorld() != NULL);
|
2007-05-27 12:01:53 -04:00
|
|
|
|
|
|
|
int x = 5;
|
|
|
|
int y;
|
2009-01-06 08:29:48 -05:00
|
|
|
int ICON_WIDTH=40;
|
|
|
|
int ICON_PLAYER_WIDTH=50;
|
2009-06-20 21:10:43 -04:00
|
|
|
if(UserConfigParams::m_height<600)
|
2009-01-06 08:29:48 -05:00
|
|
|
{
|
|
|
|
ICON_WIDTH = 27;
|
|
|
|
ICON_PLAYER_WIDTH = 35;
|
|
|
|
}
|
2008-09-30 20:46:00 -04:00
|
|
|
|
2009-07-13 08:25:38 -04:00
|
|
|
gui::IGUIFont* font = irr_driver->getRaceFont();
|
2008-09-28 22:29:33 -04:00
|
|
|
const unsigned int kart_amount = race_manager->getNumKarts();
|
2008-09-27 15:43:57 -04:00
|
|
|
for(unsigned int i = 0; i < kart_amount ; i++)
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
2008-09-21 12:07:56 -04:00
|
|
|
Kart* kart = RaceManager::getKart(i);
|
2008-04-15 09:57:18 -04:00
|
|
|
if(kart->isEliminated()) continue;
|
2008-10-14 16:20:54 -04:00
|
|
|
const int position = kart->getPosition();
|
2007-05-27 12:01:53 -04:00
|
|
|
|
2009-07-13 08:25:38 -04:00
|
|
|
y = 20 + ( (position == -1 ? i : position-1)*(ICON_PLAYER_WIDTH+2));
|
2007-05-27 12:01:53 -04:00
|
|
|
|
2009-08-30 14:21:59 -04:00
|
|
|
if (info[i].time.size() > 0)
|
2008-04-16 20:20:06 -04:00
|
|
|
{
|
2009-07-13 08:25:38 -04:00
|
|
|
static video::SColor color = video::SColor(255, (int)(255*info[i].r),
|
|
|
|
(int)(255*info[i].g),
|
|
|
|
(int)(255*info[i].b) );
|
|
|
|
core::rect<s32> pos(x+ICON_PLAYER_WIDTH, y+5, x+ICON_PLAYER_WIDTH, y+5);
|
|
|
|
core::stringw s=info[i].time.c_str();
|
|
|
|
font->draw(s.c_str(), pos, color);
|
2007-05-27 12:01:53 -04:00
|
|
|
}
|
2008-09-27 15:43:57 -04:00
|
|
|
|
2009-08-30 14:21:59 -04:00
|
|
|
if (info[i].special_title.size() > 0)
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
2009-07-13 08:25:38 -04:00
|
|
|
static video::SColor color = video::SColor(255, 255, 0, 0);
|
|
|
|
core::rect<s32> pos(x+ICON_PLAYER_WIDTH, y+5, x+ICON_PLAYER_WIDTH, y+5);
|
|
|
|
core::stringw s(info[i].special_title.c_str());
|
|
|
|
font->draw(s.c_str(), pos, color);
|
2007-05-27 12:01:53 -04:00
|
|
|
}
|
|
|
|
|
2009-07-13 08:25:38 -04:00
|
|
|
// draw icon
|
|
|
|
video::ITexture *icon = kart->getKartProperties()->getIconMaterial()->getTexture();
|
|
|
|
int w = kart->isPlayerKart() ? ICON_PLAYER_WIDTH : ICON_WIDTH;
|
|
|
|
const core::rect<s32> pos(x, y, x+w, y+w);
|
2009-08-13 18:53:24 -04:00
|
|
|
|
|
|
|
// Fixes crash bug, why are certain icons not showing up?
|
|
|
|
if (icon != NULL)
|
|
|
|
{
|
|
|
|
const core::rect<s32> rect(core::position2d<s32>(0,0), icon->getOriginalSize());
|
|
|
|
irr_driver->getVideoDriver()->draw2DImage(icon, pos, rect, NULL, NULL, true);
|
|
|
|
}
|
2007-05-27 12:01:53 -04:00
|
|
|
|
2008-09-30 20:46:00 -04:00
|
|
|
} // next kart
|
|
|
|
|
2009-11-23 00:20:05 -05:00
|
|
|
} // drawGlobalPlayerIcons
|
2007-05-27 12:01:53 -04:00
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
2009-11-23 00:20:05 -05:00
|
|
|
void RaceGUI::drawPowerupIcons(Kart* player_kart,
|
|
|
|
const core::recti &viewport,
|
|
|
|
const core::vector2df &scaling)
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
2007-06-08 05:19:27 -04:00
|
|
|
// If player doesn't have anything, do nothing.
|
2008-10-29 22:02:56 -04:00
|
|
|
Powerup* powerup=player_kart->getPowerup();
|
|
|
|
if(powerup->getType() == POWERUP_NOTHING) return;
|
2009-07-13 20:26:18 -04:00
|
|
|
int n = player_kart->getNumPowerup() ;
|
|
|
|
if(n<1) return; // shouldn't happen, but just in case
|
|
|
|
if(n>5) n=5; // Display at most 5 items
|
2007-06-08 05:19:27 -04:00
|
|
|
|
2009-11-23 00:20:05 -05:00
|
|
|
int nSize=(int)(64.0f*std::min(scaling.X, scaling.Y));
|
|
|
|
int x1 = (int)((UserConfigParams::m_width/2-32) * scaling.X)
|
|
|
|
+ viewport.UpperLeftCorner.X;
|
2009-11-29 08:04:57 -05:00
|
|
|
//int y1 = UserConfigParams::m_height - viewport.LowerRightCorner.Y
|
|
|
|
// + (int)(20 * scaling.Y)+nSize;
|
|
|
|
int y1 = viewport.UpperLeftCorner.Y
|
|
|
|
+ (int)(20 * scaling.Y);
|
2007-05-27 12:01:53 -04:00
|
|
|
|
2009-07-13 20:26:18 -04:00
|
|
|
video::ITexture *t=powerup->getIcon()->getTexture();
|
|
|
|
core::rect<s32> rect(core::position2di(0, 0), t->getOriginalSize());
|
2007-05-27 12:01:53 -04:00
|
|
|
|
|
|
|
for ( int i = 0 ; i < n ; i++ )
|
|
|
|
{
|
2009-11-29 08:04:57 -05:00
|
|
|
int x2=(int)(x1+i*std::min(scaling.X, scaling.Y)*30);
|
|
|
|
core::rect<s32> pos(x2, y1, x2+nSize, y1+nSize);
|
2009-07-30 06:20:11 -04:00
|
|
|
irr_driver->getVideoDriver()->draw2DImage(t, pos, rect, NULL,
|
|
|
|
NULL, true);
|
2007-05-27 12:01:53 -04:00
|
|
|
} // for i
|
2008-10-29 22:02:56 -04:00
|
|
|
} // drawPowerupIcons
|
2007-05-27 12:01:53 -04:00
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
/* Energy meter that gets filled with coins */
|
2009-11-23 00:20:05 -05:00
|
|
|
void RaceGUI::drawEnergyMeter (Kart *player_kart,
|
|
|
|
const core::recti &viewport,
|
|
|
|
const core::vector2df &scaling)
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
2009-07-14 08:57:04 -04:00
|
|
|
float state = (float)(player_kart->getEnergy()) / MAX_ITEMS_COLLECTED;
|
2009-11-23 00:20:05 -05:00
|
|
|
int x = (int)((UserConfigParams::m_width-24) * scaling.X) + viewport.UpperLeftCorner.X;
|
|
|
|
//int y = (int)(250 * scaling.Y) + viewport.UpperLeftCorner.Y;
|
2009-11-29 08:04:57 -05:00
|
|
|
int y = viewport.LowerRightCorner.Y - (int)(250 * scaling.Y);
|
2009-11-23 00:20:05 -05:00
|
|
|
int w = (int)(16 * scaling.X);
|
|
|
|
int h = (int)(UserConfigParams::m_height/4 * scaling.Y);
|
2008-05-11 13:32:41 -04:00
|
|
|
float coin_target = (float)race_manager->getCoinTarget();
|
2008-10-29 11:55:54 -04:00
|
|
|
int th = (int)(h*(coin_target/MAX_ITEMS_COLLECTED));
|
2009-07-14 08:57:04 -04:00
|
|
|
|
|
|
|
video::SColor black_border(255, 0, 0, 0);
|
|
|
|
video::SColor white_border(255, 255, 255, 255);
|
|
|
|
video::IVideoDriver *video = irr_driver->getVideoDriver();
|
|
|
|
#define LINE(x0,y0,x1,y1, color) video->draw2DLine(core::position2di(x0,y0), \
|
|
|
|
core::position2di(x1,y1), color)
|
|
|
|
|
|
|
|
// Left side:
|
|
|
|
LINE(x-1, y+1, x-1, y-h-1, black_border);
|
|
|
|
LINE(x, y, x, y-h-2, white_border);
|
2009-07-27 07:56:09 -04:00
|
|
|
|
2009-07-14 08:57:04 -04:00
|
|
|
// Right side:
|
|
|
|
LINE(x+w, y+1, x+w, y-h-1, black_border);
|
|
|
|
LINE(x+w+1, y, x+w+1, y-h-2, white_border);
|
2009-07-27 07:56:09 -04:00
|
|
|
|
2009-07-14 08:57:04 -04:00
|
|
|
// Bottom
|
|
|
|
LINE(x, y+1, x+w, y+1, black_border);
|
|
|
|
LINE(x+1, y, x+w+1, y, white_border);
|
2009-07-27 07:56:09 -04:00
|
|
|
|
2009-07-14 08:57:04 -04:00
|
|
|
// Top
|
|
|
|
LINE(x, y-h, x+w, y-h, black_border);
|
|
|
|
LINE(x, y-h-1, x+w, y-h-1, white_border);
|
2007-05-27 12:01:53 -04:00
|
|
|
|
2009-07-14 08:57:04 -04:00
|
|
|
const int GRADS = (int)(MAX_ITEMS_COLLECTED/5); // each graduation equals 5 items
|
|
|
|
int gh = (int)(h/GRADS); //graduation height
|
2007-05-27 12:01:53 -04:00
|
|
|
|
2009-07-14 08:57:04 -04:00
|
|
|
// 'Meter marks;
|
2008-05-10 09:30:55 -04:00
|
|
|
int gh_incr = gh;
|
|
|
|
for (int i=0; i<GRADS-1; i++)
|
|
|
|
{
|
2009-07-14 08:57:04 -04:00
|
|
|
LINE(x+1, y-1-gh, x+1+w, y-1-gh, white_border);
|
2008-05-10 09:30:55 -04:00
|
|
|
gh+=gh_incr;
|
|
|
|
}
|
2009-07-14 08:57:04 -04:00
|
|
|
|
2008-05-11 13:32:41 -04:00
|
|
|
//Target line
|
|
|
|
if (coin_target > 0)
|
|
|
|
{
|
2009-07-14 08:57:04 -04:00
|
|
|
LINE(x+1, y-1-th, x+1+w, y-1-th, video::SColor(255, 255, 0, 0));
|
2008-05-11 13:32:41 -04:00
|
|
|
}
|
2009-07-14 08:57:04 -04:00
|
|
|
#undef LINE
|
2007-05-27 12:01:53 -04:00
|
|
|
|
2009-07-14 08:57:04 -04:00
|
|
|
// The actual energy meter
|
|
|
|
core::rect<s32> energy(x+1, y-1-(int)(state*h), x+1+w, y-1);
|
|
|
|
video::SColor bottom(255, 240, 0, 0);
|
|
|
|
video::SColor top (160, 240, 200, 0);
|
|
|
|
video->draw2DRectangle(energy, top, top, bottom, bottom);
|
2007-05-27 12:01:53 -04:00
|
|
|
} // drawEnergyMeter
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
2009-11-23 00:20:05 -05:00
|
|
|
void RaceGUI::drawSpeed(Kart* kart, const core::recti &viewport,
|
|
|
|
const core::vector2df &scaling)
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
|
|
|
|
2009-11-23 00:20:05 -05:00
|
|
|
float minRatio = std::min(scaling.X, scaling.Y);
|
|
|
|
const int SPEEDWIDTH = 128;
|
|
|
|
int meter_width = (int)(SPEEDWIDTH*minRatio);
|
|
|
|
int meter_height = (int)(SPEEDWIDTH*minRatio);
|
|
|
|
core::vector2di offset = viewport.UpperLeftCorner;
|
|
|
|
offset.X += (int)((UserConfigParams::m_width-10)*scaling.X) - meter_width;
|
2009-11-29 08:04:57 -05:00
|
|
|
offset.Y = viewport.LowerRightCorner.Y-(int)(10*scaling.Y);
|
2007-05-27 12:01:53 -04:00
|
|
|
|
2009-07-27 07:56:09 -04:00
|
|
|
// First draw the meter (i.e. the background which contains the numbers etc.
|
|
|
|
// -------------------------------------------------------------------------
|
2009-07-15 09:40:22 -04:00
|
|
|
video::IVideoDriver *video = irr_driver->getVideoDriver();
|
2009-11-23 00:20:05 -05:00
|
|
|
const core::rect<s32> meter_pos(offset.X,
|
2009-11-29 08:04:57 -05:00
|
|
|
offset.Y-meter_height,
|
2009-11-23 00:20:05 -05:00
|
|
|
offset.X+meter_width,
|
2009-11-29 08:04:57 -05:00
|
|
|
offset.Y);
|
2009-07-27 07:56:09 -04:00
|
|
|
video::ITexture *meter_texture = m_speed_meter_icon->getTexture();
|
|
|
|
const core::rect<s32> meter_texture_coords(core::position2d<s32>(0,0),
|
|
|
|
meter_texture->getOriginalSize());
|
|
|
|
video->draw2DImage(meter_texture, meter_pos, meter_texture_coords, NULL, NULL, true);
|
|
|
|
|
|
|
|
// Indicate when the kart is off ground
|
|
|
|
// ------------------------------------
|
2007-05-27 12:01:53 -04:00
|
|
|
if ( !kart->isOnGround() )
|
|
|
|
{
|
2009-07-15 09:40:22 -04:00
|
|
|
static video::SColor color = video::SColor(255, 255, 255, 255);
|
2009-11-23 00:20:05 -05:00
|
|
|
core::rect<s32> pos(offset.X-(int)(30*minRatio),
|
2009-11-29 08:04:57 -05:00
|
|
|
offset.Y-(int)(10*minRatio),
|
2009-11-23 00:20:05 -05:00
|
|
|
offset.X-(int)(30*minRatio),
|
2009-11-29 08:04:57 -05:00
|
|
|
offset.Y-(int)(10*minRatio) );
|
2009-07-15 09:40:22 -04:00
|
|
|
irr_driver->getRaceFont()->draw(core::stringw("!").c_str(), pos, color);
|
|
|
|
}
|
2009-07-27 07:56:09 -04:00
|
|
|
|
2009-07-15 09:40:22 -04:00
|
|
|
const float speed = kart->getSpeed();
|
2009-07-27 07:56:09 -04:00
|
|
|
if(speed <=0) return; // Nothing to do if speed is negative.
|
|
|
|
|
|
|
|
// Draw the actual speed bar (if the speed is >0)
|
|
|
|
// ----------------------------------------------
|
|
|
|
float speed_ratio = speed/KILOMETERS_PER_HOUR/110.0f;
|
|
|
|
if(speed_ratio>1) speed_ratio = 1;
|
|
|
|
|
|
|
|
video::ITexture *bar_texture = m_speed_bar_icon->getTexture();
|
2009-08-05 08:45:11 -04:00
|
|
|
core::dimension2du bar_size = bar_texture->getOriginalSize();
|
2009-10-15 19:51:41 -04:00
|
|
|
video::S3DVertex vertices[4];
|
|
|
|
|
|
|
|
vertices[0].TCoords = core::vector2df(1.0f, 1.0f);
|
|
|
|
vertices[0].Pos = core::vector3df((float)meter_pos.LowerRightCorner.X,
|
|
|
|
(float)meter_pos.LowerRightCorner.Y,
|
|
|
|
0);
|
|
|
|
vertices[1].TCoords = core::vector2df(0, 1.0f);
|
|
|
|
vertices[1].Pos = core::vector3df((float)meter_pos.UpperLeftCorner.X,
|
|
|
|
(float)meter_pos.LowerRightCorner.Y, 0);
|
|
|
|
unsigned int count;
|
2009-07-27 07:56:09 -04:00
|
|
|
if(speed_ratio<=0.5f)
|
2009-07-15 09:40:22 -04:00
|
|
|
{
|
2009-10-15 19:51:41 -04:00
|
|
|
count = 3;
|
|
|
|
vertices[2].TCoords = core::vector2df(0, 1-2*speed_ratio);
|
|
|
|
vertices[2].Pos = core::vector3df((float)meter_pos.UpperLeftCorner.X,
|
|
|
|
(float)meter_pos.LowerRightCorner.Y-speed_ratio*2*meter_height,
|
|
|
|
0);
|
2009-07-27 07:56:09 -04:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2009-10-15 19:51:41 -04:00
|
|
|
count = 4;
|
|
|
|
vertices[2].TCoords = core::vector2df(0,0);
|
2009-11-23 00:20:05 -05:00
|
|
|
vertices[2].Pos = core::vector3df((float)offset.X,
|
2009-11-29 08:04:57 -05:00
|
|
|
(float)(offset.Y-meter_height),
|
2009-11-23 00:20:05 -05:00
|
|
|
0);
|
2009-10-15 19:51:41 -04:00
|
|
|
vertices[3].TCoords = core::vector2df(2*speed_ratio-1.0f, 0);
|
2009-11-23 00:20:05 -05:00
|
|
|
vertices[3].Pos = core::vector3df(offset.X+2*(speed_ratio-0.5f)*meter_width,
|
2009-11-29 08:04:57 -05:00
|
|
|
(float)(offset.Y-meter_height),
|
2009-11-23 00:20:05 -05:00
|
|
|
0);
|
2009-10-15 19:51:41 -04:00
|
|
|
}
|
|
|
|
short int index[4];
|
|
|
|
for(unsigned int i=0; i<count; i++)
|
|
|
|
{
|
|
|
|
index[i]=i;
|
|
|
|
vertices[i].Color = video::SColor(255, 255, 255, 255);
|
2009-07-27 07:56:09 -04:00
|
|
|
}
|
2009-10-15 19:51:41 -04:00
|
|
|
video::SMaterial m;
|
|
|
|
m.setTexture(0, m_speed_bar_icon->getTexture());
|
|
|
|
irr_driver->getVideoDriver()->setMaterial(m);
|
2009-11-23 00:20:05 -05:00
|
|
|
#define DOES_NOT_WORK_ATM
|
2009-10-15 19:51:41 -04:00
|
|
|
#ifdef DOES_NOT_WORK_ATM
|
|
|
|
irr_driver->getVideoDriver()->draw2DVertexPrimitiveList(vertices, count,
|
|
|
|
index, count-2, video::EVT_STANDARD, scene::EPT_TRIANGLE_FAN);
|
2009-02-10 00:30:59 -05:00
|
|
|
#endif
|
2007-05-27 12:01:53 -04:00
|
|
|
} // drawSpeed
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
2009-11-23 00:20:05 -05:00
|
|
|
void RaceGUI::drawLap(const KartIconDisplayInfo* info, Kart* kart,
|
|
|
|
const core::recti &viewport,
|
|
|
|
const core::vector2df &scaling)
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
1) Removed race_setup and race_mode data structures. All this
information is now only managed by the race_manager, no
more in-between objects to transfer information along.
2) The scores for grand prix are now defined in the stk_config.dat
file (10, 8, 6, 5, 4, .., 1, 0, 0) points
3) Bugfix: unlock information wasn't saved anymore. Added specific
saving after unlocking, plus re-inserted the 'generic' save
at the end of STK again.
4) bugfix/work around: Visual Studio complains about incompatible
iterators in sdldrv - apparently caused by using erase, and
then keep on using the iterator.
5) Fixed bug when running a race in a GP again (scores/times
were added each time).
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/trunk/supertuxkart@1681 178a84e3-b1eb-0310-8ba1-8eac791a3b58
2008-04-09 09:52:48 -04:00
|
|
|
// Don't display laps in follow the leader mode
|
2008-09-30 21:53:35 -04:00
|
|
|
if(!RaceManager::getWorld()->raceHasLaps()) return;
|
2008-09-27 15:43:57 -04:00
|
|
|
|
|
|
|
const int lap = info[kart->getWorldKartId()].lap;
|
|
|
|
|
2009-11-23 00:20:05 -05:00
|
|
|
if(lap<0) return; // don't display 'lap 0/...'
|
|
|
|
float minRatio = std::min(scaling.X, scaling.Y);
|
|
|
|
core::recti pos;
|
|
|
|
pos.UpperLeftCorner.X = viewport.UpperLeftCorner.X
|
|
|
|
+ (int)(0.15f*UserConfigParams::m_width*scaling.X);
|
2009-11-29 08:04:57 -05:00
|
|
|
pos.UpperLeftCorner.Y = viewport.LowerRightCorner.Y;
|
2009-11-23 00:20:05 -05:00
|
|
|
gui::IGUIFont* font = irr_driver->getRaceFont();
|
2009-11-29 08:04:57 -05:00
|
|
|
int font_height = (int)(60*scaling.Y);
|
2008-05-19 23:33:48 -04:00
|
|
|
if(kart->hasFinishedRace())
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
2009-07-13 20:26:18 -04:00
|
|
|
static video::SColor color = video::SColor(255, 255, 255, 255);
|
2009-08-29 21:50:22 -04:00
|
|
|
//I18N: Shown at the end of a race
|
2009-07-13 20:26:18 -04:00
|
|
|
core::stringw s=_("Finished");
|
2009-11-29 08:04:57 -05:00
|
|
|
pos.UpperLeftCorner.Y -= 2*font_height;
|
|
|
|
pos.LowerRightCorner = pos.UpperLeftCorner;
|
2009-07-13 20:26:18 -04:00
|
|
|
font->draw(s.c_str(), pos, color);
|
2007-05-27 12:01:53 -04:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2009-07-13 20:26:18 -04:00
|
|
|
static video::SColor color = video::SColor(255, 255, 255, 255);
|
|
|
|
core::stringw s = _("Lap");
|
2009-11-29 08:04:57 -05:00
|
|
|
pos.UpperLeftCorner.Y -= 3*font_height;
|
|
|
|
pos.LowerRightCorner = pos.UpperLeftCorner;
|
2009-07-13 20:26:18 -04:00
|
|
|
font->draw(core::stringw(_("Lap")).c_str(), pos, color);
|
|
|
|
|
|
|
|
char str[256];
|
|
|
|
sprintf(str, "%d/%d", lap+1, race_manager->getNumLaps());
|
2009-11-29 08:04:57 -05:00
|
|
|
pos.UpperLeftCorner.Y += font_height;
|
|
|
|
pos.LowerRightCorner.Y += font_height;
|
2009-07-13 20:26:18 -04:00
|
|
|
font->draw(core::stringw(str).c_str(), pos, color);
|
2007-05-27 12:01:53 -04:00
|
|
|
}
|
|
|
|
} // drawLap
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
/** Removes messages which have been displayed long enough. This function
|
2008-10-04 14:50:45 -04:00
|
|
|
* must be called after drawAllMessages, otherwise messages which are only
|
2007-05-27 12:01:53 -04:00
|
|
|
* displayed once will not be drawn!
|
|
|
|
**/
|
|
|
|
|
2008-10-04 14:50:45 -04:00
|
|
|
void RaceGUI::cleanupMessages(const float dt)
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
|
|
|
AllMessageType::iterator p =m_messages.begin();
|
|
|
|
while(p!=m_messages.end())
|
|
|
|
{
|
2008-10-04 14:50:45 -04:00
|
|
|
if((*p).done(dt))
|
2007-09-10 10:11:08 -04:00
|
|
|
{
|
|
|
|
p = m_messages.erase(p);
|
|
|
|
}
|
2007-05-27 12:01:53 -04:00
|
|
|
else
|
2007-09-10 10:11:08 -04:00
|
|
|
{
|
|
|
|
++p;
|
|
|
|
}
|
2007-05-27 12:01:53 -04:00
|
|
|
}
|
|
|
|
} // cleanupMessages
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
/** Displays all messages in the message queue
|
|
|
|
**/
|
2009-11-23 00:20:05 -05:00
|
|
|
void RaceGUI::drawAllMessages(Kart* player_kart,
|
|
|
|
const core::recti &viewport,
|
|
|
|
const core::vector2df &scaling)
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
|
|
|
// First line of text somewhat under the top of the screen. For now
|
|
|
|
// start just under the timer display
|
2009-11-29 08:04:57 -05:00
|
|
|
int y = (int)(scaling.Y*164 + UserConfigParams::m_height
|
|
|
|
- viewport.LowerRightCorner.Y );
|
|
|
|
int x = (viewport.LowerRightCorner.X - viewport.UpperLeftCorner.X)>>1;
|
2007-05-27 12:01:53 -04:00
|
|
|
// The message are displayed in reverse order, so that a multi-line
|
|
|
|
// message (addMessage("1", ...); addMessage("2",...) is displayed
|
|
|
|
// in the right order: "1" on top of "2"
|
2007-09-10 10:11:08 -04:00
|
|
|
for(AllMessageType::const_iterator i=m_messages.begin();i!=m_messages.end(); ++i)
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
2007-09-10 10:11:08 -04:00
|
|
|
TimedMessage const &msg = *i;
|
|
|
|
|
2007-05-27 12:01:53 -04:00
|
|
|
// Display only messages for all karts, or messages for this kart
|
2007-09-10 10:11:08 -04:00
|
|
|
if( msg.m_kart && msg.m_kart!=player_kart) continue;
|
2007-05-27 12:01:53 -04:00
|
|
|
|
2009-11-29 08:04:57 -05:00
|
|
|
core::rect<s32> pos(x, y, x, y);
|
2009-07-15 23:24:17 -04:00
|
|
|
irr_driver->getRaceFont()->draw(core::stringw(msg.m_message.c_str()).c_str(),
|
|
|
|
pos, msg.m_color, true, true);
|
|
|
|
y+=40;
|
2007-05-27 12:01:53 -04:00
|
|
|
} // for i in all messages
|
|
|
|
} // drawAllMessages
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
/** Adds a message to the message queue. The message is displayed for a
|
|
|
|
* certain amount of time (unless time<0, then the message is displayed
|
|
|
|
* once).
|
|
|
|
**/
|
2009-11-23 00:20:05 -05:00
|
|
|
void RaceGUI::addMessage(const core::stringw &msg, const Kart *kart, float time,
|
2009-07-15 23:24:17 -04:00
|
|
|
int font_size, const video::SColor &color)
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
2009-07-15 23:24:17 -04:00
|
|
|
m_messages.push_back(TimedMessage(msg, kart, time, font_size, color));
|
2007-05-27 12:01:53 -04:00
|
|
|
} // addMessage
|
|
|
|
|
2008-02-10 18:17:25 -05:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Displays the description given for the music currently being played -
|
|
|
|
// usually the title and composer.
|
2009-11-23 00:20:05 -05:00
|
|
|
void RaceGUI::drawGlobalMusicDescription()
|
2008-02-10 18:17:25 -05:00
|
|
|
{
|
2009-08-16 16:55:06 -04:00
|
|
|
if (!UserConfigParams::m_music) return; // show no music description when it's off
|
|
|
|
|
2009-08-16 18:52:41 -04:00
|
|
|
// 3.0 is the duration of ready/set (TODO: don't hardcode)
|
|
|
|
float timeProgression = (float)(RaceManager::getWorld()->m_auxiliary_timer - 2.0f) /
|
|
|
|
(float)(stk_config->m_music_credit_time - 2.0f);
|
|
|
|
|
2009-08-16 20:19:55 -04:00
|
|
|
const int x_pulse = (int)(sin(RaceManager::getWorld()->m_auxiliary_timer*9.0f)*10.0f);
|
|
|
|
const int y_pulse = (int)(cos(RaceManager::getWorld()->m_auxiliary_timer*9.0f)*10.0f);
|
2009-08-16 18:52:41 -04:00
|
|
|
|
|
|
|
float resize = 1.0f;
|
|
|
|
if (timeProgression < 0.1)
|
|
|
|
{
|
|
|
|
resize = timeProgression/0.1f;
|
|
|
|
}
|
|
|
|
else if (timeProgression > 0.9)
|
|
|
|
{
|
|
|
|
resize = 1.0f - (timeProgression - 0.9f)/0.1f;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-03-14 05:49:17 -04:00
|
|
|
const MusicInformation* mi=sound_manager->getCurrentMusic();
|
2008-05-11 01:45:02 -04:00
|
|
|
if(!mi) return;
|
2009-08-16 18:52:41 -04:00
|
|
|
|
|
|
|
const float resize3 = resize*resize*resize;
|
|
|
|
|
|
|
|
const int y = UserConfigParams::m_height - 80;
|
2009-08-16 20:19:55 -04:00
|
|
|
const int text_y = (int)(UserConfigParams::m_height - 80*(resize3) + 40*(1-resize));
|
2009-08-16 18:52:41 -04:00
|
|
|
|
2009-07-27 07:56:09 -04:00
|
|
|
static const video::SColor white = video::SColor(255, 255, 255, 255);
|
2009-07-15 09:40:22 -04:00
|
|
|
gui::IGUIFont* font = irr_driver->getRaceFont();
|
2008-03-14 05:49:17 -04:00
|
|
|
if(mi->getComposer()!="")
|
2008-02-10 18:17:25 -05:00
|
|
|
{
|
2009-08-16 18:52:41 -04:00
|
|
|
core::rect<s32> pos_by((UserConfigParams::m_width>>1) + 32, text_y+40,
|
|
|
|
(UserConfigParams::m_width>>1) + 32, text_y+40);
|
2008-03-14 05:49:17 -04:00
|
|
|
std::string s="by "+mi->getComposer();
|
2009-07-15 09:40:22 -04:00
|
|
|
font->draw(core::stringw(s.c_str()).c_str(), pos_by, white, true, true);
|
2008-03-14 05:49:17 -04:00
|
|
|
}
|
2009-07-15 09:40:22 -04:00
|
|
|
|
2008-03-14 05:49:17 -04:00
|
|
|
std::string s="\""+mi->getTitle()+"\"";
|
2009-08-16 18:52:41 -04:00
|
|
|
|
|
|
|
// Draw text
|
|
|
|
core::stringw thetext(s.c_str());
|
2009-10-04 21:23:10 -04:00
|
|
|
|
|
|
|
core::dimension2d< u32 > textSize = font->getDimension(thetext.c_str());
|
2009-08-16 18:52:41 -04:00
|
|
|
const int textWidth = textSize.Width;
|
|
|
|
|
|
|
|
core::rect<s32> pos((UserConfigParams::m_width >> 1) + 32, text_y,
|
|
|
|
(UserConfigParams::m_width >> 1) + 32, text_y);
|
|
|
|
|
|
|
|
font->draw(thetext.c_str(), pos, white, true, true);
|
|
|
|
|
|
|
|
|
|
|
|
|
2009-08-16 20:19:55 -04:00
|
|
|
int iconSizeX = (int)(64*resize + x_pulse*resize*resize);
|
|
|
|
int iconSizeY = (int)(64*resize + y_pulse*resize*resize);
|
2009-08-16 18:52:41 -04:00
|
|
|
|
|
|
|
// Draw music icon
|
|
|
|
video::ITexture *t = m_music_icon->getTexture();
|
|
|
|
const int noteX = (UserConfigParams::m_width >> 1) - textWidth/2 - 32;
|
|
|
|
const int noteY = y;
|
|
|
|
core::rect<s32> dest(noteX-iconSizeX/2+20, noteY-iconSizeY/2+32,
|
|
|
|
noteX+iconSizeX/2+20, noteY+iconSizeY/2+32);
|
|
|
|
const core::rect<s32> source(core::position2d<s32>(0,0), t->getOriginalSize());
|
|
|
|
|
|
|
|
irr_driver->getVideoDriver()->draw2DImage(t, dest, source, NULL, NULL, true);
|
|
|
|
|
2009-11-23 00:20:05 -05:00
|
|
|
} // drawGlobalMusicDescription
|
2008-02-10 18:17:25 -05:00
|
|
|
|
2009-11-23 00:20:05 -05:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
/** Draws the ready-set-go message on the screen.
|
|
|
|
*/
|
|
|
|
void RaceGUI::drawGlobalReadySetGo()
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
2008-09-21 12:07:56 -04:00
|
|
|
assert(RaceManager::getWorld() != NULL);
|
|
|
|
switch (RaceManager::getWorld()->getPhase())
|
2007-05-27 12:01:53 -04:00
|
|
|
{
|
2008-09-20 19:45:22 -04:00
|
|
|
case READY_PHASE:
|
2008-04-24 03:06:09 -04:00
|
|
|
{
|
2009-07-12 07:54:21 -04:00
|
|
|
static video::SColor color = video::SColor(255, 230, 168, 158);
|
|
|
|
core::rect<s32> pos(UserConfigParams::m_width>>1, UserConfigParams::m_height>>1,
|
|
|
|
UserConfigParams::m_width>>1, UserConfigParams::m_height>>1);
|
|
|
|
gui::IGUIFont* font = irr_driver->getRaceFont();
|
2008-09-01 20:35:28 -04:00
|
|
|
//I18N: as in "ready, set, go", shown at the beginning of the race
|
2009-07-12 07:54:21 -04:00
|
|
|
core::stringw s=_("Ready!");
|
|
|
|
font->draw(s.c_str(), pos, color, true, true);
|
2008-04-24 03:06:09 -04:00
|
|
|
}
|
|
|
|
break;
|
2008-09-20 19:45:22 -04:00
|
|
|
case SET_PHASE:
|
2008-04-24 03:06:09 -04:00
|
|
|
{
|
2009-07-12 07:54:21 -04:00
|
|
|
static video::SColor color = video::SColor(255, 230, 230, 158);
|
|
|
|
core::rect<s32> pos(UserConfigParams::m_width>>1, UserConfigParams::m_height>>1,
|
|
|
|
UserConfigParams::m_width>>1, UserConfigParams::m_height>>1);
|
|
|
|
gui::IGUIFont* font = irr_driver->getRaceFont();
|
2008-09-01 20:35:28 -04:00
|
|
|
//I18N: as in "ready, set, go", shown at the beginning of the race
|
2009-07-12 07:54:21 -04:00
|
|
|
core::stringw s=_("Set!");
|
|
|
|
font->draw(s.c_str(), pos, color, true, true);
|
2008-04-24 03:06:09 -04:00
|
|
|
}
|
|
|
|
break;
|
2008-09-20 19:45:22 -04:00
|
|
|
case GO_PHASE:
|
2008-04-24 03:06:09 -04:00
|
|
|
{
|
2009-07-12 07:54:21 -04:00
|
|
|
static video::SColor color = video::SColor(255, 100, 209, 100);
|
|
|
|
core::rect<s32> pos(UserConfigParams::m_width>>1, UserConfigParams::m_height>>1,
|
|
|
|
UserConfigParams::m_width>>1, UserConfigParams::m_height>>1);
|
|
|
|
gui::IGUIFont* font = irr_driver->getRaceFont();
|
2008-09-01 20:35:28 -04:00
|
|
|
//I18N: as in "ready, set, go", shown at the beginning of the race
|
2009-07-12 07:54:21 -04:00
|
|
|
core::stringw s=_("Go!");
|
|
|
|
font->draw(s.c_str(), pos, color, true, true);
|
2008-04-24 03:06:09 -04:00
|
|
|
}
|
|
|
|
break;
|
2008-02-12 20:02:02 -05:00
|
|
|
default:
|
|
|
|
break;
|
2007-05-27 12:01:53 -04:00
|
|
|
} // switch
|
2009-11-23 00:20:05 -05:00
|
|
|
} // drawGlobalReadySetGo
|