2009-08-12 5 views
3

이 질문에 대한 적절한 질문 제목과 태그를 찾는 것이 다소 어려웠습니다.클래스의 속성을 Modying

기본적으로 나는 여러 유닛/몹이 출현하는 게임을 만들었습니다. 이제는 시스템을 만드는 데 관심이 있습니다. 따라서 각 유닛은 유닛의 속성을 수정할 효과/버프/디버프를 적용 할 수 있습니다. 이러한 효과의 예로는 유닛의 이동 속도를 늦추는 서리 효과, 건강 증진 등이 있습니다. 스크립트를 통해 이러한 효과를 구현할 계획이므로 사용자 지정 사용자 효과를 만들 수 있습니다.

나는 이것을 구현할 수있는 방법에 대한 조언을 찾고 있습니다. 지금은 효과 클래스를 만드는 것에 대해 생각해 봤습니다. 그런 다음 적용된 각 효과는 클래스의 인스턴스가되며 적용된 단위에 대한 참조를 갖습니다. 이 효과는 최소한 두 가지 방법, 즉 각각 적용 및 적용 취소를위한 적용 및 적용 취소 방법을 갖습니다.

이 문제는 다른 누적 비율을 허용하지 않는다는 점에서 문제가됩니다. 마찬가지로,해야 값에 두 번 10 % 증가 (100)과 동일 (120) 또는 (121)

하지 정말 중요한 것을, 그러나

답변

5

당신은 Effect 클래스로 바른 길을 가고 있습니다. 그러나 단위를 참조하는 효과보다는 각 단위에 효과의 목록을 유지하십시오. 속성 값을 얻으려면 apply() 및 unapply() 함수를 사용하여 기본 값을 수정하는 대신 필요한 값을 쿼리합니다 (이로 인해 부동 소수점 오류로 인해 기본 값이 흐트러 질 수 있음).

Effect 클래스에는 입력 값을 부동 소수점 값으로 사용하고 수정 된 값을 반환하는 Modify() 메서드가있을 수 있습니다. 이 비효율적이된다 당신이 이렇게 많은 효과가있는 드문 경우

def get_movement_speed(): 
    value = base_movement_speed() # this is intrinsic to the unit 
    for effect in movement_speed_effects_list: 
     value = effect.modify(value) 
    return value 

을 값을 캐시하고 그들에게 당신이 추가 할 때마다 다시 계산하거나 효과를 제거 : 속성이 의사처럼 보이는 끝 쿼리.

+2

이것은 내 대답보다 의미가 있습니다. +1 –

3

당신이 Decorator 패턴을 생각 해 봤나 그것은 C#으로 코딩되는거야? 실제 사례는 tutorial에서 확인할 수 있습니다.

특정 상황을 설명하기 위해 간단한 예를 작성했습니다. UnitWithPowerUp단위 개체 (이미 장식되어 있거나 아직 장식되어 있지 않을 수 있음)를 허용합니다. 이 클래스에서 Health()를 호출하면 Unit의 상태가 표시되고 기본값 100에 10 %가 추가됩니다. 두 번 꾸미면 121이 반환됩니다. 하나의 장식에 GetDescription()을 호출하면 단위은 "Unit + Power Up"을 반환합니다. 마찬가지로, 이중으로 장식 된 단위은 "Unit + Power Up + Power Up"을 반환합니다.

public abstract class Unit 
    { 

     public virtual string GetDescription() 
     { 
     return "Unit"; 
     } 

     public virtual double Cost() 
     { 
     return 100; 
     } 
    } 

    public abstract class EffectDecorator : Unit 
    { 
     public EffectDecorator() 
     { 
     } 
    } 



    public class UnitWithPowerUp : EffectDecorator 
    { 
     Unit unit; 

     public UnitWithPowerUp(Unit unit) 
     { 
     this.unit = unit; 
     } 

     public override string GetDescription() 
     { 
     return unit.GetDescription() + " + Power Up"; 
     } 

     public override double Health() 
     { 
     return unit.Health() * 1.10; 
     } 
    } 

코드 또는 기타 사항을 테스트하지 않았습니다. 개념을 보여 주려고합니다. 유용하다고 생각하시면 Head First Design Patterns 사본을 받으시기 바랍니다.

+0

입니다. –

+1

클래스에 신규 또는 추가 동작 또는 속성을 동적으로 추가하는 것은 Decorator 패턴의 정의이며 '단위'에 '효과'를 추가하는 것과 유사합니다. –

+2

런타임에 이러한 속성을 변경하는 것은 좋지 않습니다. 필요한 속성입니다. – Kylotan

0

일부 효과를 스크립팅 (전체 효과가있는 게임에 유용 할 수 있음)하려는 경우 런타임 중에 컴파일 할 C#의 기능을 활용할 수 있습니다. Reference. 기본적으로 C#에서 원하는 모든 것을 코딩하고, 바이트 코드를 어딘가에 (레벨 파일 또는 확장 팩의 일부로 잠재적으로) 저장 한 다음, 꺼질 때마다 적절한 C# 코드를 실행하도록 할 수 있습니다.

0

개체 상태를 동적으로 변경해야하는 게임을 할 때 구성 요소 시스템/엔티티 시스템 디자인을 살펴보십시오.

는 지금까지 내가 본이 주제에 대한 최고의 기사는 내가 그 어떤 방법으로 도와 줄 방법을 잘 모르겠어요

http://www.devmaster.net/articles/oo-game-design/

관련 문제