Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Как узнать, на какие элементы был перетянут блок (https://javascript.ru/forum/jquery/23140-kak-uznat-na-kakie-ehlementy-byl-peretyanut-blok.html)

TAIMOS 13.11.2011 19:35

Как узнать, на какие элементы был перетянут блок
 
Всем привет!
Пишу клиентскую часть морского боя на 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 выбрать клетки, над которыми стоит корабль?
Заранее спасибо.

trikadin 13.11.2011 20:52

Читать тут и тут (вкладки внизу).

TAIMOS 13.11.2011 23:35

Без использования расчета координат это можно сделать?
Я вот попробовал сделать все <td> доски droppable. И при перетаскивании корабля на нее, к <td> добавлять класс:
$('#board td').droppable({
	hoverClass: 'dragged'
});

Только вот, когда я перетаскиваю несколькопалубный корабль на доску, класс добавляется только к одной клетке (<td>) под кораблем. Может можно как-то сделать так, чтоб класс добавлялся ко всем клеткам, над которыми корабль?

trikadin 14.11.2011 00:04

Вам нужно сделать двумерный массив. Параметрами корабля должны быть его ширина и высота. После того, как ваш корабль куда-то переместили, рассчитываете, какие ячейки в вашем массиве будут при этом заняты. После этого помечаете соответствующие td'шки в таблице.

DjDiablo 14.11.2011 00:07

Возможно всё ))
Но вам потребуется двух мерный массив с чертежом корабля.
затем каждую ячейку этого массива придётся сопоставить с ячейкой вашего поля, и определить ставить ли класс, или нет.

твою дивизию, чуток опоздал )))
Но раз мысли совпали, значит решение правильное.

ЗЫ. Мне ближе к сердцу когда игровое поле в массиве, а не в таблице.

trikadin 14.11.2011 00:15

Цитата:

Сообщение от DjDiablo
твою дивизию, чуток опоздал )))

Бывает)

Цитата:

Сообщение от DjDiablo
ЗЫ. Мне ближе к сердцу когда игровое поле в массиве, а не в таблице.

Это разумнее просто.

TAIMOS 14.11.2011 01:07

Что-то я не совсем понял, как массивы помогут мне в решении этой проблемы. Мне все равно на их основе нужно создавать html-блоки - таблицы или дивы.
Цитата:

Но вам потребуется двух мерный массив с чертежом корабля.
Имеется ввиду, если корабль четырехпалубный, то массив ship[1][4]? И с чем его сопоставлять, если у поля все ячейки пустые.
Мне нужно, чтоб ячейки поля увидели, что над ними стоит корабль и добавили к себе класс или еще какую-нибудь метку.

DjDiablo 14.11.2011 01:18

Цитата:

Мне все равно на их основе нужно создавать html-блоки - таблицы или дивы.
Биржевые сводки, тоже придётся представлять в виде таблиц и div'ов.
Ты что их тоже в html хранить будешь :D

Цитата:

то массив ship[1][4]?
а корабль по горизонтали или вертикали ? а может у него более сложная форма ? вот чтобы об этом не думать берёш массив 4 на 4 и корабль в нём может быть любой.

Цитата:

И с чем его сопоставлять, если у поля все ячейки пустые
ты же не один корабль разместиш на карте, или твои корабли можно ставить друг на друга ? :)


по делу
установка без проверки, пример на массивах.
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; 
   }
}


Ты не обижайся за критику. Тут не мало профи, так что есть смысл их слушать.
Есть разница между данными и представлением. Твоя таблица это представление. Все профи хотят изолировать данные от представления, потому что так код яснее, и им проще оперировать. А сложную программу без такого подхода и вовсе написать невозможно, человеческий мозг просто невывезет такую кашу. Вот поэтому массив а не таблица.

trikadin 14.11.2011 01:35

Дурной, штоле? Двухмерный массив - это твоё поле. У корабля есть ширина и высота - ship.width и ship.height. С ячейками массива сопоставлены td'шки. При драгге в ячейку - в массиве помечаешь нужные ячейки, исходя из ширины/высоты корабля. Помечаешь нужные td'шки.


Часовой пояс GMT +3, время: 23:05.