2015-10-06 37 views
3

我有一個由網格拼成的網格。有10行,總共有10個瓷磚。這在網格中總共有100個瓦片。JavaScript遊戲網格拼貼選擇

當點擊任何圖塊時,我想要突出顯示點擊圖塊周圍的圖塊。突出顯示的瓷磚應該從點擊的瓷磚開始離開並向外擴散,離被點擊的瓷磚最多2個瓷磚。

到目前爲止,我已經設法讓瓷磚頂部,右側,底部和左側突出顯示,但我仍然錯過了這些瓷磚。形狀應該在被點擊的瓷磚周圍形成鑽石。

JSFiddle

該解決方案必須是可擴展,允許更大的網格和瓷磚的更大的移動距離。

這是目前我在做什麼:

var Move = function() { 

    var that = this; 

    this.grid = { 
     width: 10, 
     height: 10 
    }; 

    this.showMoveableTiles = function() { 
     var movableTiles = 2; 
     var row = $(this).data('row'); 
     var tile = $(this).data('tile'); 

     $('.tile').removeClass('moveable'); 

     // Left 
     $(this).prevAll('[data-row="' + row + '"]:lt(' + movableTiles + ')').addClass('moveable'); 

     // Right 
     $(this).nextAll('[data-row="' + row + '"]:lt(' + movableTiles + ')').addClass('moveable'); 

     for (var i = 1; i <= movableTiles; i++) { 
      // Top 
      $('[data-row="' + (row - i) + '"][data-tile="' + tile + '"]').addClass('moveable'); 

      // Bottom 
      $('[data-row="' + (row + i) + '"][data-tile="' + tile + '"]').addClass('moveable'); 
     } 
    }; 

}; 

var move = new Move(); 

$(document).on('mousedown', '.tile', move.showMoveableTiles); 

什麼是實現這一目標的最佳途徑?

回答

2

過濾根據您的距離定義(曼哈頓 - 距離)只是篩選具有所需距離瓷磚(並排除點擊瓦)這樣

$('#grid .tile').filter(function(){ 
      return Math.abs($(this).data('row') - row) <= movableTiles && Math.abs($(this).data('tile') - tile) <= movableTiles && !($(this).data('row') == row && $(this).data('tile') == tile) 
}).addClass('moveable'); 

http://jsfiddle.net/z6vbzjz0/2/

編輯應這樣做:

$('#grid .tile').filter(function(){ 
      return (Math.abs($(this).data('row') - row) + Math.abs($(this).data('tile') - tile))<= movableTiles && !($(this).data('row') == row && $(this).data('tile') == tile) 
     }).addClass('moveable'); 

http://jsfiddle.net/z6vbzjz0/4/

+0

謝謝,但這不是我追求的。應該突出顯示離被點擊的圖塊2或更少的圖塊。 – Enijar

+0

啊所以你把距離定義爲越界? –

+0

是的。最終的形狀看起來像鑽石。某事[像這樣](http://i.imgur.com/59EpZDP.png)。 – Enijar

0

的快速實現將其添加到您的showMoveableTiles功能:

 //Top Left 
     $('[data-row="' + (row - 1) + '"][data-tile="' + (tile -1) + '"]').addClass('moveable'); 
     //Bottom Left 
     $('[data-row="' + (row + 1) + '"][data-tile="' + (tile -1) + '"]').addClass('moveable'); 
     //Top Right 
     $('[data-row="' + (row - 1) + '"][data-tile="' + (tile + 1) + '"]').addClass('moveable'); 
     //Bottom Right 
     $('[data-row="' + (row + 1) + '"][data-tile="' + (tile + 1) + '"]').addClass('moveable'); 

希望它能幫助!

0

請參見本文的jsfiddle:http://jsfiddle.net/z6vbzjz0/3/

這些行添加到您的showMoveableTiles功能:

 //top corners 
     $('[data-row=' + (row - 1) + '][data-tile=' + (tile - 1) + ']').addClass('moveable'); 
     $('[data-row=' + (row - 1) + '][data-tile=' + (tile + 1) + ']').addClass('moveable'); 
     //bottom corners 
     $('[data-row=' + (row + 1) + '][data-tile=' + (tile - 1) + ']').addClass('moveable'); 
     $('[data-row=' + (row + 1) + '][data-tile=' + (tile + 1) + ']').addClass('moveable'); 

這基本上只是着眼於當前瓦片和行,並增加或jQuery選擇減去添加moveable類的任何角落的瓷磚。

這又是:

var Move = function() { 
 

 
    var that = this; 
 

 
    this.grid = { 
 
     width: 10, 
 
     height: 10 
 
    }; 
 

 
    this.showMoveableTiles = function() { 
 
     var movableTiles = 2; 
 
     var row = $(this).data('row'); 
 
     var tile = $(this).data('tile'); 
 

 
     $('.tile').removeClass('moveable'); 
 

 
     // Left 
 
     $(this).prevAll('[data-row="' + row + '"]:lt(' + movableTiles + ')').addClass('moveable'); 
 

 
     // Right 
 
     $(this).nextAll('[data-row="' + row + '"]:lt(' + movableTiles + ')').addClass('moveable'); 
 
     
 
     for (var i = 1; i <= movableTiles; i++) { 
 
      // Top 
 
      $('[data-row="' + (row - i) + '"][data-tile="' + tile + '"]').addClass('moveable'); 
 

 
      // Bottom 
 
      $('[data-row="' + (row + i) + '"][data-tile="' + tile + '"]').addClass('moveable'); 
 
     } 
 
     
 
     //top corners 
 
     $('[data-row=' + (row - 1) + '][data-tile=' + (tile - 1) + ']').addClass('moveable'); 
 
     $('[data-row=' + (row - 1) + '][data-tile=' + (tile + 1) + ']').addClass('moveable'); 
 
     //bottom corners 
 
     $('[data-row=' + (row + 1) + '][data-tile=' + (tile - 1) + ']').addClass('moveable'); 
 
     $('[data-row=' + (row + 1) + '][data-tile=' + (tile + 1) + ']').addClass('moveable'); 
 
    }; 
 

 
}; 
 

 
var makeGrid = function (width, height) { 
 
    var tiles = ''; 
 

 
    for (var row = 0; row < height; row++) { 
 
     for (var tile = 1; tile <= width; tile++) { 
 
      tiles += '<div class="tile" data-tile="' + tile + '" data-row="' + (row + 1) + '"></div>'; 
 
     } 
 
    } 
 

 
    $('#grid').append(tiles); 
 
}; 
 

 
var move = new Move(); 
 

 
makeGrid(10, 10); 
 

 
$(document).on('mousedown', '.tile', move.showMoveableTiles);
#grid { 
 
    width: 300px; 
 
    cursor: pointer; 
 
} 
 

 
.tile { 
 
    width: 30px; 
 
    height: 30px; 
 
    background-color: #777; 
 
    outline: 1px solid goldenrod; 
 
    float: left; 
 
} 
 

 
.tile:hover { 
 
    background-color: #999; 
 
} 
 

 
.moveable { 
 
    background-color: #add8e6; 
 
} 
 

 
.moveable:hover { 
 
    background-color: #c8ebf7; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="grid"></div>

+0

謝謝,但這隻適用於距離點擊的磁貼2或以下的磁貼。這對於更多的圖塊需要是可擴展的,即增加3或4或5等。 – Enijar

+0

啊,我錯過了這個問題的'可擴展'部分。 – tnschmidt

+0

看起來像@L。蒙蒂給了你你需要的解決方案。 – tnschmidt