2011-12-07 1 views
0

내 XNA 게임에 대한 사용자 지정 단추 클래스에서 작업하고 있습니다. 따라서 저는 C#으로 게임을 개발 중입니다.C#의 내 사용자 지정 단추 클래스의 상태에 따라 특성 덮어 쓰기를 제공하는 방법

내 단추 클래스는 매우 기본적이고 MouseOver, MouseOut, MouseDown 등의 필수 이벤트를 제공합니다. 또한 Text, TextAlign, BackgroundColor, TextColor 및 Font와 같은 전체 모양에 영향을주는 일부 공용 속성이 있습니다.

모든 단추는 정상, 호버, 눌린 및 비활성의 4 가지 상태가 될 수 있습니다. 내 게임 개발자에게 "상태 별"버튼의 모양을 제어 할 특정 "덮어 쓰기"를 지정할 수있는 기회를 제공하고 싶습니다.

저는 불행히도 멋진 해결책을 찾을 수 없습니다. 현재 모든 상태에 대해 별도의 Button 인스턴스를 보유 할 수있는 배열을 간단하게 작성합니다. 이제 사용자가 덮어 쓰기를 만들려면 Hovered-state를 말하면 버튼 배열의 해당 인덱스 위치에 새 Button 인스턴스를 만들면됩니다 (이 매핑에 대한 열거를 사용하여 바이트 값으로 캐스팅됩니다. 적절한 인덱스 위치를 검색). 이제 사용자는 가능한 모든 상태에 대해 덮어 쓰기를 정의 할 수 있습니다. < -> 속성 조합.

그리기 방법에서 마침내 현재 버튼의 현재 활성 상태가 무엇인지 확인하고 내 배열 컬렉션에서 적절한 버튼 인스턴스를 그립니다.

이것은 매우 깨끗한 해결책은 아닙니다. 단 하나의 상태에 대해 TextColor를 덮어 쓰고 싶을 때를 대비하여 많은 오버 헤드가 발생하기 때문입니다. 나는 이것이보다 전문적인 솔루션에서 어떻게 일반적으로 해결되는지 궁금해하고있었습니다.

누구나 해당 도메인에서 유용 할 수있는 디자인 패턴에 대한 몇 가지 팁이 있습니까? 의미있는 키워드가 누락되어 솔루션을 검색하는 데 문제가있었습니다.

답변

1

당신이 당신의 custombutton 변경을 사용하여 자신의 설정 클래스를

편집

public class ButtonSettings 
{ 
    private ButtonSettings parentSettings; 

    public void ButtonSettings(ButtonSettings parent) 
    { 
    parentSettings = parent; 
    if (parent == null) 
    { 
     // initialize default values 
     TextAlign = TextAlign.Left; 
     // ... 
    } 
    } 

    private Alignement textAlign = null; 
    public Alignement TextAlign 
    { 
    get { return textAlign != null ? textAlign : (parentSettings != null ? parentSettings.TextAlign : default(Alignement)); }; 
    set { textAlign = value; }; 
    } 

    // do the same as TextAlign ... 
    public Color BackgroundColor { get; set; } 
    public Color TextColor { get; set; } 
    public Font Font { get; set; } 
} 


public enum ButtonState 
{ 
    Normal, 
    Hovered, 
    Pressed 
    Inactive 
} 

를 구현하고 버튼 클래스

public class CustomButton : Button 
{ 
    public CustomButton() 
    { 
    // initialize your settings 
    Normal = new ButtonSettings(); 
    Hovered = new ButtonSettings(Normal); 
    Pressed = new ButtonSettings(Normal); 
    Inactive = new ButtonSettings(Normal); 

    State = ButtonState.Normal; 
    } 

    public ButtonSettings Normal { get; set; } 
    public ButtonSettings Hovered { get; set; } 
    public ButtonSettings Pressed { get; set; } 
    public ButtonSettings Inactive { get; set; } 

    public ButtonState State { get; set; } 
} 

이제 사용자에 그것을 사용하려고 할 수 있습니다 설정

홉 이것은 도움이된다

+0

확실히 오버 헤드가 줄어들지 만 네 가지 설정 인스턴스를 유지해야합니다. 모든 KeyValuePair가 덮어 쓰기를 나타낼 수있는 사전 컬렉션과 같은 것에 대해 생각해 보았습니다. 그러나 나는 그것을 정말 일반적으로 만들 수있는 어려움을 겪고 있습니다 ... 나는 더 많은 제안을 원하지만 귀하의 제안은 구현하기가 가장 쉽다고 생각합니다. – Daniel

+0

당신의 솔루션 인 @ punker76을 가지고 조금 놀았습니다. 누락 된 기능은 속성 계층과 같습니다. 호버 및 활성 설정은 정상 상태의 하위 스타일입니다. 호버 설정에 의해 덮어 쓰기되지 않는 일반 설정 인스턴스의 속성이 변경되면이 설정도 변경되어야합니다. 이벤트 접근 방식을 사용하여 구현하려고 시도했지만, 어떤 속성이 덮어 쓰기인지 아닌지를 추적해야하기 때문에이 오류는 빠르게 추악하고 오류가 발생합니다. – Daniel

+0

@Daniel 귀하의 새로운 질문에 뭔가를 바 꾸었습니다. – punker76

0

내 생각은 punker76과 비슷하지만 스프라이트 시트를 잊어 버리지 말고 추가하자.

네 개의 빈 단추가있는 단일 단추 시트를 사용할 수 있으며 상태가 변경 될 때마다 SourceRectangle를 이동하면됩니다. '하나의 버튼'을위한 4 개의 다른 버튼 인스턴스를 저장하는 대신 각 버튼에는 네 가지 설정 (배열에서도 마찬가지입니다)과 각 상태에 대한 버튼의 원하는 모양으로 된 단일 스프라이트 시트가 있습니다.

그리고 맨 위에는 기본 그리기 방법에 버튼 논리 대신 단추를 그릴 수 있습니다.

관련 문제