2012-03-17 3 views
3

다른 색상의 5 개 이미지가있는 8x8 격자 인 보드 게임을하고 있습니다. 객체는 행 또는 열에서 서로 옆에있는 한 서로 바꿀 수 있습니다. 스위치로 인해 행이나 열에서 3 개 이상의 객체가 동일하면 제거됩니다. 스위치가 일치하지 않으면 스위치가 작동하지 않습니다. 물체가 제거되면 보드가 붕괴되어 제거 된 물체 위에있는 물체가 떨어지며 새 물체가 맨 위부터 떨어져 그 공간을 채 웁니다.Java 게임에서 끌어서 놓기 구현

드래그 작업을 구현하고 객체를 떨어 뜨리는 좋은 방법을 알고 싶습니다. 계층화 된 창을 사용해야합니까?

아이디어가 도움이 될 것입니다.

+0

이 [예제] (http://stackoverflow.com/a/2562685/230513) 및 [변형] (http://stackoverflow.com/a/2563350/230513)도 참조하십시오. – trashgod

답변

0
  1. 드래그 동작 : 이 컬러 인덱스를보고하는 해시 맵을 작성합니다 (예를 들어 완전히 5 가지 8 × 8 격자 색상) 및 사각형 객체입니다. 사각형과 색상은 각각 키와 값을 나타냅니다. 인접한 두 블록 (직사각형)에서 매번 두 번씩 클릭하고이 두 가지 색상을 적절히 교환합니다. 그런 다음 선상에 3 개 또는 3 개 이상의 동일한 색상이있는 블록 세트가 적어도 하나 이상 있으면 색상 분포를 다시 확인하십시오. 그렇지 않으면 색상을 다시 교환하십시오.

  2. 아래로 떨어지고 : 를 적어도 하나의 블록 세트 (동일 라인에서 3 개 이상의 짝수 인접한)을 발견 한 후에, 각각의 직사각형의 높이 * 의 수에 의해 제거 된 직사각형 위의 모든 컬러 블록 공제 현재 열의 직사각형을 제거했습니다.. 이후에는 한 줄에 3 가지 이상의 동등한 색상이있는 블록 세트가 없어 질 때까지 현재의 색상 분포를 반복해서 확인하십시오.

감사합니다. 사용자에게 느끼는 물체의 아래쪽을 어떻게 만들 수 있습니까? 그러한 영향을주기 위해 그래픽이나 타이머를 사용해야합니까?

타이머가 좋은 선택입니다. 적어도 하나의 블록 집합 (동일한 행에 인접한 3 개 이상)을 찾은 후에는 일정 (TimerTask 작업, 긴 지연, 장기간) 을 정의해야 함 TimerTaskrun(), 이것은 JComponent/JFrame의 repaint (int x, int y, int width, int height)을 주 스레드로 정의하여 떨어지는 부분을 그려야 만합니다. JComponent/JFrame의 페인트 (그래픽 g)에서 떨어지는 부분의 다른 단계를 그려야합니다. TimerTask의 run()에 루프를 사용해야하므로 기간이 ms가 될 때마다 또 다른 JComponent/JFrame의 페인트 (x, y, 너비, 높이)이 호출됩니다. 루프를 5 번 반복하려면 타이머 루프의 cancel()을 5 번째 루프에 사용하면 타이머가 종료됩니다. 깜박임 효과가 너무 걱정되지 않는다면 repaint()을 대신 사용하고 페인트 (그래픽 g)에 전체 8x8 격자 이미지를 그립니다. JComponent/JFrame을 사용하는 이유는 JFrame에서 직접 그리거나 JFrame을 기반으로 JComponent에서 그릴 수 있기 때문입니다.

감사합니다. 내가 떨어지는 드래그 효과를 구현하는 몇 가지 아이디어가있어. 지금 당장 나는 내 프로그램에 갇히고 탈출구를 찾을 수 없다. 도움이된다면 고맙겠습니다.내 프로그램 지금까지 프레임에 8x8 gridlayout 패널을 만들었습니다. ImageID (행과 열 번호가있는 문자열), Image (JLabel), 행과 열로 클래스를 만들었습니다. 나는 GridLayout.A mouselistener에 저장된 2 차원 배열에 저장된 64 개의 객체를 만들고 각 객체에 mousemotionlistener가 부착되어 있습니다. 사용자가 그리드를 클릭하면 이미지 객체와 inturn이 이미지의 행과 열을 가져옵니다. - newjav 어제
내가 갇혀있는 문제는 마우스를 누르고 드래그하여 놓았을 때의 문제입니다. mouserelease 또는 mousedrag가 눌려진 객체 일 때 가져 오는 객체입니다. 그래서 저는 마우스가 놓여진 그리드의 행과 열을 얻지 못합니다. 마우스를 놓은 그리드 위치는 어떻게 계산합니까? 여기에 붙어서 더 이상 갈 수 없어

mousePotionListener 및 mouseReleasedListener를 mouseMotionListener없이 사용하는 경우 소스 및 대상 모눈 개체를 별도로 가져올 수 있습니다. 하지만 귀하의 목표는 MouseMotionListener를 사용하는 것입니다. 따라서 두 가지 변형이 있습니다 : 1. 그리드 obj를 누른 직후, 그리드 obj를 얻습니다 (즉,이 그리드 obj의 경계를 얻음). 예 : 두 번째 행과 열의 그리드 obj를 클릭 한 다음 그리드 obj의 멤버를 얻을 수 있습니다. = 1 및 coloum = 1 각 그리드의 너비와 높이가 모두 10 픽셀이라고 가정합니다. 그런 다음이 그리드 obj : (10, 10)과 (20, 20) 경계를 얻습니다. 이제 다른 그리드로 드래그하려고합니다. 따라서이 그리드 obj의 mouseReleased() 함수에 조건을 추가해야합니다 : 현재 놓은 마우스 위치가이 그리드 obj 경계를 벗어나면 이웃 중 하나가 이제 목표 그리드 obj입니다. 예 : getX()> 20 & & e.getY()> 10 & & e.getY() < 20) {// 대상 그리드 obj가 소스 그리드 obj의 오른쪽에 있고 그의 경계가 (20, 10), (30, 10), 즉 row = 1, column = 2} 행과 열로 2D 배열에서 대상 격자 obj를 찾을 수 있습니다. 2.하지만 내가 당신이라면 각 그리드 obj에 mouseListener 및 mouseMotionListener를 할당하지 않고이 64 그리드 objs를 포함하는 패널에만 mouseListener 및 mouseMotionListener를 할당합니다. 클릭하고 끌기를 할 때마다 행과 열로 쉽게 변환 할 수있는 적절한 위치를 얻을 수 있습니다. 행과 열을 사용하면 2D 배열에서 적절한 그리드 obj를 찾을 수 있습니다. 그게 전부 야. 다행히 이것이 당신이 원하는 것입니다.

+0

고마워. 부모 좌표에서 Point p = SwingUtilities.convertPoint (e.getComponent(), e.getPoint(), container)를 사용하여 행과 열을 가져올 수있었습니다. – newjav

+0

SwingUtilities를 사용하여 메서드를 공유해 주셔서 감사합니다. –