2012-02-05 5 views
3
public class ComEffectColor : ComEffectBase<Ref<Color>> 
{ 
    private readonly Color finalColor; 
    private Color originalColor; 

    public ComEffectColor(Ref<Color> effectTarget, Color finalColor, TimeSpan duration, TimeSpan startDelay) 
     : base(effectTarget, duration, startDelay) 
    { 
     this.finalColor = finalColor; 

     StartDelayEnded += ComEffectColorStartDelayEnded; 
    } 

    protected override void UpdateCustom() 
    { 
     if (elapsedTime < duration) 
     { 
      float progress = (float)(elapsedTime.TotalMilliseconds/duration.TotalMilliseconds); 

      effectTarget.Value = Color.Lerp(originalColor, finalColor, progress); 
     } 
     else 
     { 
      effectTarget.Value = finalColor; 

      InvokeFinished(); 
     } 
    } 

    void ComEffectColorStartDelayEnded(object sender, EventArgs e) 
    { 
     originalColor = effectTarget.Value; 
    } 
} 

이 다양한 숫자 효과의 결과를 요약하기 것은 ComEffectColor의 생성자입니다 : IComEffect 클래스입니다. 이 함수는 다른 객체에 속할 수있는 색상 변수에 대한 포인터를 가져 와서 지정된 기간 동안 'targetColor'쪽으로 점진적으로 값을 변경합니다.하나의 변수

이러한 효과 클래스를 초기화 한 후에는 ComEffectManager 인스턴스에 추가되어 완료된 후에 업데이트 및 제거를 처리합니다.

내가 직면하는 문제는 동일한 색상 변수에 2 개 이상의 ComEffectColor를 혼합하는 방법입니다. 따라서 검정색 (0, 0, 0) 인 색상 변수로 시작하고 첫 번째 대상 색상이 (128, 128, 128)이고 다른 색상이 (0, 0, 0) 인 1 초 길이의 2 ComEffectColor를 추가하면, 0, 0), 1 초 후에 (64, 64, 64)로 끝나야합니다.

효과가 독립적이되기를 원하기 때문에 먼저 모든 색상 오프셋을 수집하고 '힘의 합'을 찾아 색상 변수에 적용하고 싶지 않습니다. 이것은 IComEffect의 다른 기능으로 인한 것이지만 매우 긴 게시물로 만들고 싶지 않습니다.

위의 예제에서 2 개가 계속 실행되는 동안 다른 효과를 추가 할 수 있습니다.

어떻게 할 수 있습니까?

위의 코드는 동시에 실행되는 다른 효과를 덮어 쓰는 단순한 구현입니다. 이것은 모든 종류의 모든 공통 루틴을 처리하는 ComEffectBase에서 상속받을 때 완전한 클래스가 아닙니다.

+0

함수에 대한 모든 호출에 동일한 참조를 부여하면 효과가 독립적 일 수 없습니다. 각자의 상태에 따라 다른 기능들이 아마도 공통 값을 독립적으로 덮어 쓸 것입니다. 비록 그것에 대해 생각하면서도, 나는 당신이 당신의 함수에서 그 값의 사본 대신에 항상 참조 된 값을 사용한다면 당신이 어떻게 문제가 있을지를 보지 못한다. 우리는 약간의 코드를 볼 수 있을까요? – cyanic

답변

1

모든 변형 결과를 수집하고 "최종 변형"대상을 결정하지 않으면 이것이 가능하지 않다고 생각합니다.

예를 들어, 코드를 제거하고 그냥 영어로 말하면 (수학적으로) : 색상 함수 c는 시간 t0에서 색상 c (t0)로 시작하고 약간의 시간 t1 후에 2 개의 " 최종 색 "c (t1) 및/또는 c '(t1). 그것은 하나의 변수를 두 개의 다른 색상으로 두 경로를 통해 가져올 수 없기 때문에 (많은 깜박임없이) 의미가 없습니다. 그래서 대신에 당신은 정말로 두 개의 경로를 취하지 말고 하나의 경로를 취하십시오 : 평균 경로 (또는 다른 경로).

결정 론적으로 할 수있는 유일한 방법은 다음 출력을 선택할 수있는 함수를 만드는 것입니다. 이것은 매개 변수, 시간 및 가능한 경로 (c 및 c ') = f (t, c, c')를 취하는 두 번째 함수, 예를 들어 f를 적용하는 것과 같습니다. 평균 경로의 경우 f는 평균 경로에 대해 알고 있어야합니다.

아마도 첫 번째 경로 또는 마지막 경로 만 사용하는 더 빠른 "선택"기능을 수행 할 수 있습니다. 그러나 그것은 귀하의 요구 사항과 일치하지 않습니다. (또는 양자 컴퓨터에 액세스 할 수있는 경우 ...-))

관련 문제