2010-04-13 4 views
1

간단한 게임을 통해 Java 학습에 대한 계속적인 학습을 통해 약간의 문제가 발생했습니다. 내 게임 보드는 JPanel과 보드의 각 부분을 확장합니다. 자,이 몇 가지 문제를 제시 : 각 조각의JFrame 내부의 JPanels 객체 이동 및 크기 조정

  1. 캔트 세트의 크기는, 그러므로, 각 조각 JPanel의은 조각의 나머지 부분과 배경 (게임 판을) 은폐, 전체 JFrame의 ocupy.

  2. 캔트의 위치를 ​​설정합니다.

기본 흐름 관리자가 있습니다. 시도 setbounds와 행운을 빕니다.

아마 내가 다른 JComponent를 확장해야할까요? 추가 된 이미지 : 그 조각입니다, 이제 회색 영역도 조각입니다! 그것을 확인하기 위해 mousePressed 수신기를 만들고 그것에 물건을 할당했습니다. 회색 영역 아래에는 또 다른 JPanel 인 게임 보드가 있습니다 (또는 적어도 있어야합니다!). 단위가 아닌 더 큰하고 채우는지도 주위 alt text http://img442.imageshack.us/img442/5813/screenshot2ml.png

팩 :

alt text http://img42.imageshack.us/img42/2227/screenshotvdy.png

일부 코드는 : 내가 팩() 메서드를 적용 할 때

package TheProject; 

import java.awt.Color; 
import java.awt.Dimension; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class GameWindow extends JFrame { 
public GameWindow() { 
    setSize(800, 600); 
    setLocationRelativeTo(null); 
    Map map = new Map(800, 600, 2); 
    add(map); 

    MilitaryUnit imperialRussia = new MilitaryUnit(30, Color.BLACK, Color.YELLOW, Color.WHITE); 
    imperialRussia.setPreferredSize(new Dimension(30, 30)); 
    add(imperialRussia); 

} 
} 

발생합니다 JFrame.

+0

누구나? –

+0

JLayeredPane을 사용하여 모든 것을 넣었습니다 (맵과 유닛). JLP는 레이아웃 관리자를 지원하지 않기 때문에 직접 찾아야했지만 근무했습니다. –

+0

"LayoutManager는 레이어 설정에 관계없이이 컨테이너의 모든 하위 구성 요소에 영향을 미칩니다."-http : //java.sun.com/javase/6/docs/api/javax/swing/JLayeredPane.html – trashgod

답변

0

나는 약간 게임을 JPanel을 사용하여 썼다. 기본적으로 내가 JPanel을 사용하는 방법은 Canvas을 사용하는 것과 같습니다. 즉, paint() 메서드를 재정 의하여 직접 그릴 수 있습니다. JPanel을 사용하는 이유는 내 게임 세계의 크기를 결정할 수 있기 때문이며 그 다음에 setPreferredSize()을 사용하여 패널 크기를 설정합니다. 그런 다음 패널을 JScrollPane에 추가합니다. 그래서 이것은 패닝 등을 처리 할 것입니다.

2 차원 게임을 쓰고 있습니다. JPanel을 사용하는 방법입니다. 내 게임 맵을 보유하고있는 논리 맵 (2D 배열)이 있습니다. 각 위치가 32x32 픽셀이라고 가정 해보십시오. 그래서 당신은 땅을 그리기 시작하고 그곳에 그 땅이 무엇인가를 시작합니다.예를 들어 x = 1, y = 2, 즉 화면 위치 x = 32, y = 64 인 경우, 먼저 그라운드를 그립니다. 그런 다음 그라운드에있는 것을 그립니다. 그래서 렌더링 루프의 대략적인 개요 당신은 너무 모든 마우스가 다시지도 등으로 번역 클릭 JPanel의에 MouseListener 리스너 설정이

for (int y = 0; y < map.length; y++) 
    for (int x = 0; x < map[y].length; x++) { 
     drawGround(map[y][x]) 
     for very element on on map[y][x] - render them 
}  

같은 것입니다. 마우스 클릭 x = 54, y = 72는 x = 1, y = 2에 해당합니다. 등각 투영 뷰를 사용하면 계산이 약간 까다 롭습니다.

여기서주의해야 할 것은 스크롤 패널을 통해 패널을 스크롤 할 때마다 paint()이 호출된다는 것입니다. 따라서 게임 보드를 BufferedImage에 렌더링 한 다음 paint() 메서드에서 BufferedImage을 그려야합니다. 그렇지 않으면 게임이 너무 느려집니다.

+1

사용자 정의 페인팅을 위해 paintComponent()를 사용하지 않고 paint()를 재정의해야합니다. – camickr

+0

나는 모든 것을 그려서 컴포넌트를 커스터마이징하지 않기 때문에 paint()를 사용할 것이라고 생각한다. 아마도 내가해야 할 일은 paint()에서 paintBorder()를 호출하는 것입니다. 어쨌든 그것에 대해 논평 해 주셔서 감사합니다. –

+0

네, 하나의 단위/조각을 클릭하면 어떨까요? 어떻게 그 작품을 찾으십니까? 그래서지도/게임 보드 용 클래스와 유닛/조각 용 클래스로이 접근법을 사용했습니다. –

0

setPreferredSize(Dimension d)을 사용해 보셨습니까?

편집 : 당신이 당신의 구성 요소를 추가 한 후, 당신의 JFrame의에 pack()를 호출해야합니다 또한

JFrame frame = new JFrame(); 
frame.setPreferredSize(new Dimension(800,600)); 
JPanel panel = new JPanel(); 
panel.setPreferredSize(new Dimension(200,200)); 
frame.add(panel); 
frame.pack(); 
frame.setvisible(true); 

을, 당신은 당신의 JFrame의 같은 크기를 가지고 당신의 JFrame의,에지도를 추가 - 고급 . 그런 다음 나중에 다른 구성 요소를 기본 flowlayout에 추가합니다. Map은 이미 공간의 100 %를 차지하므로 프레임에 맞지 않습니다.

+0

작업. –

+1

나는 우리가 세부 사항을 놓치고 있다고 생각한다. 몇 가지 코드를 게시하면 이미 시도한 것을 볼 수 있습니다. –

0

NetBeans 비주얼 편집기를 사용해 보셨습니까? 이 도구를 사용하여 편리하게 디자인보기에서 개체를 끌어서 놓기 및 크기 조정할 수 있으며 코드보기로 전환하여 생성 된 코드를 볼 수 있습니다. 그런 식으로 배울 수 있습니다.

1

조각이 무작위로 움직이는 게임의 경우 "널 레이아웃"을 사용하는 것이 좋습니다.

자세한 내용은 Absolute Positioning의 스윙 튜토리얼 섹션을 참조하십시오.

관련 문제