0

フローレイアウトがあります。その中には約900のテーブルがあります。各テーブルは積み重ねられています。それらのサイズを変更するスライダーがあり、フローレイアウトのサイズも変更されます。

問題は、テーブルのサイズを直線的に変更する必要があることです。基本サイズは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%など)を取得し、これを使用してテーブルを再スケーリングします。

ここに画像の説明を入力してください

最初の3つは、テーブルサイズが9増加したとき、4回目は8px増加したときです。ただし、スケール係数は毎回0.04ずつ増加します。

4回目が矛盾するのはなぜですか?

パターンは8、8、8、9、9、9、8、8、8、9、9、9のように見えます...

それは数秒間さらに1ピクセル増加し、次に1減少します。10増加します。これが私の問題です...

4

1 に答える 1

4

そこに「4%を追加」コードはまだ表示されていません(とにかく理解できる形式で)が、あなたの説明から、問題が見られると思います.4%を2回追加しても8%は追加されません. 8.16% (1.04 * 1.04 == 1.0816) を追加しています。これをさらに数回行うと、9 ピクセルのジャンプが開始されます。何度も繰り返すと、ジャンプが大きくなります (サイズが 400x400 になると、16 ピクセルのジャンプになります)。これは、IMHOが私のスケーリングが好きな方法です。

于 2012-04-06T04:35:17.293 に答える