- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
int turn = m_mapObject->getTurnSpeed();
//НЕ НАДО ТУТ ОПТИМИЗИРОВАТЬ /= 45 !!!!
if (turn != 0) {
if (turn > 0) {
// qDebug() << "Turn plus";
turn /= 45;
if (turn < 4) turn = 4;
if (turn > 8) turn = 8;
} else {
// qDebug() << "Turn minus";
turn /= 45;
if (turn > -4) turn = -4;
if (turn < -8) turn = -8;
}
paint.drawLine(QPoint(0,-speed),QPoint(turn,-speed));
}
Пруф: http://ideone.com/E7ZqWG
bormand кончил и закурил. Юнит-тест:
Кстати, его 10-летний сын написал свою вторую игру, 2k строк на диалекте лиспа.
http://1k3c.com
К чему это я? Пойду в своё колесо, свернусь комочком и порыдаю над своими тупостью и ленью.
Jeff Dean was forced to invent asynchronous APIs one day when he optimized a function so that it returned before it was invoked.
a = abs(turn). Здесь код читается не совсем так, как кажется на первый взгляд - (turn+s)^s, у плюса приоритет больше. При s=0 получается (turn+0)^0 -> turn, при s=-1 получается (turn-1)^(-1) -> ~(turn-1) -> -turn (в процах, емнип, neg через побитовый not так и запилен).
To be continued...
(180-a)>>31 - аналогично, если a>180 - 0xFFFFFFFF, иначе 0
Эти значения далее будут использоваться как маски, чтобы реализовать подобие тернарника.
To be continued...
To be continued...
По сути там a > 360 ? 8 : a > 180 ? a / 45 : 4.
Ну и последнее +s^s восстанавливает знак числа. Вот и всё байтоёбство, ничего особо сложного :)
//НЕ НАДО ТУТ ОПТИМИЗИРОВАТЬ /= 45 !!!!
//НЕ НАДО ТУТ ОПТИМИЗИРОВАТЬ /= 45 !!!!