2012-04-06 4 views
0

私はフローレイアウトを持っています。その中には約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時間によって増加したとき

enter image description here

最初の3です。しかし、倍率は毎回0.04増加します。

なぜ4回目は矛盾しますか?

パターンは、それが少数のためのより多くの1つのピクセルずつ増加し、次いで減少

... 8,8,8,9,9,9,8,8,8,9,9,9のように思えます1など10増加することによって、私の問題は...

+0

'getObjectScale'が返す出力を変更するコードを含めてください。私はあなたのバグがそこにあることを卑劣な疑いがあります... –

+0

getObjectScale()は単にgetScale()* getBaseScale()を返します。代わりにスケールの呼び出しを置き換えると、同じ結果が得られます。 – jmasterx

+0

次に、どのようにサイズを4%増やしていますか?そのコードを見てみましょう。 –

答えて

4

私はまだ "私は理解することができますフォームでは、" 4%のコードを追加表示されませんが、あなたの記述から私は思う問題を参照してください:4%を2回追加することは8%を追加しないことです。これは8.16%(1.04 * 1.04 == 1.0816)を追加しています。これを数回行い、9ピクセルジャンプを開始します。もっと多くの時間を過ごしてください。ジャンプがもっと大きくなります(サイズが400x400になると16ピクセルジャンプします)。どのようにIMHOは私のスケーリングが起こるのが好きです。

+0

これを避けるために何を変更する必要がありますか? 1.04,1.08,1.12などを得るにはどうすればいいですか? – jmasterx

+1

倍率を1.04倍しないでください。それに0.04を加えてください。 –

+0

技術的に3番目のものは1.12であり、1.012ではありません。 – chris

関連する問題