Applied jmimu's patch which shows players affected by attachments
and explosion in the player icon list, and 'animates' if a kart is overtaken another kart. Thanks a lot for this patch! git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@5856 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
parent
0e84cdf091
commit
10616dab38
BIN
data/models/anchor-attach-icon.png
Normal file
BIN
data/models/anchor-attach-icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.1 KiB |
BIN
data/models/bomb-attach-icon.png
Normal file
BIN
data/models/bomb-attach-icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
@ -17,5 +17,8 @@
|
||||
<material name="anchor-icon.png" clampU="Y" clampV="Y" transparency="Y" light="N" ignore="Y"/>
|
||||
<material name="plunger-icon.png" transparency="Y" light="N"/>
|
||||
<material name="parachute-icon.png" clampU="Y" clampV="Y" ignore="Y"/>
|
||||
<material name="anchor-attach-icon.png" clampU="Y" clampV="Y" transparency="Y" light="N" ignore="Y"/>
|
||||
<material name="parachute-attach-icon.png" clampU="Y" clampV="Y" ignore="Y"/>
|
||||
<material name="bomb-attach-icon.png" clampU="Y" clampV="Y" ignore="Y"/>
|
||||
</materials>
|
||||
|
||||
|
BIN
data/models/parachute-attach-icon.png
Normal file
BIN
data/models/parachute-attach-icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
@ -20,11 +20,12 @@
|
||||
#include "items/attachment_manager.hpp"
|
||||
|
||||
#include "graphics/irr_driver.hpp"
|
||||
#include "graphics/material_manager.hpp"
|
||||
#include "io/file_manager.hpp"
|
||||
|
||||
AttachmentManager *attachment_manager = 0;
|
||||
|
||||
struct initAttachmentType {attachmentType attachment; const char *file;};
|
||||
struct initAttachmentType {attachmentType attachment; const char *file; const char *icon_file;};
|
||||
|
||||
/* Some explanations to the attachments:
|
||||
Parachute: This will increase the air friction, reducing the maximum speed.
|
||||
@ -45,11 +46,11 @@ struct initAttachmentType {attachmentType attachment; const char *file;};
|
||||
|
||||
initAttachmentType iat[]=
|
||||
{
|
||||
{ATTACH_PARACHUTE, "parachute.b3d"},
|
||||
{ATTACH_BOMB, "bomb.b3d"},
|
||||
{ATTACH_ANVIL, "anchor.b3d"},
|
||||
{ATTACH_TINYTUX, "reset-button.b3d"},
|
||||
{ATTACH_MAX, ""},
|
||||
{ATTACH_PARACHUTE, "parachute.b3d", "parachute-attach-icon.png"},
|
||||
{ATTACH_BOMB, "bomb.b3d", "bomb-attach-icon.png"},
|
||||
{ATTACH_ANVIL, "anchor.b3d", "anchor-attach-icon.png"},
|
||||
{ATTACH_TINYTUX, "reset-button.b3d",""},
|
||||
{ATTACH_MAX, "", ""},
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -70,6 +71,12 @@ void AttachmentManager::loadModels()
|
||||
// have to be in memory till the end of the game.
|
||||
std::string full_path = file_manager->getModelFile(iat[i].file);
|
||||
m_attachments[iat[i].attachment]=irr_driver->getAnimatedMesh(full_path);
|
||||
|
||||
std::string full_icon_path = file_manager->getModelFile(iat[i].icon_file);
|
||||
m_all_icons[iat[i].attachment]=material_manager->getMaterial(full_icon_path,
|
||||
/* full_path */ false,
|
||||
/*make_permanent */ true);
|
||||
|
||||
} // for
|
||||
} // reInit
|
||||
|
||||
|
@ -29,6 +29,7 @@ class AttachmentManager
|
||||
{
|
||||
private:
|
||||
scene::IAnimatedMesh *m_attachments[ATTACH_MAX];
|
||||
Material *m_all_icons [ATTACH_MAX];
|
||||
public:
|
||||
AttachmentManager() {};
|
||||
/** Returns the mest for a certain attachment.
|
||||
@ -36,6 +37,10 @@ public:
|
||||
scene::IAnimatedMesh *getMesh(attachmentType type) const {return m_attachments[type]; }
|
||||
void removeTextures ();
|
||||
void loadModels ();
|
||||
/** Returns the icon to display in the race gui if a kart
|
||||
* has an attachment. */
|
||||
const Material*
|
||||
getIcon (int type) const {return m_all_icons [type];}
|
||||
};
|
||||
|
||||
extern AttachmentManager *attachment_manager;
|
||||
|
@ -75,8 +75,16 @@ public:
|
||||
void forceRescue();
|
||||
void update(float dt);
|
||||
// ------------------------------------------------------------------------
|
||||
/** Returns true if an emergency animation is being played.
|
||||
*/
|
||||
/** Returns true if an emergency animation is being played. */
|
||||
bool playingEmergencyAnimation() const {return m_kart_mode!=EA_NONE; }
|
||||
|
||||
/** Returns if a rescue animation is being shown. */
|
||||
bool playingRescueAnimation() const {return m_kart_mode==EA_RESCUE; }
|
||||
|
||||
/** Returns if an explosion animation is being shown. */
|
||||
bool playingExplosionAnimation() const {return m_kart_mode==EA_EXPLOSION; }
|
||||
|
||||
/** Returns the timer for the currently played animation. */
|
||||
const float getAnimationTimer() const {return m_timer;}
|
||||
}; // EmergencyAnimation
|
||||
#endif
|
||||
|
@ -250,11 +250,10 @@ public:
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
/** Returns the current attachment. */
|
||||
Attachment *getAttachment()
|
||||
{
|
||||
return m_attachment;
|
||||
} // getAttachment
|
||||
|
||||
const Attachment* getAttachment() const {return m_attachment; }
|
||||
// ------------------------------------------------------------------------
|
||||
/** Returns the current attachment, non-const version. */
|
||||
Attachment* getAttachment() {return m_attachment; }
|
||||
// ------------------------------------------------------------------------
|
||||
/** Returns the camera of this kart (or NULL if no camera is attached
|
||||
* to this kart). */
|
||||
|
@ -31,6 +31,9 @@
|
||||
#include "utils/translation.hpp"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/** Constructs the linear world. Note that here no functions can be called
|
||||
* that use World::getWorld(), since it is not yet defined.
|
||||
*/
|
||||
LinearWorld::LinearWorld() : World()
|
||||
{
|
||||
m_kart_display_info = NULL;
|
||||
@ -39,15 +42,20 @@ LinearWorld::LinearWorld() : World()
|
||||
} // LinearWorld
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
/** Actually initialises the world, i.e. creates all data structures to
|
||||
* for all karts etc. In init functions can be called that use
|
||||
* World::getWorld().
|
||||
*/
|
||||
void LinearWorld::init()
|
||||
{
|
||||
World::init();
|
||||
const unsigned int kart_amount = m_karts.size();
|
||||
|
||||
m_position_index.resize(kart_amount);
|
||||
m_kart_display_info = new RaceGUIBase::KartIconDisplayInfo[kart_amount];
|
||||
|
||||
for(unsigned int n=0; n<kart_amount; n++)
|
||||
{
|
||||
m_position_index[n] = n;
|
||||
KartInfo info;
|
||||
info.m_track_sector = QuadGraph::UNKNOWN_SECTOR;
|
||||
info.m_last_valid_sector = 0;
|
||||
@ -98,7 +106,7 @@ void LinearWorld::restartRace()
|
||||
const unsigned int kart_amount = m_karts.size();
|
||||
for(unsigned int i=0; i<kart_amount; i++)
|
||||
{
|
||||
KartInfo& info = m_kart_info[i];
|
||||
KartInfo& info = m_kart_info[i];
|
||||
info.m_track_sector = QuadGraph::UNKNOWN_SECTOR;
|
||||
info.m_last_valid_sector = 0;
|
||||
info.m_lap_start_time = 0;
|
||||
@ -734,6 +742,7 @@ void LinearWorld::updateRacePosition()
|
||||
#endif
|
||||
|
||||
kart->setPosition(p);
|
||||
m_position_index[p-1] = i;
|
||||
// Switch on faster music if not already done so, if the
|
||||
// first kart is doing its last lap, and if the estimated
|
||||
// remaining time is less than 30 seconds.
|
||||
|
@ -61,6 +61,9 @@ private:
|
||||
|
||||
};
|
||||
|
||||
/** This contains a mapping from race position to kart index. */
|
||||
std::vector<int> m_position_index;
|
||||
|
||||
protected:
|
||||
RaceGUIBase::KartIconDisplayInfo* m_kart_display_info;
|
||||
|
||||
@ -98,7 +101,9 @@ public:
|
||||
virtual RaceGUIBase::KartIconDisplayInfo*
|
||||
getKartsDisplayInfo();
|
||||
virtual void moveKartAfterRescue(Kart* kart);
|
||||
|
||||
/** Returns the kart with position p, 1<=p<=num_karts). */
|
||||
const Kart* getKartAtPosition(unsigned int p) const
|
||||
{ return m_karts[m_position_index[p-1]]; }
|
||||
virtual void restartRace();
|
||||
|
||||
virtual bool raceHasLaps(){ return true; }
|
||||
|
@ -34,7 +34,11 @@ using namespace irr;
|
||||
#include "io/file_manager.hpp"
|
||||
#include "input/input.hpp"
|
||||
#include "input/input_manager.hpp"
|
||||
#include "items/attachment.hpp"
|
||||
#include "items/attachment_manager.hpp"
|
||||
#include "items/powerup_manager.hpp"
|
||||
#include "karts/kart_properties_manager.hpp"
|
||||
#include "modes/linear_world.hpp"
|
||||
#include "modes/world.hpp"
|
||||
#include "race/race_manager.hpp"
|
||||
#include "tracks/track.hpp"
|
||||
@ -92,6 +96,9 @@ RaceGUI::RaceGUI()
|
||||
m_string_ready = _("Ready!");
|
||||
m_string_set = _("Set!");
|
||||
m_string_go = _("Go!");
|
||||
|
||||
m_dist_show_overlap=2;
|
||||
m_icons_inertia=2;
|
||||
} // RaceGUI
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -113,13 +120,15 @@ void RaceGUI::createMarkerTexture()
|
||||
while(npower2<num_karts) npower2*=2;
|
||||
|
||||
int radius = (m_marker_rendered_size>>1)-1;
|
||||
IrrDriver::RTTProvider rttProvider(core::dimension2du(m_marker_rendered_size * npower2,
|
||||
m_marker_rendered_size),
|
||||
IrrDriver::RTTProvider rttProvider(core::dimension2du(m_marker_rendered_size
|
||||
*npower2,
|
||||
m_marker_rendered_size),
|
||||
"RaceGUI::markers");
|
||||
scene::ICameraSceneNode *camera = irr_driver->addCameraSceneNode();
|
||||
core::matrix4 projection;
|
||||
projection.buildProjectionMatrixOrthoLH((float)(m_marker_rendered_size*npower2),
|
||||
(float)(m_marker_rendered_size), -1.0f, 1.0f);
|
||||
(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);
|
||||
@ -144,11 +153,12 @@ void RaceGUI::createMarkerTexture()
|
||||
const std::string& kart_ident = race_manager->getKartIdent(i);
|
||||
assert(kart_ident.size() > 0);
|
||||
|
||||
const KartProperties *kp = kart_properties_manager->getKart(kart_ident);
|
||||
const KartProperties *kp=kart_properties_manager->getKart(kart_ident);
|
||||
assert(kp != NULL);
|
||||
|
||||
core::vector2df center((float)((m_marker_rendered_size>>1)+i*m_marker_rendered_size),
|
||||
(float)(m_marker_rendered_size>>1) );
|
||||
core::vector2df center((float)((m_marker_rendered_size>>1)
|
||||
+i*m_marker_rendered_size),
|
||||
(float)(m_marker_rendered_size>>1) );
|
||||
int count = kp->getShape();
|
||||
video::ITexture *t = kp->getMinimapIcon();
|
||||
if(t)
|
||||
@ -172,8 +182,10 @@ void RaceGUI::createMarkerTexture()
|
||||
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);
|
||||
irr_driver->getVideoDriver()->draw2DVertexPrimitiveList(vertices,
|
||||
count, index, count-2,
|
||||
video::EVT_STANDARD,
|
||||
scene::EPT_TRIANGLE_FAN);
|
||||
delete [] vertices;
|
||||
delete [] index;
|
||||
} // if special minimap icon defined
|
||||
@ -193,13 +205,15 @@ void RaceGUI::createMarkerTexture()
|
||||
void RaceGUI::createRegularPolygon(unsigned int n, float radius,
|
||||
const core::vector2df ¢er,
|
||||
const video::SColor &color,
|
||||
video::S3DVertex *v, unsigned short int *index)
|
||||
video::S3DVertex *v,
|
||||
unsigned short int *index)
|
||||
{
|
||||
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);
|
||||
core::vector2df X = center + core::vector2df( sin(p)*radius,
|
||||
-cos(p)*radius);
|
||||
v[i].Pos.X = X.X;
|
||||
v[i].Pos.Y = X.Y;
|
||||
v[i].Color = color;
|
||||
@ -217,13 +231,18 @@ void RaceGUI::renderGlobal(float dt)
|
||||
{
|
||||
cleanupMessages(dt);
|
||||
|
||||
// Special case : when 3 players play, use 4th window to display such stuff (but we must clear it)
|
||||
if (race_manager->getNumLocalPlayers() == 3 && !GUIEngine::ModalDialog::isADialogActive())
|
||||
// Special case : when 3 players play, use 4th window to display such
|
||||
// stuff (but we must clear it)
|
||||
if (race_manager->getNumLocalPlayers() == 3 &&
|
||||
!GUIEngine::ModalDialog::isADialogActive())
|
||||
{
|
||||
static video::SColor black = video::SColor(255,0,0,0);
|
||||
irr_driver->getVideoDriver()->draw2DRectangle(black,
|
||||
core::rect<s32>(UserConfigParams::m_width/2, UserConfigParams::m_height/2,
|
||||
UserConfigParams::m_width, UserConfigParams::m_height));
|
||||
irr_driver->getVideoDriver()
|
||||
->draw2DRectangle(black,
|
||||
core::rect<s32>(UserConfigParams::m_width/2,
|
||||
UserConfigParams::m_height/2,
|
||||
UserConfigParams::m_width,
|
||||
UserConfigParams::m_height));
|
||||
}
|
||||
|
||||
World *world = World::getWorld();
|
||||
@ -268,19 +287,25 @@ void RaceGUI::renderPlayerView(const Kart *kart)
|
||||
{
|
||||
int offset_y = viewport.UpperLeftCorner.Y;
|
||||
|
||||
const int screen_width = viewport.LowerRightCorner.X - viewport.UpperLeftCorner.X;
|
||||
const int plunger_size = viewport.LowerRightCorner.Y - viewport.UpperLeftCorner.Y;
|
||||
int plunger_x = viewport.UpperLeftCorner.X + screen_width/2 - plunger_size/2;
|
||||
const int screen_width = viewport.LowerRightCorner.X
|
||||
- viewport.UpperLeftCorner.X;
|
||||
const int plunger_size = viewport.LowerRightCorner.Y
|
||||
- viewport.UpperLeftCorner.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());
|
||||
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, NULL /* clip */,
|
||||
NULL /* color */, true /* alpha */);
|
||||
irr_driver->getVideoDriver()->draw2DImage(t, dest, source,
|
||||
NULL /* clip */,
|
||||
NULL /* color */,
|
||||
true /* alpha */);
|
||||
}
|
||||
|
||||
|
||||
@ -349,8 +374,10 @@ void RaceGUI::drawGlobalMiniMap()
|
||||
Vec3 draw_at;
|
||||
world->getTrack()->mapPoint2MiniMap(xyz, &draw_at);
|
||||
// int marker_height = m_marker->getOriginalSize().Height;
|
||||
core::rect<s32> source(i *m_marker_rendered_size, 0,
|
||||
(i+1)*m_marker_rendered_size, m_marker_rendered_size);
|
||||
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->getController()->isPlayerController()
|
||||
? m_marker_player_size
|
||||
: m_marker_ai_size )>>1;
|
||||
@ -358,7 +385,8 @@ void RaceGUI::drawGlobalMiniMap()
|
||||
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);
|
||||
irr_driver->getVideoDriver()->draw2DImage(m_marker, position, source,
|
||||
NULL, NULL, true);
|
||||
} // for i<getNumKarts
|
||||
} // drawGlobalMiniMap
|
||||
|
||||
@ -366,18 +394,21 @@ void RaceGUI::drawGlobalMiniMap()
|
||||
// Draw players icons and their times (if defined in the current mode).
|
||||
void RaceGUI::drawGlobalPlayerIcons(const KartIconDisplayInfo* info)
|
||||
{
|
||||
int x = 5;
|
||||
int x_base = 15;
|
||||
int y_base = 20;
|
||||
|
||||
// Special case : when 3 players play, use 4th window to display such stuff
|
||||
if (race_manager->getNumLocalPlayers() == 3)
|
||||
{
|
||||
x = UserConfigParams::m_width/2 + 5;
|
||||
x_base = UserConfigParams::m_width/2 + 15;
|
||||
y_base = UserConfigParams::m_height/2 + 20;
|
||||
}
|
||||
|
||||
|
||||
int x;
|
||||
int y;
|
||||
float previous_distance=10000.0;//far ahead
|
||||
|
||||
|
||||
int ICON_WIDTH=(int)(40*(UserConfigParams::m_width/800.0f));
|
||||
int ICON_PLAYER_WIDTH=(int)(50*(UserConfigParams::m_width/800.0f));
|
||||
if(UserConfigParams::m_height<600)
|
||||
@ -386,51 +417,179 @@ void RaceGUI::drawGlobalPlayerIcons(const KartIconDisplayInfo* info)
|
||||
ICON_PLAYER_WIDTH = 35;
|
||||
}
|
||||
|
||||
int previous_x=x_base;
|
||||
int previous_y=y_base-ICON_PLAYER_WIDTH-2;
|
||||
|
||||
gui::ScalableFont* font = GUIEngine::getFont();
|
||||
World *world = World::getWorld();
|
||||
LinearWorld *world = (LinearWorld*)(World::getWorld());
|
||||
const unsigned int kart_amount = world->getNumKarts();
|
||||
for(unsigned int i = 0; i < kart_amount ; i++)
|
||||
|
||||
for(int position = 1; position <= (int)kart_amount ; position++)
|
||||
{
|
||||
Kart* kart = world->getKart(i);
|
||||
const Kart *kart = world->getKartAtPosition(position);
|
||||
if(kart->isEliminated()) continue;
|
||||
const int position = kart->getPosition();
|
||||
unsigned int kart_id = kart->getWorldKartId();
|
||||
|
||||
y = y_base + ( (position == -1 ? i : position-1)*(ICON_PLAYER_WIDTH+2));
|
||||
|
||||
if (info[i].m_text.size() > 0)
|
||||
//x,y is the target position
|
||||
int lap = info[kart->getWorldKartId()].lap;
|
||||
float distance=
|
||||
world->getDistanceDownTrackForKart(kart_id)
|
||||
+world->getTrack()->getTrackLength()*lap;
|
||||
if (previous_distance-distance<m_dist_show_overlap)
|
||||
{
|
||||
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].m_text.c_str();
|
||||
//linear translation : form (0,ICON_PLAYER_WIDTH+2) to
|
||||
// (previous_x-x_base+(ICON_PLAYER_WIDTH+2)/2,0)
|
||||
x=(int)(x_base+(1-(previous_distance-distance)
|
||||
/m_dist_show_overlap)
|
||||
*(previous_x-x_base+(ICON_PLAYER_WIDTH+2)/2));
|
||||
y=(int)(previous_y+(previous_distance-distance)
|
||||
/m_dist_show_overlap*(ICON_PLAYER_WIDTH+2));
|
||||
}
|
||||
else
|
||||
{
|
||||
x=x_base;
|
||||
y=previous_y+ICON_PLAYER_WIDTH+2;
|
||||
}
|
||||
previous_x=x;//save coord of the previous kart in list
|
||||
previous_y=y;
|
||||
previous_distance=distance;
|
||||
|
||||
//initialize m_previous_icons_position
|
||||
if (m_previous_icons_position.size()<kart_amount)
|
||||
{
|
||||
core::vector2d<s32> pos(x,y);
|
||||
m_previous_icons_position.push_back(pos);
|
||||
}
|
||||
|
||||
//soft movement using previous position:
|
||||
x=(int)((x+m_previous_icons_position[kart_id].X*m_icons_inertia)
|
||||
/(m_icons_inertia+1));
|
||||
y=(int)((y+m_previous_icons_position[kart_id].Y*m_icons_inertia)
|
||||
/(m_icons_inertia+1));
|
||||
|
||||
//save position for next time
|
||||
m_previous_icons_position[kart_id].X=x;
|
||||
m_previous_icons_position[kart_id].Y=y;
|
||||
|
||||
if (info[kart_id].m_text.size() > 0)
|
||||
{
|
||||
video::SColor color = video::SColor(255,
|
||||
(int)(255*info[kart_id].r),
|
||||
(int)(255*info[kart_id].g),
|
||||
(int)(255*info[kart_id].b) );
|
||||
core::rect<s32> pos(x+ICON_PLAYER_WIDTH, y+5,
|
||||
x+ICON_PLAYER_WIDTH, y+5);
|
||||
core::stringw s=info[kart_id].m_text.c_str();
|
||||
font->draw(s.c_str(), pos, color);
|
||||
}
|
||||
|
||||
if (info[i].special_title.size() > 0)
|
||||
|
||||
if (info[kart_id].special_title.size() > 0)
|
||||
{
|
||||
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());
|
||||
core::rect<s32> pos(x+ICON_PLAYER_WIDTH, y+5,
|
||||
x+ICON_PLAYER_WIDTH, y+5);
|
||||
core::stringw s(info[kart_id].special_title.c_str());
|
||||
font->draw(s.c_str(), pos, color);
|
||||
}
|
||||
|
||||
// draw icon
|
||||
video::ITexture *icon =
|
||||
kart->getKartProperties()->getIconMaterial()->getTexture();
|
||||
int w = kart->getController()->isPlayerController() ? ICON_PLAYER_WIDTH
|
||||
: ICON_WIDTH;
|
||||
int w =
|
||||
kart->getController()->isPlayerController() ? ICON_PLAYER_WIDTH
|
||||
: ICON_WIDTH;
|
||||
const core::rect<s32> pos(x, y, x+w, y+w);
|
||||
|
||||
// Fixes crash bug, why are certain icons not showing up?
|
||||
if (icon != NULL)
|
||||
if ((icon != NULL) && (!kart->playingEmergencyAnimation()))
|
||||
{
|
||||
const core::rect<s32> rect(core::position2d<s32>(0,0), icon->getOriginalSize());
|
||||
irr_driver->getVideoDriver()->draw2DImage(icon, pos, rect, NULL, NULL, true);
|
||||
const core::rect<s32> rect(core::position2d<s32>(0,0),
|
||||
icon->getOriginalSize());
|
||||
irr_driver->getVideoDriver()->draw2DImage(icon, pos, rect,
|
||||
NULL, NULL, true);
|
||||
}
|
||||
|
||||
} // next kart
|
||||
|
||||
//draw status info
|
||||
|
||||
if ((icon != NULL) && (kart->playingRescueAnimation()))
|
||||
{
|
||||
//icon fades to the left
|
||||
float t_anim=100*sin(0.5f*M_PI*kart->getAnimationTimer());
|
||||
const core::rect<s32> rect1(core::position2d<s32>(0,0),
|
||||
icon->getOriginalSize());
|
||||
const core::rect<s32> pos1((int)(x-t_anim), y,
|
||||
(int)(x+w-t_anim), y+w);
|
||||
irr_driver->getVideoDriver()->draw2DImage(icon, pos1, rect1,
|
||||
NULL, NULL, true);
|
||||
}
|
||||
|
||||
if ((icon != NULL) && (kart->playingExplosionAnimation()))
|
||||
{
|
||||
//exploses into 4 parts
|
||||
float t_anim=50.0f*sin(0.5f*M_PI*kart->getAnimationTimer());
|
||||
u16 icon_size_x=icon->getOriginalSize().Width;
|
||||
u16 icon_size_y=icon->getOriginalSize().Height;
|
||||
|
||||
const core::rect<s32> rect1(0, 0, icon_size_x/2,icon_size_y/2);
|
||||
const core::rect<s32> pos1((int)(x-t_anim), (int)(y-t_anim),
|
||||
(int)(x+w/2-t_anim),
|
||||
(int)(y+w/2-t_anim));
|
||||
irr_driver->getVideoDriver()->draw2DImage(icon, pos1, rect1,
|
||||
NULL, NULL, true);
|
||||
|
||||
const core::rect<s32> rect2(icon_size_x/2,0,
|
||||
icon_size_x,icon_size_y/2);
|
||||
const core::rect<s32> pos2((int)(x+w/2+t_anim),
|
||||
(int)(y-t_anim),
|
||||
(int)(x+w+t_anim),
|
||||
(int)(y+w/2-t_anim));
|
||||
irr_driver->getVideoDriver()->draw2DImage(icon, pos2, rect2,
|
||||
NULL, NULL, true);
|
||||
|
||||
const core::rect<s32> rect3(0, icon_size_y/2, icon_size_x/2,icon_size_y);
|
||||
const core::rect<s32> pos3((int)(x-t_anim), (int)(y+w/2+t_anim),
|
||||
(int)(x+w/2-t_anim), (int)(y+w+t_anim));
|
||||
irr_driver->getVideoDriver()->draw2DImage(icon, pos3, rect3, NULL, NULL, true);
|
||||
|
||||
const core::rect<s32> rect4(icon_size_x/2,icon_size_y/2,icon_size_x,icon_size_y);
|
||||
const core::rect<s32> pos4((int)(x+w/2+t_anim), (int)(y+w/2+t_anim),
|
||||
(int)(x+w+t_anim), (int)(y+w+t_anim));
|
||||
irr_driver->getVideoDriver()->draw2DImage(icon, pos4, rect4, NULL, NULL, true);
|
||||
}
|
||||
|
||||
//Plunger
|
||||
if (kart->hasViewBlockedByPlunger())
|
||||
{
|
||||
video::ITexture *icon_plunger =
|
||||
powerup_manager->getIcon(PowerupManager::POWERUP_PLUNGER)->getTexture();
|
||||
if (icon_plunger != NULL)
|
||||
{
|
||||
const core::rect<s32> rect(core::position2d<s32>(0,0),
|
||||
icon_plunger->getOriginalSize());
|
||||
const core::rect<s32> pos1(x+10, y-10, x+w+10, y+w-10);
|
||||
irr_driver->getVideoDriver()->draw2DImage(icon_plunger, pos1,
|
||||
rect, NULL, NULL,
|
||||
true);
|
||||
}
|
||||
}
|
||||
//attachment
|
||||
if (kart->getAttachment()->getType() != ATTACH_NOTHING)
|
||||
{
|
||||
video::ITexture *icon_attachment =
|
||||
attachment_manager->getIcon(kart->getAttachment()->getType())
|
||||
->getTexture();
|
||||
if (icon_attachment != NULL)
|
||||
{
|
||||
const core::rect<s32> rect(core::position2d<s32>(0,0),
|
||||
icon_attachment->getOriginalSize());
|
||||
const core::rect<s32> pos1(x-20, y-10, x+w-20, y+w-10);
|
||||
irr_driver->getVideoDriver()->draw2DImage(icon_attachment,
|
||||
pos1, rect, NULL,
|
||||
NULL, true);
|
||||
}
|
||||
}
|
||||
|
||||
} //next position
|
||||
} // drawGlobalPlayerIcons
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -449,7 +608,8 @@ void RaceGUI::drawPowerupIcons(const Kart* kart,
|
||||
|
||||
int itemSpacing = (int)(std::min(scaling.X, scaling.Y)*30);
|
||||
|
||||
int x1 = viewport.UpperLeftCorner.X + viewport.getWidth()/2 - (n * itemSpacing)/2;
|
||||
int x1 = viewport.UpperLeftCorner.X + viewport.getWidth()/2
|
||||
- (n * itemSpacing)/2;
|
||||
int y1 = viewport.UpperLeftCorner.Y + (int)(20 * scaling.Y);
|
||||
|
||||
assert(powerup != NULL);
|
||||
@ -656,23 +816,30 @@ void RaceGUI::drawLap(const KartIconDisplayInfo* info, const Kart* kart,
|
||||
if (m_minimap_on_left)
|
||||
{
|
||||
// check if mini-map is within Y coords of this player.
|
||||
// if the mini-map is not even in the viewport of this player, don't bother placing
|
||||
// the lap text at the right of the minimap.
|
||||
if (UserConfigParams::m_height - m_map_bottom - m_map_height > viewport.LowerRightCorner.Y)
|
||||
// if the mini-map is not even in the viewport of this player, don't
|
||||
// bother placing the lap text at the right of the minimap.
|
||||
if (UserConfigParams::m_height - m_map_bottom - m_map_height
|
||||
> viewport.LowerRightCorner.Y)
|
||||
{
|
||||
pos.UpperLeftCorner.X = viewport.UpperLeftCorner.X + (int)(0.1f*UserConfigParams::m_width);
|
||||
pos.UpperLeftCorner.X = viewport.UpperLeftCorner.X
|
||||
+ (int)(0.1f*UserConfigParams::m_width);
|
||||
}
|
||||
else
|
||||
{
|
||||
// place lap text at the right of the mini-map
|
||||
const int calculated_x = viewport.UpperLeftCorner.X + (int)(0.05f*UserConfigParams::m_width);
|
||||
pos.UpperLeftCorner.X = std::max(calculated_x, m_map_right_side_x + 15); // don't overlap minimap
|
||||
const int calculated_x = viewport.UpperLeftCorner.X
|
||||
+ (int)(0.05f*UserConfigParams::m_width);
|
||||
// don't overlap minimap
|
||||
pos.UpperLeftCorner.X = std::max(calculated_x,
|
||||
m_map_right_side_x + 15);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// mini-map is on the right, and lap text on right, so no overlap possible
|
||||
pos.UpperLeftCorner.X = viewport.UpperLeftCorner.X + (int)(0.05f*UserConfigParams::m_width);
|
||||
// mini-map is on the right, and lap text on right,
|
||||
// so no overlap possible
|
||||
pos.UpperLeftCorner.X = viewport.UpperLeftCorner.X
|
||||
+ (int)(0.05f*UserConfigParams::m_width);
|
||||
}
|
||||
|
||||
gui::ScalableFont* font = GUIEngine::getFont();
|
||||
@ -735,7 +902,8 @@ void RaceGUI::drawAllMessages(const Kart* kart,
|
||||
const int w = (viewport.LowerRightCorner.X + viewport.UpperLeftCorner.X)/2;
|
||||
|
||||
// draw less important first, at the very top of the screen
|
||||
for (AllMessageType::const_iterator i = m_messages.begin(); i != m_messages.end(); ++i)
|
||||
for (AllMessageType::const_iterator i = m_messages.begin();
|
||||
i != m_messages.end(); ++i)
|
||||
{
|
||||
TimedMessage const &msg = *i;
|
||||
if (!msg.m_important)
|
||||
@ -744,8 +912,9 @@ void RaceGUI::drawAllMessages(const Kart* kart,
|
||||
if (msg.m_kart && msg.m_kart!=kart) continue;
|
||||
|
||||
core::rect<s32> pos(x - w/2, y, x + w/2, y + m_max_font_height);
|
||||
GUIEngine::getSmallFont()->draw(core::stringw(msg.m_message.c_str()).c_str(),
|
||||
pos, msg.m_color, true /* hcenter */, true /* vcenter */);
|
||||
GUIEngine::getSmallFont()->draw(
|
||||
core::stringw(msg.m_message.c_str()).c_str(),
|
||||
pos, msg.m_color, true /* hcenter */, true /* vcenter */);
|
||||
y -= m_small_font_max_height;
|
||||
}
|
||||
}
|
||||
@ -756,18 +925,21 @@ void RaceGUI::drawAllMessages(const Kart* kart,
|
||||
// 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"
|
||||
for (AllMessageType::const_iterator i = m_messages.begin(); i != m_messages.end(); ++i)
|
||||
for (AllMessageType::const_iterator i = m_messages.begin();
|
||||
i != m_messages.end(); ++i)
|
||||
{
|
||||
TimedMessage const &msg = *i;
|
||||
|
||||
if (!msg.m_important) continue; // less important messages were already displayed
|
||||
// less important messages were already displayed
|
||||
if (!msg.m_important) continue;
|
||||
|
||||
// Display only messages for all karts, or messages for this kart
|
||||
if (msg.m_kart && msg.m_kart!=kart) continue;
|
||||
|
||||
core::rect<s32> pos(x - w/2, y, x + w/2, y + m_max_font_height);
|
||||
GUIEngine::getFont()->draw(core::stringw(msg.m_message.c_str()).c_str(),
|
||||
pos, msg.m_color, true /* hcenter */, true /* vcenter */);
|
||||
pos, msg.m_color, true /* hcenter */,
|
||||
true /* vcenter */);
|
||||
y += m_max_font_height;
|
||||
} // for i in all messages
|
||||
} // drawAllMessages
|
||||
@ -777,10 +949,12 @@ void RaceGUI::drawAllMessages(const Kart* kart,
|
||||
* certain amount of time (unless time<0, then the message is displayed
|
||||
* once).
|
||||
**/
|
||||
void RaceGUI::addMessage(const core::stringw &msg, const Kart *kart, float time,
|
||||
int font_size, const video::SColor &color, bool important)
|
||||
void RaceGUI::addMessage(const core::stringw &msg, const Kart *kart,
|
||||
float time, int font_size,
|
||||
const video::SColor &color, bool important)
|
||||
{
|
||||
m_messages.push_back(TimedMessage(msg, kart, time, font_size, color, important));
|
||||
m_messages.push_back(TimedMessage(msg, kart, time, font_size, color,
|
||||
important));
|
||||
} // addMessage
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -788,7 +962,8 @@ void RaceGUI::addMessage(const core::stringw &msg, const Kart *kart, float time,
|
||||
// usually the title and composer.
|
||||
void RaceGUI::drawGlobalMusicDescription()
|
||||
{
|
||||
if (!UserConfigParams::m_music) return; // show no music description when it's off
|
||||
// show no music description when it's off
|
||||
if (!UserConfigParams::m_music) return;
|
||||
|
||||
gui::IGUIFont* font = GUIEngine::getFont();
|
||||
|
||||
@ -813,7 +988,7 @@ void RaceGUI::drawGlobalMusicDescription()
|
||||
|
||||
const float resize3 = resize*resize*resize;
|
||||
|
||||
// ---- Get song name, and calculate its size, allowing us to position stuff
|
||||
// Get song name, and calculate its size, allowing us to position stuff
|
||||
const MusicInformation* mi = music_manager->getCurrentMusic();
|
||||
if (!mi) return;
|
||||
|
||||
@ -838,14 +1013,18 @@ void RaceGUI::drawGlobalMusicDescription()
|
||||
const int ICON_SIZE = 64;
|
||||
const int y = UserConfigParams::m_height - 80;
|
||||
// the 20 is an arbitrary space left between the note icon and the text
|
||||
const int noteX = (UserConfigParams::m_width / 2) - std::max(textWidth, textWidth2)/2 - ICON_SIZE/2 - 20;
|
||||
const int noteX = (UserConfigParams::m_width / 2)
|
||||
- std::max(textWidth, textWidth2)/2 - ICON_SIZE/2 - 20;
|
||||
const int noteY = y;
|
||||
// the 20 is an arbitrary space left between the note icon and the text
|
||||
const int textXFrom = (UserConfigParams::m_width / 2) - std::max(textWidth, textWidth2)/2 + 20;
|
||||
const int textXTo = (UserConfigParams::m_width / 2) + std::max(textWidth, textWidth2)/2 + 20;
|
||||
const int textXFrom = (UserConfigParams::m_width / 2)
|
||||
- std::max(textWidth, textWidth2)/2 + 20;
|
||||
const int textXTo = (UserConfigParams::m_width / 2)
|
||||
+ std::max(textWidth, textWidth2)/2 + 20;
|
||||
|
||||
// ---- Draw "by" text
|
||||
const int text_y = (int)(UserConfigParams::m_height - 80*(resize3) + 40*(1-resize));
|
||||
const int text_y = (int)(UserConfigParams::m_height - 80*(resize3)
|
||||
+ 40*(1-resize));
|
||||
|
||||
static const video::SColor white = video::SColor(255, 255, 255, 255);
|
||||
if(mi->getComposer()!="")
|
||||
@ -853,27 +1032,31 @@ void RaceGUI::drawGlobalMusicDescription()
|
||||
core::rect<s32> pos_by(textXFrom, text_y+40,
|
||||
textXTo, text_y+40);
|
||||
std::string s="by "+mi->getComposer();
|
||||
font->draw(core::stringw(s.c_str()).c_str(), pos_by, white, true, true);
|
||||
font->draw(core::stringw(s.c_str()).c_str(), pos_by, white,
|
||||
true, true);
|
||||
}
|
||||
|
||||
// ---- Draw "song name" text
|
||||
core::rect<s32> pos(textXFrom, text_y,
|
||||
textXTo, text_y);
|
||||
|
||||
font->draw(thetext.c_str(), pos, white, true /* hcenter */, true /* vcenter */);
|
||||
font->draw(thetext.c_str(), pos, white, true /* hcenter */,
|
||||
true /* vcenter */);
|
||||
|
||||
// Draw music icon
|
||||
int iconSizeX = (int)(ICON_SIZE*resize + x_pulse*resize*resize);
|
||||
int iconSizeY = (int)(ICON_SIZE*resize + y_pulse*resize*resize);
|
||||
|
||||
video::ITexture *t = m_music_icon->getTexture();
|
||||
core::rect<s32> dest(noteX-iconSizeX/2+20, noteY-iconSizeY/2+ICON_SIZE/2,
|
||||
noteX+iconSizeX/2+20, noteY+iconSizeY/2+ICON_SIZE/2);
|
||||
const core::rect<s32> source(core::position2d<s32>(0,0), t->getOriginalSize());
|
||||
core::rect<s32> dest(noteX-iconSizeX/2+20,
|
||||
noteY-iconSizeY/2+ICON_SIZE/2,
|
||||
noteX+iconSizeX/2+20,
|
||||
noteY+iconSizeY/2+ICON_SIZE/2);
|
||||
const core::rect<s32> source(core::position2d<s32>(0,0),
|
||||
t->getOriginalSize());
|
||||
|
||||
irr_driver->getVideoDriver()->draw2DImage(t, dest, source, NULL, NULL, true);
|
||||
|
||||
|
||||
irr_driver->getVideoDriver()->draw2DImage(t, dest, source,
|
||||
NULL, NULL, true);
|
||||
} // drawGlobalMusicDescription
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@ -885,20 +1068,22 @@ void RaceGUI::drawGlobalReadySetGo()
|
||||
{
|
||||
case WorldStatus::READY_PHASE:
|
||||
{
|
||||
//static video::SColor color = video::SColor(255, 230, 168, 158);
|
||||
static video::SColor color = video::SColor(255, 255, 255, 255);
|
||||
core::rect<s32> pos(UserConfigParams::m_width>>1, UserConfigParams::m_height>>1,
|
||||
UserConfigParams::m_width>>1, UserConfigParams::m_height>>1);
|
||||
core::rect<s32> pos(UserConfigParams::m_width>>1,
|
||||
UserConfigParams::m_height>>1,
|
||||
UserConfigParams::m_width>>1,
|
||||
UserConfigParams::m_height>>1);
|
||||
gui::IGUIFont* font = GUIEngine::getTitleFont();
|
||||
font->draw(m_string_ready.c_str(), pos, color, true, true);
|
||||
}
|
||||
break;
|
||||
case WorldStatus::SET_PHASE:
|
||||
{
|
||||
//static video::SColor color = video::SColor(255, 230, 230, 158);
|
||||
static video::SColor color = video::SColor(255, 255, 255, 255);
|
||||
core::rect<s32> pos(UserConfigParams::m_width>>1, UserConfigParams::m_height>>1,
|
||||
UserConfigParams::m_width>>1, UserConfigParams::m_height>>1);
|
||||
core::rect<s32> pos(UserConfigParams::m_width>>1,
|
||||
UserConfigParams::m_height>>1,
|
||||
UserConfigParams::m_width>>1,
|
||||
UserConfigParams::m_height>>1);
|
||||
gui::IGUIFont* font = GUIEngine::getTitleFont();
|
||||
//I18N: as in "ready, set, go", shown at the beginning of the race
|
||||
font->draw(m_string_set.c_str(), pos, color, true, true);
|
||||
@ -906,10 +1091,11 @@ void RaceGUI::drawGlobalReadySetGo()
|
||||
break;
|
||||
case WorldStatus::GO_PHASE:
|
||||
{
|
||||
//static video::SColor color = video::SColor(255, 100, 209, 100);
|
||||
static video::SColor color = video::SColor(255, 255, 255, 255);
|
||||
core::rect<s32> pos(UserConfigParams::m_width>>1, UserConfigParams::m_height>>1,
|
||||
UserConfigParams::m_width>>1, UserConfigParams::m_height>>1);
|
||||
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();
|
||||
gui::IGUIFont* font = GUIEngine::getTitleFont();
|
||||
//I18N: as in "ready, set, go", shown at the beginning of the race
|
||||
|
@ -139,6 +139,12 @@ private:
|
||||
int m_max_font_height;
|
||||
int m_small_font_max_height;
|
||||
|
||||
/** Distance on track to begin showing overlap in drawGlobalPlayerIcons */
|
||||
float m_dist_show_overlap;///can be zero
|
||||
float m_icons_inertia;///can be zero
|
||||
/** previous position of icons */
|
||||
std::vector< core::vector2d<s32> > m_previous_icons_position;
|
||||
|
||||
void createMarkerTexture();
|
||||
void createRegularPolygon(unsigned int n, float radius,
|
||||
const core::vector2df ¢er,
|
||||
|
Loading…
x
Reference in New Issue
Block a user