2014-06-22 4 views
0

그래서 나는 게임을 만드는 데 물가를 and고 있습니다. 그리고 나는 상당히 지저분한 작업자입니다. 그리고 나서 돌아가서 정리합니다. 따라서 어리석은 명명 규칙이나 방법 등은 무시하십시오. 내가 나중에 되돌아 가고, 정돈하는 것에 따라.캔버스에 그리기

기본적으로 기본 메뉴를 만들려고합니다. 화면에 무언가를 그려서 그대로두고 싶습니다. 캔버스에 그림을 그려 보았을 때 이미지 ATM에 그래픽을 쓰고 이미지를 표시하고 화면에 깜박 거리고 비어있게되었습니다. 나는 runnable로 바꾸어 잠을 자면 오류 사냥을 시도 할 수 있었다. 지금 모든 오류 수집 코드를 제거했습니다. 그것은 전 또는 후에 sleep() 때 이미지가 화면에 넣어 50ms보다 오래 동안 화면에 놓여 있고 그려진 후 1ms처럼 멀리 깜박 거리지 않는 나타납니다.

나는 무슨 일이 일어나고 있는지 잘 모르겠습니다. 나는 아마 분명하지 않을 것이고 나는 사과한다.

import java.awt.Canvas; 
import java.awt.Graphics; 

import javax.swing.JFrame; 


public class test extends Thread{ 

    public static void main(String[] args){ 

     test t = new test(); 
     t.start(); 
    } 

    @Override 
    public void run() { 
     JFrame f = new JFrame("Test"); 
     Canvas c = new Canvas(); 
     Graphics g; 

     c.setSize(400, 400); 
     f.add(c); 
     f.pack(); 

     f.setVisible(true); 
     c.setVisible(true); 

     try { 
      sleep(2000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     g = c.getGraphics(); 

     g.drawRect(10, 10, 40, 68); 

    } 
} 
+0

스택 오버플로에 오신 것을 환영합니다! [실행 가능한 예제] (https : // stackoverflow.com/help/mcve)를 사용하면 추측 작업이 줄어들고 더 나은 응답이 생성됩니다. – MadProgrammer

+0

또한 Swing을 사용하여 AWT 기반 구성 요소를 사용하는 이유가 무엇입니까? – MadProgrammer

+0

나는 나의 noobiness를 용서했다, 나는 녹슨 것이고, 처음에는 특히 숙련되지 않았다. 이제 실행 가능한 코드를 작성하겠습니다 ... – user3765631

답변

0

기본적으로 이것은 AWT에서 페인팅이 작동하는 방식이 아닙니다. 페인팅은 구성 요소의 paint 메서드 컨텍스트 내에서 수행되어야합니다. AWT에서는 Canvas이 기본 구성 요소로 사용되는 것으로 보입니다.

당신은 떨어져 null를 반환 할 수 있었다에서, 그것은 마지막 페인트주기에서 Graphics 컨텍스트를 나타냅니다 getGraphics를 사용해서는 안됩니다은 여기에 추가 아무것도 아마 어떤 일이 일어나고 ... 새로운 페인트 이벤트에 약 닦아 낼 수있다 너에게.

도장 작업 방법에 대한 자세한 내용은 Painting in AWT and Swing을 참조하십시오.

15 년 전 Swing으로 대체되어 AWT 기반 API를 사용하지 못하게했습니다.

스윙

0

당신은 가지 아이디어를 얻고에서 그림에 대한 자세한 내용은 Performing Custom Painting 살펴보고 있지만, 우선 check out this code를 들어, 게임을 만드는 몇 가지 표준 디자인 패턴이있다.

기본적으로 게임 루프를 호출하여 매초마다 특정 시간 (프레임 속도 또는 프레임 수)을 업데이트하고 렌더링합니다. 렌더링 할 때 특정 간격으로 새 위치에서 이미지를 지우고 다시 그립니다. fps가 60이면 초당 60 번 렌더링 (지우고 다시 그릴) 할 수 있습니다. 또한 버퍼 전략 (위의 예 참조)과 같은 고급 개념을 도입하여 찢어짐이나 깜빡 거림을 줄일 수 있습니다.

을 요약하면, 당신은 단지 지속적으로 할 필요의이 친절 g = c.getGraphics() 그래서 ... 나는 처분을 추가

while (true) { 
    g = c.getGraphics(); 

    // set color 
    // draw a rectangle 

    g.dispose(); 
} 

참고 방법까지이 의지 만 무료 사용되지 않은 메모리가 . 명확하게하기 위해, 이것은 결코 좋은 코드는 아니지만, 시작하기위한 장소를 줄 것입니다.

이 깜박임은 화면이 하나뿐이기 때문에 깜박임을 중지하려면 buffer strategy이 필요합니다. 기본적으로 두 개의 버퍼를 갖는 것은 두 개의 스크린을 갖는 것과 같습니다. 하나의 '화면'에서 렌더링하는 동안 두 번째 화면에서 다음 단계를 지우고 두 개의 버퍼 사이를 전환 할 수 있습니다. 이렇게하면 깜박임이 줄어 듭니다.