- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
enum EPlayerStat { ... };
typedef std::pair<EPlayerStat, int> StatDelta;
...
void GameClassT::showTooltipStats(const float2& pos, const std::vector<StatDelta>& statDeltas)
{
//...
if (statDeltas.empty())
return;
// Выбираем тип баббла в зависимости от количества статов, которые в нём нужно отобразить.
// Баббл с последним статом "wish chance" выглядит немного не так, как остальные,
// но возможен (пока что) только для варианта с тремя статами.
Bubble* const bubblesNormal[] =
{
&m_bubbleTooltipStats1SE,
&m_bubbleTooltipStats2SE,
&m_bubbleTooltipStats3SE,
&m_bubbleTooltipStats4SE
};
Bubble* const bubblesWish[] =
{
nullptr,
nullptr,
&m_bubbleTooltipStats3SE_Wish,
nullptr
};
Bubble* const* const bubbles = (statDeltas.end() == std::find_if(statDeltas.begin(), statDeltas.end(),
[](const StatDelta& delta) -> bool { return delta.first == PS_WishChance; }))
? bubblesNormal : bubblesWish;
Bubble& bubble = *bubbles[(statDeltas.size() <= ARRAY_SIZE(bubbles)) ? (statDeltas.size() - 1) : (ARRAY_SIZE(bubbles) - 1)];
if (&bubble == nullptr)
{
RZT_LOG_WARNING("Bubble with %d stats with wish chance is not supported!", statDeltas.size());
return;
}
// Настраиваем выбранный баббл.
//... (здесь вызываются всякие методы через ссылку bubble)
}
Внезапные изменения в спецификации такие внезапные.
Мне всегда становится страшно, когда из-за них я начинаю рожать что-то подобное.
Kirinyale 31.03.2011 12:33 # 0
absolut 31.03.2011 12:53 # 0
Kirinyale 31.03.2011 13:15 # +1
Конкретное (и уже исправленное) Г - ARRAY_SIZE, берущийся в результате некоторых изменений от указателя, а не от массива:
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
Исправленный (т.е. хотя бы работающий) вариант выглядит так (после строки 29):
BOOST_STATIC_ASSERT(ARRAY_SIZE(bubblesNo rmal) == ARRAY_SIZE(bubblesWish));
const size_t numBubbleTypes = ARRAY_SIZE(bubblesNormal);
Ну и далее по коду numBubbleTypes используется вместо ARRAY_SIZE(bubbles).
absolut 31.03.2011 13:28 # +1
Kirinyale 31.03.2011 13:40 # 0
switch (statDeltas.size())
{
case 0: ... break;
case 1: ... break;
case 2: ... break;
default: ...
}
Суть в том, что, в зависимости от размера массива, переданного в параметры, один и тот же код выполняется на разных объектах, расчитанных именно под это количество отображаемых величин (их внешний вид для каждого случая задан в XML, но это уже не суть).
Поэтому вместо свитча и дублирования кода был сделан такой вот временный массив, из которого по индексу выбирался нужный объект, с которым потом всё и делалось. Если бы внутри были не указатели - массив вообще был бы статическим. А вектор не нужен, т.к. количество поддерживаемых вариантов заранее известно (если код потребует больше - лишнее будет отброшено, а в логе появится ошибка).
Всё было красиво до тех пор, пока не появилась зависимость не только от количества, но и от типа отображаемых значений. Массивов стало два, для выбора из них, не долго думая, вколбасилась лямбда (по сути, проверяющая, есть ли в переданном массиве хоть одно значение "особого" типа, меняющего представление)... ну и т.д. :)
RaZeR 31.03.2011 15:58 # 0
Доллары/Евро/рубли?
absolut 31.03.2011 16:08 # +2
RaZeR 31.03.2011 16:12 # +2
Lure Of Chaos 31.03.2011 18:24 # +2
Kirinyale 31.03.2011 16:13 # 0
bugmenot 31.03.2011 18:00 # 0
guest 01.04.2011 15:52 # +2
Kirinyale 01.04.2011 18:05 # 0