2016-09-01 4 views
-1

2D 게임을 만들어 Java 기능을 향상 시키려고합니다. 나는 기본적인 게임을 만드는 것에 성공했고, 지금 내가 개선 할 수있는 것을보기 위해했던 일로 돌아가고 있으며, 코드를 약간 재구성하고있다. 이전에 GraphicsObject 객체를 가져야하는 GameObject (내 게임을 위해 만든 다른 클래스)를 그리는 drawObject 메서드가 있었지만 지금은 Graphics2D를 확장하고 "draw (X) "메서드를 사용하여 Graphics2D 객체를 전달할 필요가 없도록 확장 클래스에 만들었지 만 어려움이 있습니다.Graphics2D 확장 - 캐스팅 예외 발생

다음과 같이 클래스를 시작합니다 : public abstract class GameGraphics extends Graphics2D. 이클립스에서는 아무 에러도 나타나지 않는다. 그러나 나는 그것을 실행한다. 렌더링을 할 때 sun.java2d.SunGraphics2D을 확장 한 클래스의 인스턴스에 캐스트 할 수 없다는 오류가 나타나면 실행한다.

오류가 다음 줄에 나타납니다 : GameGraphics graphics = (GameGraphics) strategy.getDrawGraphics();

내가의 Graphics2D에서 특정 방법을 사용할 필요가 있다는 사실에도 불구하고, 나는 무슨 일이 일어날 지보고 대신 그래픽을 확장하기 위해 시도했다. Graphics2D 함수에 대한 호출을 수정하고 오류가 발견되지 않았지만, 실행했을 때 정확한 오류가 발생했습니다. 심지어 SunGraphics2D 부분도 동일했습니다.

명백한 문제는 Graphics2D를 확장하는 대신 클래스에 단순히 Graphics2D 인스턴스가 포함되도록하는 것이 분명하지만, 가능하다면 확장하는 것이 훨씬 더 낫습니다.

도움이 될 것입니다.

GameGraphics graphics = (GameGraphics) strategy.getDrawGraphics(); 

그래픽스 전략 객체가 GameGraphics의 대상이 아닌에서 얻은 객체와 같은 캐스팅하는 것은 그렇게하지 않습니다

+4

당신은'Graphics2D'를 확장 할 의도가 없습니다. 플랫폼 고유 버전은이를 확장 한 버전입니다. 상속에 비해 컴포지션을 선호합니다.이 경우에는 선택의 여지가 없습니다. – Kayaman

+0

대단히 감사합니다! 그럴거야. – VortixDev

답변

1

문제는이 라인에 있다는 것입니다. 비록 당신이 이것을하고 싶지 않거나 적어도 (쉽게는 할 수 없다) 확신 할 수는 없지만 실제로 캐스팅은 GameGraphics 객체를 생성하도록 전략을 수정할 수있는 경우에만 작동합니다. 카야 만 (Kayaman)이 말한 것처럼 - 상속이 아니라 원하는 것을 얻기 위해 구성을 사용합니다.

+0

아 맞아. 감사. 나는 Graphics2D (아무런 문제가 없다)로 캐스팅을 시도해 보았다가 더 구체적인 GameGraphics로 캐스팅을 시도해 보았습니다. 그래서 나는 그것이 작동 할 것이라고 생각했습니다. – VortixDev

+0

@VortixDev : 개체 **는 ** Graphics2D 개체입니다. –