2012-11-14 4 views
0

저는 이전에 acm 그래픽 라이브러리를 꽤 많이 사용 했었고 스탠포드가 할당 한 브레이크 아웃 문제에 대한 작업을 시작했습니다. 과거에 그래픽으로 여러 번 보았던 문제 중 하나는 좌표를 실제로 두 번 및 세 번 체크했는데 실제로 표시되는 위치를 정확히 반영하지 않는다는 것입니다. 결국, 과제를 위해 나는 그것을 눈으로보고 끝내기까지 수정을가했습니다. 그래서 명백한 나는 여기에 뭔가를 놓치고있어 간단한 그래픽 프로그램이 어렵지 않아야합니다.기본 자바 그래픽 및 좌표가 제대로 작동하지 않습니다.

예를 들어, acm.graphics를 사용하면 내 코드가 다음과 같이 보입니다.

public static final int APPLICATION_WIDTH = 400; 
public static final int APPLICATION_HEIGHT = 600; 

public void setupBorder(){ 
    // **Sets Black Background 
    GRect b = new GRect(0,0,400,600); //** Sets Black Background 
    fillObj(b,Color.black); 
    add(b); 

    //**Sets White Square so border is 5 pixels wide on each side 
    b = new GRect(5,5,APPLICATION_WIDTH-10,APPLICATION_HEIGHT-10); 
    fillObj(b,Color.white); 
    add(b); 
    } 

그래서 여기 내 생각은, 아래로 나는 사람들을 뺄하고 추가 5 개 픽셀 (기본 2B + X = 1 측의 각 측면에 테두리를 5 개 픽셀을 가질 필요가 자사의 이동 권리 5 개 픽셀 5 픽셀입니다 , 2a + y = 수직면). 중간에 흰색 사각형이있는 각면에 5 픽셀의 검은 경계선이 생기는 것 같지만 그렇지 않습니다. 창의 왼쪽, 오른쪽 및 위쪽에 테두리를 만들고 아래쪽에는 테두리를 만들지 않습니다. 그래서이 간단한 것을 무언가 잘못했을 수 있습니까? 나는 두 배, 세 배, 심지어 종이에 계산을 확인하고 그것이 5 픽셀의 검은 색 테두리가있는 가운데에 흰색 사각형이어야한다고했지만, 그렇지 않습니다. 나는 더 나쁜 효과와 함께, 백분율을위한 변화하는 픽셀을 시도했다. 수동으로 상자를 편집 할 때까지는 Y 값의 -35가 너무 가깝지만 조금 멀리 보입니다. 누구나 무슨 일이 벌어지는 지 아이디어가 있습니까?

appwindow http://i46.tinypic.com/10rob61.jpg이 실행 변경 및 클래스 내에서 다른 방법으로

Breakout

.

public void run() { 
    /* You fill this in, along with any subsidiary methods */ 
    init(); 
} 

public void init(){ 

    setupBorder(); 


} 

public void setupBorder(){ 
    //**Black Background 
    GRect b = new GRect(0,0,400,600); //**Black Background 
    fillObj(b,Color.black); 
    add(b); 

    b = new GRect(5,5,APPLICATION_WIDTH-10,APPLICATION_HEIGHT-10); 
    fillObj(b,Color.white); 
    add(b); 
} 

public void fillObj(GFillable a, Color argC) 
{ 
    a.setFillColor(argC); 
    a.setFilled(true); 
} 
+2

아마도'APPLICATION_HEIGHT' 메뉴를 포함? –

+0

Jan Dvorak이 뭔가있을 수 있습니다 ... (0, 0)이 메뉴의 왼쪽 상단에있을 수 있습니다. 그러나이 경우 (5, 5)는 그보다 높을 것입니다. 이상한 ... –

+0

디버그 단일 getHeight/getWidth에 추가 될 수도 있고 콘솔에 각각 2 개의 값이 반환됩니다. 645 418 575 400. 그것은 단지 사납다. – Lorek

답변

2
응용 프로그램 창의 크기 혼란 것처럼 보이는

당신의 그리기 가능 영역의 크기 (와 (창 국경 제외를하지만 메뉴를 포함하고 는 귀하의 경우 400 * 600입니다) . 메뉴 아래에있는 (당신이 그리기 가능 영역의 외부에서 draw하고 의미 메뉴)를 제외

귀하의 창이 있습니다

  • OS에 의해 공급 테두리를 그것은 내부에 400x600입니다..
  • 메뉴 모음.
  • 메뉴 바 아래에 드로어 블 영역 (캔버스)이 있습니다. 메뉴 막대 너비에 따라 400x600보다 짧습니다.

당신에게 캔버스 크기를 읽고 대신 창 크기를 사용하는

  • 필요 하나 : 대신 창 크기의 캔버스 크기를 설정하고 창 크기 자체를 할 수 getCanvas().getHeight()
  • 필요 필요에 따라. GraphicsProgramApplet이므로 가능한 것은 아닙니다.
  • 은 메뉴 높이를 찾아 그 높이만큼 창 높이를 늘려야합니다 (최후의 수단).
+0

감사합니다 Jan. 많이 설명합니다. 캔버스 크기를 설정하는 방법을 살펴 보았고 acm에서 javadoc을 명시 적으로 설정하는 방법이 표시되지 않았습니다. 일단 응용 프로그램 {높이, 너비}을 조정할 수있는 메뉴의 x 크기를 계산하면 내기가 있지만, 실제로 캔버스는 400x600이거나 메뉴를 모두 제거하는 방법입니다. – Lorek

+0

APPLICATIONHEIGHT를 600에서 625로 변경하여 메뉴 크기를 조정 한 후에도 여전히 똑같은 결과를 얻습니다. – Lorek

+0

왜냐하면'APPLICATIONHEIGHT'를 조정하면 커다란 직사각형도 그리기 때문에 여전히 적합하지 않기 때문입니다. –

0

윈도우의 크기는 setSize() 메소드를 사용하여 변경할 수 있습니다. 너는 여전히 좌표 문제에 직면 해있다. 작업 영역의 크기를 읽을 때 폭은 16, 높이 (Height)는 58입니다 (앞에서 언급 한 메뉴 및 W7 테두리 때문일 수 있음).

setSize()를 호출 할 때주의해야합니다.

[OFF] 나는 또한이 브레이크 아웃 과제를 진행하고 있으며 같은 문제가 있습니다. 이 사이트에서 몇 분 전에 게시 됨. [/ OFF]

0

모든 애플릿의 로딩 시간을 명시 적으로 설정하는 습관을 가졌습니다. 이것이 내가 일반적으로 창 크기 설정 방법은 다음과 같습니다 또한

@Override 

public void init(){ 
    resize(APPLICATION_WIDTH, APPLICATION_HEIGHT); 
} 

, 당신은실행()에서 초기화()를 호출 할 필요는 없습니다; 초기화시에 애플릿 뷰어에 의해 자동으로 호출됩니다.

내가 사용한다고 생각 :

b = new GRect(5,5,getWidth()-10,getHeight()-10); //gets window width & height 

또는 대신 :::

b = new GRect(5,5,b.getWidth()-10,b.getHeight()-10); //gets former 'b' width & height 

:

b = new GRect(5,5,APPLICATION_WIDTH-10,APPLICATION_HEIGHT-10);