Как узнать, на какие элементы был перетянут блок
Всем привет!
Пишу клиентскую часть морского боя на jQuery, столкнулся с проблемой. Есть 2 панельки: одна с кораблями и вторая с доской: ![]() Доска и корабли создаются динамически через jQuery:
function generateBoard() {
var id = 0;
for (var i = 1; i <= 10; i++) {
$('<tr></tr>').appendTo('#board table');
for (var j = 1; j <= 10; j++) {
id++;
$('<td></td>').attr('id', id).appendTo('#board tr:last-child');
}
}
}
Корабли перетаскиваются с помощью draggable. Доска - таблица. Все клетки имеют идентификатор от 1 до 100. Когда юзер расставит все корабли и нажмет на кнопку, данные про размещение кораблей должны уйти на сервер. Например, в виде строки, в которой указаны идентификаторы клеток, на которых расположены корабли. Так вот, как мне идентифицировать те самые клетки? То есть, как с помощью jQuery выбрать клетки, над которыми стоит корабль? Заранее спасибо. |
|
Без использования расчета координат это можно сделать?
Я вот попробовал сделать все <td> доски droppable. И при перетаскивании корабля на нее, к <td> добавлять класс:
$('#board td').droppable({
hoverClass: 'dragged'
});
Только вот, когда я перетаскиваю несколькопалубный корабль на доску, класс добавляется только к одной клетке (<td>) под кораблем. Может можно как-то сделать так, чтоб класс добавлялся ко всем клеткам, над которыми корабль? |
Вам нужно сделать двумерный массив. Параметрами корабля должны быть его ширина и высота. После того, как ваш корабль куда-то переместили, рассчитываете, какие ячейки в вашем массиве будут при этом заняты. После этого помечаете соответствующие td'шки в таблице.
|
Возможно всё ))
Но вам потребуется двух мерный массив с чертежом корабля. затем каждую ячейку этого массива придётся сопоставить с ячейкой вашего поля, и определить ставить ли класс, или нет. твою дивизию, чуток опоздал ))) Но раз мысли совпали, значит решение правильное. ЗЫ. Мне ближе к сердцу когда игровое поле в массиве, а не в таблице. |
Цитата:
Цитата:
|
Что-то я не совсем понял, как массивы помогут мне в решении этой проблемы. Мне все равно на их основе нужно создавать html-блоки - таблицы или дивы.
Цитата:
Мне нужно, чтоб ячейки поля увидели, что над ними стоит корабль и добавили к себе класс или еще какую-нибудь метку. |
Цитата:
Ты что их тоже в html хранить будешь :D Цитата:
Цитата:
по делу установка без проверки, пример на массивах. ship массив с кораблём, map игровая карта. x,y это координаты установки.
setShip (x,y){
for (var yShip=0;yShip<4;yShip++){
for (var xShip=0;xShip<4;xShip++){
if ( ship[XShip,yShip] > 0 ) map[x+XShip,y+yShip ]=1;
}
}
}
Установка корабля с проверкой возможности установки. функция вернёт false если корабль установить не удалось.
setShip (x,y){
var test=0;
// циклы проверяют возможность установки.
for (var yShip=0;yShip<4;yShip++){
for (var xShip=0;xShip<4;xShip++){
if ( ship[xShip,yShip] > 0 && map[x+xShip,y+yShip ]>0) { test++;break};
}
}
// если установка возможна, то копируем корабль из одного массива в другой
if (test==0){
for (var yShip=0;yShip<4;yShip++){
for (var xShip=0;xShip<4;xShip++){
if ( ship[xShip,yShip] > 0 ) map[x+xShip,y+yShip ]=1;
}
}
// если всё ништяк тогда true
return true;
} else {
// если установка невозможна, вернём false
return false;
}
}
Ты не обижайся за критику. Тут не мало профи, так что есть смысл их слушать. Есть разница между данными и представлением. Твоя таблица это представление. Все профи хотят изолировать данные от представления, потому что так код яснее, и им проще оперировать. А сложную программу без такого подхода и вовсе написать невозможно, человеческий мозг просто невывезет такую кашу. Вот поэтому массив а не таблица. |
Дурной, штоле? Двухмерный массив - это твоё поле. У корабля есть ширина и высота - ship.width и ship.height. С ячейками массива сопоставлены td'шки. При драгге в ячейку - в массиве помечаешь нужные ячейки, исходя из ширины/высоты корабля. Помечаешь нужные td'шки.
|
| Часовой пояс GMT +3, время: 00:08. |