2016-11-04 5 views
0

ウェブ上でゲーム内の在庫を複製し、ゲームの在庫は、次のようになります。私は、ウェブ上でCABAL呼ばMMORPGオンラインゲームから在庫を複製しようとしている

基本的にenter image description here

は、在庫は4を持っています各タブには8x8のタブがあるため、64個のセルと合計256個のタブがありますが、各タブのインデックスは0から63までで、合計は0から255までです。

アイテムは1:1(rowspan:colspan)の2:2を占め、一部は武器服などの2:6でもありえますが、とにかくポイントは私が試したものですhereは私ができる限り最高の状態で複製しますが、私は1つのタブしか作成できませんでした。

function createCells(rows, cols) { 
     var cells = {}, 
      x = 0, 
      startRow = 0, 
      endRow = 0; 

     for (var i = 0; i < rows; i++) { 
      cells[i] = {}; 
      for (var j = 0; j < cols; j++) { 
       cells[i][j] = { id: "e" + x }; 

       if (angular.isDefined(items[x])) { 
        cells[i][j] = items[x]; 
        if (items[x].colspan > 1 && items[x].rowspan > 1) { 
         startRow = x % rows; 
         endRow = parseInt(x/cols, 10) + items[x].rowspan; 
         console.log(j); 
         console.log("Start column " + startRow + " end rowspan " + endRow + " x = " + x); 
        } 
        // console.log(); 
        // if (j >= 5 && j <= 8) { 
        //  x += j; 
        // } 
       } 

       if (!angular.equals(cells[i][j], {})) { 
        console.log(cells[i][j]); 
       } 


       x++; 
      } 
     } 

     return cells; 
    } 

だから問題は項目が1より大きくROWSPANとCOLSPAN占めている場合、それは後に他の細胞をプッシュし、私は(E7、E14、E15、E39、E46、E47、E54、E55、それらを取り除く必要があると何があります、e62、e63)。私はそのループが、自動的に項目列スパンと列スパンに基づいて計算する必要があります。 varアイテムにあるアイテムは、apiレスポンスのサンプルです.3,6,12,240,105はタブ1のアイテムです。

誰でも私をさらに助けることができますか?私はこの間何日も立ち往生していません。

答えて

2

あなたは小さなアプローチの変更を気にしない場合、あなたはこれを試してみることができます:

  • を細胞を作製する前に、各項目についてはすべてのアイテム
  • ループスルー、そのrowcolの組み合わせを特定ブロックされます

ここで、すべてのブロックされた(つまり、空ではない)セルのマップがあります。 createCellsループでは、このマップを使用してプレースホルダが必要かどうかを判断できます。各セルの3例が存在することになります:

  • これは、項目がで行く正確なスロットです:アイテム
  • を追加するにはアイテムによってブロックされているスロットです:何もしない
  • にです項目に関連していない:挿入プレースホルダ

は、ここで私はそれをやった方法は次のとおりです。

作業フィドルで
function createCells(rows, cols) { 
    var cells = {}; 

    // Create an object that holds all cell codes blocked by an item 
    var itemMap = Object.keys(items).reduce(function(map, key) { 
    var item = items[key], 
     cStart = item.slot % cols, 
     rStart = Math.floor(item.slot/cols) 
    for (var c = 0; c < item.colspan; c += 1) { 
     for (var r = 0; r < item.rowspan; r += 1) { 
     map[(r + rStart) + ";" + (c + cStart)] = item; 
     } 
    } 
    return map; 
    }, {}); 

    var currentNr; 
    for (var i = 0; i < rows; i++) { 
    cells[i] = {}; 

    for (var j = 0; j < cols; j++) { 
     currentNr = i * cols + j; 

     // If there's an item with this slot, place it 
     if (items[currentNr]) { 
     // Add item 
     cells[i][j] = items[currentNr]; 

     } else if (itemMap[i + ";" + j]) { // The item isn't in the exact spot, but blocks it 
     // Block square, do nothing 
     } else { 
     // Add empty square 
     cells[i][j] = { 
      id: "e" + currentNr 
     } 
     } 
    } 
    } 
    return cells; 
} 

http://jsfiddle.net/q1ba3x4h/

+0

すごい迫力、それはまだ私は、私はしかし、それを自分で行うことができますね、マルチタブ部分を実行する必要けれども、これは、必要に応じて働き、とても素敵ですビットが多すぎるループのパフォーマンスを心配して、これは最高のバージョンであり、このコードの方が速いか、改善された方が良いでしょうか? – allocen

+0

私は同じアプローチに基づいて "より効率的"な例を書いていきます。私は1000のアイテムをループすることはおそらく問題にならないので、スピードに焦点を当てるだけでなく、アドバイスをお願いします。より効率的な例がどのようなものになるかを示すために数分を与えてください。可読性が損なわれるかどうかを判断できます。 – user3297291

+0

ありがとう、お待たせします。 – allocen

関連する問題