문제

저는 소규모 RPG 프로젝트에 일종의 관찰자 패턴을 사용하여 중앙 이벤트 전달 시스템을 만들려고 하는데, 이벤트 데이터를 가장 잘 표현하는 방법에 대한 조언이 필요합니다.

Event_Input_KeyPressed 또는 Event_Game_ActorMoved와 같은 정적 열거형에 정의된 다양한 이벤트 유형에 대한 리스너 클래스를 등록하는 EventManager가 있습니다.이벤트를 대기열에 저장하고 해당 리스너에 전달합니다. 각각의 리스너에는 handlerEvent(Event e) 등의 메서드가 있습니다.

각 이벤트는 이벤트 유형과 같은 데이터를 보유하는 Event 유형의 객체가 됩니다.

내 질문은 이벤트 데이터의 성격이 이벤트 유형에 따라 상당히 다르기 때문에 이 데이터를 어떻게 표현해야 하는가입니다.앞으로 어떤 유형의 이벤트를 만들고 싶은지 아직 확실하지 않으므로 최대한 유연하게 만들고 싶습니다.예를 들어 특정 조건이 충족되면 이벤트가 다른 이벤트를 트리거할 수 있습니다.플레이어가 동작 키를 누르면 플레이어가 특정 위치에 있고 키가 있으면 문이 열립니다.XML이나 스크립트가 좋은 선택입니까?제가 생각할 수 있는 또 다른 방법은 ActorEvent 또는 MenuEvent와 같은 모든 일반 이벤트에 대해 사용자 정의 클래스를 만드는 것입니다. 하지만 이는 정말 비효율적이고 유연성이 없어 보입니다.또한 Character와 같은 일부 객체는 "w" 키를 눌렀을 때와 같은 매우 구체적인 이벤트만 알아야 하기 때문에 "h"와 같은 다른 키를 눌렀을 때 알림을 받을 필요가 없다고 생각합니다.특정 이벤트 유형을 생성하는 것이 가능합니까, 아니면 더 좋은 방법이 있습니까?즉.Event_Input_KeyPressed_W

감사해요

도움이 되었습니까?

해결책

  1. 다음에서 확장하여 이벤트의 구체적인 구현을 만듭니다. Event 기본 개체.첫째, 개체를 배포하는 것이 더 쉬울 것입니다. 즉, 대기열에 있는 개체를 배포하기만 하면 됩니다. instanceof 물체를 다루는 방법을 결정합니다.
  2. 이벤트 리스너 코드가 훨씬 더 간단해지고 더 엄격하게 제어됩니다.마우스 이벤트가 주요 이벤트를 지나갈 가능성은 없습니다.또한 리스너 수준에서 이벤트 객체를 테스트하고 캐스팅할 필요가 없습니다.
  3. 특정 이벤트의 특정 조건에 대해서만 알림을 받기를 원하는 "필터링된" 이벤트 리스너를 왜 만들 수 없는지 알 수 없습니다. 실제로는 좋은 아이디어라고 생각합니다.
  4. 아마도 일종의 플러그형 디스패치 메커니즘을 고안했을 것입니다.즉, 새 이벤트 유형을 추가할 때 대기열을 업데이트할 필요 없이 새 디스패처만 등록하면 됩니다.달성하려는 목표에 따라 대기열은 이벤트를 디스패처에 전달합니다(디스패처가 리스너 목록을 가져올 수 있는 몇 가지 수단 제공).디스패처는 이벤트 처리 방법을 알고 있는지 여부를 결정합니다.그런 다음 디스패처는 필요한 리스너에게 이벤트를 전달하고(그리고 달성하려는 내용에 따라) 이벤트가 전달되었는지 여부를 나타내는 결과를 반환합니다.

그게 MHO야

다른 팁

  • 다른 이벤트 유형의 구조가 다르므로 각 이벤트에 대한 구체적인 클래스를 만드는 것이 좋습니다.각 키에 대해 클래스를 만들 필요가 없습니다!그러나 일반적으로 키보드 이벤트
  • 문자는 특정 키에 대해서만 통지해야한다고 말합니다.문자를 알리고 객체가 무관 한 키를 무시할 수있는 오버 헤드가 무엇인지 모르지만이 옵션이 클래스간에 일반적인 패턴이라면 10 개의 다른 클래스가 특별한 키에 반응 할 수있는 10 가지 클래스가 있습니다.코드를 반복하지 않고 이벤트와 청취자간에 디스패처 레이어를 구현하지 않습니다.하나의 종류의 Disptachers는 키 목록을 받고 이벤트를 기반으로 이벤트 목록을 수신하는 KeyFilterDispatcher 일 수 있습니다.다른 종류의 디스패처는 특정 순서로 여러 이벤트가 고려되는 경우 청취자 만 방해하는 seqdispatcher 일 수 있습니다! 나는 MadProammer가 말했다.또한 디스패처의 파이프를 만들고 싶을 수도 있습니다!
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top