2009-12-16 3 views
0

작은 게임을 만드는 중입니다. 엔진에는 GUI가 등록 할 수있는 여러 이벤트가 있습니다.여러 이벤트 args 처리 방법

  • 나는 단지 볼의 한 종류가 있다면
  • 모두 잘 될 것

이을 ballremoved ballmoved balldeselected ballselected하지만 X 번호 볼 종류가 있습니다 : 이벤트는 . 그것들은 모두 추상적 인 Ball 클래스에서 파생됩니다.

각 볼 유형에는이 이벤트가 발생했을 때 발생하는 고유 한 동작이 있습니다. 그들은 모두 다른 정보를 다시 GUI로 전달해야합니다. 예를 들어, 나는이 두 종류의 볼을 가지고 있습니다. 여기에 정보량을 줄이는 것이 더 있습니다.

  • BallBouncing

BallBouncing 그것이로 이동했을 수 있습니다 GUI를 말할 필요가있을 것이다, 그래서 그냥 자기에 대한 정보를 다시 전달 할

  • BallExploding.

    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 저음 클래스에 포함되어 있으며 각 파생 클래스는 호출하는 항목을 결정합니다 (모든 메서드는 가상이므로 필요한 경우 변경할 수 있습니다).

    모든 의견을 보내 주셔서 감사합니다. 나는 재미로 이것을하고 있지만, 주로 다양한 종류의 응용을 개발하는 올바른 (그리고 잘못된) 방법을 배우는 것이다.

  • +0

    이것은 상속하는 특성에 대해서만 BallTypes 계층을 사용하고 있으며 작업이 재정의되지 않는다는 것을 의미합니다. 튀는 공은 폭발 할 수 없기 때문에 폭발 할 수 없습니다. 이것은 속성의 상당 부분이 다름을 의미합니다. 그래서 당신은 추상적 인 클래스에서 어떤 정보를 유지하고 있습니까? 그런데 공이 계층 구조에 속할 수 있다면 왜 그곳에 이벤트 args가있을 수 없습니까 ?? 이 예제에서는 특수화가 좋지 않습니다. 한 가지 유형을 더 추가해야하는 경우가 있습니다. 어떻게 할 것이며 캔버스에 업데이트를보고하려면 어떻게해야합니까? 새 코드를 올바르게 추가하는 방법은 무엇입니까? –

    답변

    0

    디자인이 괜찮습니까?

    내 말은, 왜 'BallExploding'과 'BallBouncing'을 가지고 계신지요? 공의 조작이 아닌가? (볼이 폭발 할 수 있고 볼이 튀어 오를 수 있습니까?) 아니면 'BallExploding'이 튀어 오를 수 없으며 BallBouncing이 폭발 할 수 없습니까?

    +0

    안녕하세요, 제 디자인이 조금 엉망이 될지도 모른다고 생각했습니다. 폭발 할 수있는 공이 튀지 않을 권리. 나는 Ball과 같은 물체를 그들의 논리와 구별하려고 노력했다. 그래서 저는 그것들을 생성하기위한 객체와 팩토리를위한 DLL과 동작과 같은 것을 다루는 BallLogic을위한 또 다른 DLL을 가지고 있습니다. 게임 보드에도 같은 내용이 적용되었습니다. 이것이 최선의 아이디어인지 아닌지 확실하지 않은 것은 물체와 기능을 분리하여 유지하려고 시도한 것이 었습니다. – Jon