私はフローレイアウトを持っています。その中には約900のテーブルがあります。各テーブルは、互いに積み重ねられています。私はそれらをサイズ変更するスライダを持っているので、フローレイアウトのサイズも変更されます。浮動小数点精度が必要です、GUI guiはintを使用します
問題は、表がリニアにサイズ変更されることです。ベースサイズは200x200です。したがって、scale = 1.0の場合、テーブルのwとhは200です。
毎回4%大きくなるたびに固定量でサイズを変更します。つまり、毎回8ピクセルずつ成長すると思います。何が起こるかは、いくつかのサイズ変更が行われる度に、テーブルは9ピクセルだけ増加します。私はどこでもダブルスを使う。私は四捨五入を試みましたが、問題は解決しません。彼らは常に正しい量だけ成長するように私は何をすることができますか?
void LobbyTableManager::changeTableScale(double scale)
{
setTableScale(scale);
}
void LobbyTableManager::setTableScale(double scale)
{
scale += 0.3;
scale *= 2.0;
std::cout << scale << std::endl;
agui::Gui* gotGui = getGui();
float scrollRel = m_vScroll->getRelativeValue();
setScale(scale);
rescaleTables();
resizeFlow();
...
double LobbyTableManager::getTableScale() const
{
return (getInnerWidth()/700.0) * getScale();
}
void LobbyFilterManager::valueChanged(agui::Slider* source,int val)
{
if(source == m_magnifySlider)
{
DISPATCH_LOBBY_EVENT
{
(*it)->changeTableScale((double)val/source->getRange());
}
}
}
void LobbyTableManager::renderBG(GraphicsContext* g, agui::Rectangle& absRect, agui::Rectangle& childRect)
{
int cx, cy, cw, ch;
g->getClippingRect(cx,cy,cw,ch);
g->setClippingRect(absRect.getX(),absRect.getY(),absRect.getWidth(),absRect.getHeight());
float scale = 0.35f;
int w = m_bgSprite->getWidth() * getTableScale() * scale;
int h = m_bgSprite->getHeight() * getTableScale() * scale;
int numX = ceil(absRect.getWidth()/(float)w) + 2;
int numY = ceil(absRect.getHeight()/(float)h) + 2;
float offsetX = m_activeTables[0]->getLocation().getX() - w;
float offsetY = m_activeTables[0]->getLocation().getY() - h;
int startY = childRect.getY() + 1;
if(moo)
{
std::cout << "TS: " << getTableScale() << " Scr: " << m_vScroll->getValue() << " LOC: " << childRect.getY() << " H: " << h << std::endl;
}
if(moo)
{
std::cout << "S=" << startY << ",";
}
int numAttempts = 0;
while(startY + h < absRect.getY() && numAttempts < 1000)
{
startY += h;
if(moo)
{
std::cout << startY << ",";
}
numAttempts++;
}
if(moo)
{
std::cout << "\n";
moo = false;
}
g->holdDrawing();
for(int i = 0; i < numX; ++i)
{
for(int j = 0; j < numY; ++j)
{
g->drawScaledSprite(m_bgSprite,0,0,m_bgSprite->getWidth(),m_bgSprite->getHeight(),
absRect.getX() + (i * w) + (offsetX),absRect.getY() + (j * h) + startY,w,h,0);
}
}
g->unholdDrawing();
g->setClippingRect(cx,cy,cw,ch);
}
void LobbyTable::rescale(double scale)
{
setScale(scale);
float os = getObjectScale();
double x = m_baseHeight * os;
if((int)(x + 0.5) > (int)x)
{
x++;
}
int oldH = getHeight();
setSize(m_baseWidth * os, floor(x));
...
私は関連コードを追加しました。スライダは4%の増加を得るために乗算された値を送信します(スライダが2つの値を移動した場合は8%など)、テーブルはこれで再スケーリングされます。テーブルサイズが9、それは8px増加し4時間によって増加したとき
最初の3です。しかし、倍率は毎回0.04増加します。
なぜ4回目は矛盾しますか?
パターンは、それが少数のためのより多くの1つのピクセルずつ増加し、次いで減少
... 8,8,8,9,9,9,8,8,8,9,9,9のように思えます1など10増加することによって、私の問題は...
'getObjectScale'が返す出力を変更するコードを含めてください。私はあなたのバグがそこにあることを卑劣な疑いがあります... –
getObjectScale()は単にgetScale()* getBaseScale()を返します。代わりにスケールの呼び出しを置き換えると、同じ結果が得られます。 – jmasterx
次に、どのようにサイズを4%増やしていますか?そのコードを見てみましょう。 –