2013-06-01 7 views
0

То, что я пытаюсь сделать, это найти, где на моей картине карточной игры человек щелкнул и изменил значение в соответствии с ним в моем 2-мерном массиве. Это похоже на tic tac носок, но больше, и вы кладете камни на перекрестки. До сих пор я мог получить свою позицию x и y моей мыши и проверить, щелкнул ли пользователь первое пересечение левой левой руки, и это работает, но я подумывал написать какой-то цикл, который будет проверять все точки пересечения.Соответствие графической сетки сетки сетки 2d

Это мой код для проверки верхнего пересечения

if ((x >= 278 && x <= 285) && (y >= 160 && y <= 175)) 
    { 
     System.out.println("intersection 1 clicked"); 
    } 

Так что мой вопрос, как бы я написать мой цикл, чтобы проверить все пересечения? Даже логика просто прекрасна, если вы не хотите писать код.

Заранее благодарю за любую помощь.

http://i.stack.imgur.com/yzPTA.png это моя программа работает верхний камень левой руки моего курсор

http://i.stack.imgur.com/l6UrW.png и это мой код

ответ

1

Я думаю, что для петли будет чрезмерно усложнять. Вместо этого вы могли бы написать несколько операторов для перевода между screen space и board space.

Произнесите экран пространство 800px по 600px и у вас есть 10 x 10 игровое поле, представленное в 2-мерном массиве: board[10][10]. Давайте также скажем, что вы начинаете рисовать доску с 10px смещением от 0,0, а ваша доска 500px шириной. В этом случае вы знаете, сколько места на экране каждая ячейка на доске занимает:

int boardScreenWidth = 500; 
int cellWidth = boardScreenWidth/boardWidth; 
      // = 500px/10 
      // = 50px 

Start, игнорируя клики, которые не касаются платы:

int boardStartX = 10; 
if (mouseX < boardStartX || mouseX >= boardStartX + boardScreenWidth) 
    return; // The user clicked somewhere to the left or right of the board 

Затем, если щелчок был на вам нужно будет отрегулировать положение мыши на основе смещения платы от 0 (так что нажатие на x=10px похоже на нажатие на x=0 с точки зрения позиции платы). С помощью этой информации становится легко перевести х-координаты в пространстве экрана к индексу в board:

int mouseX = 320; // user clicked at x=320 
mouseX = mouseX - boardStartX; // adjust based on board's position 
int boardX = mouseX/cellWidth; 
     // = 310/50 
     // = 6 

Вы могли бы найти boardY так же и затем получить доступ к ячейке, которая была нажата в board[boardX][boardY].

Edit: Чтобы получить координаты экрана из индекса в вашем board, используйте ту же самую логику выше, но решить для mouseX:

int boardX = (mouseX - boardStartX)/cellWidth; 
// ==> boardX * cellWidth = mouseX - boardStartX 
// ==> (boardX * cellWidth) + boardStartX = mouseX 
// or... 
int screenX = boardStartX + (boardX * cellWidth); 

Обратите внимание, что это край клетки. Вся ячейка будет охватывать от screenX до screenX + cellWidth. В центре клетки находится в screenX + cellWidth/2

+0

+1 для расчета, а не поиска. – trashgod

+0

Я вижу, как это проще, о чем я беспокоюсь, потому что я размещаюсь на перекрестке, а не в камере, и это будет немного. Я рисую свою доску по 0,0. Массив и сетка - 19x19. Плата шириной 441 пиксель от начала до первого пересечения составляет 13 пикселей, а каждая ячейка - 21 пиксель в ширину. Я посмотрю, смогу ли я сделать математику выше, используя мои номера. Спасибо, что это очень много помогает – user2259774

+0

Быстрые вопросы, как только у меня есть координаты сетки, как 13 х 4, как бы повернуть это обратно в координаты экрана, чтобы нарисовать камень? – user2259774

2

here Как показано, вы можете рассчитать экран координаты на основе координат желаемой сетки. Нажмите и перетащите, чтобы захватить квадрат экрана SIZE, затем наведите указатель мыши на него, чтобы увидеть, как работает mouseMoved().Аналогичный подход используется в этом MapPanel.

image

Смежные вопросы