작은 게임을 만드는 중입니다. 엔진에는 GUI가 등록 할 수있는 여러 이벤트가 있습니다.여러 이벤트 args 처리 방법
- 는
- 는
- 나는 단지 볼의 한 종류가 있다면
- 모두 잘 될 것
이을 ballremoved ballmoved balldeselected ballselected하지만 X 번호 볼 종류가 있습니다 : 이벤트는 . 그것들은 모두 추상적 인 Ball 클래스에서 파생됩니다.
각 볼 유형에는이 이벤트가 발생했을 때 발생하는 고유 한 동작이 있습니다. 그들은 모두 다른 정보를 다시 GUI로 전달해야합니다. 예를 들어, 나는이 두 종류의 볼을 가지고 있습니다. 여기에 정보량을 줄이는 것이 더 있습니다.
- BallBouncing
BallBouncing 그것이로 이동했을 수 있습니다 GUI를 말할 필요가있을 것이다, 그래서 그냥 자기에 대한 정보를 다시 전달 할
BallExploding은 주변 볼을 파괴합니다. 그래서 그것이 어떤 공인지, 그리고 그것이 파괴 한 모든 공을 말할 필요가 있습니다.
이 두 볼 유형은 모두 동일한 이벤트에서 시작될 수 있지만 다른 이벤트 인수가 있습니다. 값의 사전을 포함 할 수는 있지만 명시 적으로 각 유형에 대한 사용자 정의 이벤트 인수를 갖는 것은 아닙니다.
나는 또한 각 공 유형에 대한 공을 포함하고있는 공을 가진 사용자 정의 이벤트 args를 작성하면 이벤트 인수를 다시 캐스팅 할 수 있다고 생각했습니다.
public abstract class BallBaseEventArgs : EventArgs
{
public Ball ball;
}
public class BallExplodingEventArgs : BallBaseEventArgs
{
public IList<Ball> explodedBalls;
}
그래서 GUI 이벤트 처리기에서 어떤 공 유형이 사용되었는지 알면 이벤트 인수를 전송합니다. 나는 더럽고 너무 단단히 묶여있는 것처럼이 해결책을 많이 좋아하지 않습니다.
그래서 나는 누군가에게 이런 종류의 상황을 해결할 제안, 아이디어가 있는지 묻고 싶습니다.
I을 :
감사
존
편집
OK, 그래서 나는 그것이 우리에게 걸리는 위치를 명확히 볼하려고 조금 더 내 구조를 설명 할 것이라고 생각 보드와 볼의 인터페이스를 가진 Objects DLL을 가지고 있습니다. 보드 타입과 보드 타입을위한 두 개의 Enum 타입과 하나의 Ball 타입을 가지고 있습니다. 이것은 주로 어떤 타입의 오브젝트인지를 알기 위해 사용됩니다 만들다). DLL에는 Ball 클래스와 Board 클래스의 다양한 구현이 있습니다.
추상 Ball 클래스는 색상, X 및 Y 좌표와 같은 정보를 보유하고 BallType Enum을 선택합니다. 여기에는 Clone() (ICloneable)과 CompareTo (Equals 및 해시 값 비트 포함)의 두 가지 메소드가 있습니다.
저는 Ball 's Board 및 Game Configuration Data에 대한 액세스를 제어하는 싱글 톤 객체를 가진 Instance Manager DLL을 가지고 있습니다. 이 DLL은 또한 BallFactory와 boardFactory를 가지고 있습니다. (이것들이 Object DLL에 있어야하는지 확실하지 않습니다. 이유는 그들이 말하기에 객체가 아니기 때문이며, 이것이 훌륭한 연습인지 확실하지 않습니다.)
그럼 엔진 DLL이 있습니다. 이 게임의 모든 논리를 다룹니다. 어떻게 보드와 볼이 만들어 지는지, 왜 보드와 볼이 만들어 지는지, 어떻게 사용되는지. 공 및 보드 클래스 용 LogicFactory가 있습니다 (이 모든 팩토리는 BallTypes 및 BoardTypes Enum을 사용하여 어떤 구현을 사용할 것인지 결정합니다).
논리 클래스는 보드 주위에 공을 이동하고 공의 액션 메소드 호출 방법을 결정 :
- 는
- 는
- 는
- 이 ballremoved ballmoved balldeselected ballselected에
공 논리 클래스.
내가 모든 논리를 객체에 넣지 않은 이유는 논리와 기능이 데이터를 저장하는 객체와 분리되어야한다고 생각했기 때문입니다 (완전히 잘못 될 수 있음). Ball이 움직일 수있는 방법에 대한 대부분의 기능은 BallLogic 저음 클래스에 포함되어 있으며 각 파생 클래스는 호출하는 항목을 결정합니다 (모든 메서드는 가상이므로 필요한 경우 변경할 수 있습니다).
모든 의견을 보내 주셔서 감사합니다. 나는 재미로 이것을하고 있지만, 주로 다양한 종류의 응용을 개발하는 올바른 (그리고 잘못된) 방법을 배우는 것이다.
이것은 상속하는 특성에 대해서만 BallTypes 계층을 사용하고 있으며 작업이 재정의되지 않는다는 것을 의미합니다. 튀는 공은 폭발 할 수 없기 때문에 폭발 할 수 없습니다. 이것은 속성의 상당 부분이 다름을 의미합니다. 그래서 당신은 추상적 인 클래스에서 어떤 정보를 유지하고 있습니까? 그런데 공이 계층 구조에 속할 수 있다면 왜 그곳에 이벤트 args가있을 수 없습니까 ?? 이 예제에서는 특수화가 좋지 않습니다. 한 가지 유형을 더 추가해야하는 경우가 있습니다. 어떻게 할 것이며 캔버스에 업데이트를보고하려면 어떻게해야합니까? 새 코드를 올바르게 추가하는 방법은 무엇입니까? –