[1줄요약]
많은 수의 다양한 NPC나 객체에 다양한 이벤트나 효과를 적용하기 위해 하드코딩하지 않는 효율적인 방법에 대해 알고 싶어요 가르쳐줘 인갤에몽!!
[상세질문]
롤에서 자야와 라칸이 같이 귀환하면 남들보다 빨리 귀환할 수 있는 스페셜한 특성이 있잖아?
이건 아마 자야와 라칸 객체에 하드코딩이 되어있을 것 같아
if(같이 귀환하는애 == 라칸 || 같이 귀환하는 애 == 자야) {
//아무튼 빠른 귀환 로직
}
반면에 문명의 불가사의 건물들을 보면 종류는 많은데 출현 조건도 다르고, 필요 재화도 다르고, 효과 적용 방식도 모두 다름
문명6의 피라미드
1) 요구기술 : 석조기술
2) 생산비용 : 220
3) 입지조건 : 언덕이 없는 사막/범람원
4) 효과 : 문화+2, 건설자 1기 무료 제공, 모든 건설자의 건설 횟수 1회 추가
다들 잘 알겠지만 이런게 대충 수십개가 있음. 요구조건, 비용, 효과(즉 이벤트)가 모두 다름
이걸 하드코딩하진 않았을거 같고 뭔가 json이나 xml이나 db에 데이타만 넣어놓으면 알아서 스탯값과 이펙트값과 이벤트가 적절하게 쫘아아악 로딩되서 적용되는 무언가가 있을거 같았음
글치만 보닌쟝의 허접 코딩실력으로는 도무지 어떻게하는지 몰루겠던 거심
그래서 채찍피티를 채찍질 했더니
방법1 : 건물별, 이벤트출현조건, 이벤트효과별로 클래스를 별도로 만들고 그걸 상속하고 조합해서 만들면 됨 ㅇㅇ 개노가다니까 허접한 닌겐 니가 할 수 있으면 해보등가ㅋㅋ
방법2 : LUA 쓰셈 LUA킹왕쨩 ㅇㅇ
라고 답변을 받았음
방법1은 노가다의 끝판왕이라고 하니까 방법2로 가야하는데 보닌쟝은 nil을 써야하고 switch가 없는 LUA에 대한 알레르기가 있는 거심
게다가 LUA는 모딩을 허용하면 모를까 괜히 복잡해지고 모바일이면 암호화도 해야하고 서버검증도 해야하고 아무튼 짜칠거 가틈
그래서 혹시 위 방법 말고 다른 쌈뽕한 방법은 있는지 궁금한 거에요
인갤고수님들 조언'해줘'
조건, 추가 효과 부분만 오버라이드하나?? 바부라 몰루
그거시 방법1이라는거 같아요 대강 한 10개 정도까진 해볼만한것 같은데 많아지면 머리가 뽀개진다고 ㅡㅡ 아니 근데 롤은 챔이 100개 넘어도 잘하는거 같은데 흠....
근데 전 그러고 있는뎀 지금은 30개쯤이긴 하지만은
@211214 ㅋㅋㅋ 일단 저도 이렇게 해봐야겠음 ㅋㅋㅋㅋㅋ ㄳㄳ합니다
스탯을 관리하는 컴포넌트+스탯모디파이어 만들어쓰는중. 스탯 컴포넌트에는 IStat 상속받는 스탯 리스트가 있고 리스트 순회하면서 모디파이어에 적용시킴
스탯DB에서 스탯값들을 쭈우우욱 읽어서 IStat상속받는 스탯리스트에 담은 다음에 스탯 관리 컴포넌트의 모디파이어에서 그 리스트 내용을 객체별로 쫘아악 적용한다는 뜻이지요? 그럼 이벤트 로직 처리는 어떻게 하시나요? 이벤트 적용로직이 다양하면 스탯값만 읽는 걸로는 어려울것 같은데요... 아 사용할 함수이름 같이 넘겨주고 switch문으로 분기해주면 될까요? 파라메터 패턴이 다양하면 이것도 골치아플것 같긴한데 흠...
Runnable이 있으면 Runnable만 따로 Override시키고 Invoke하면 되지않나?
@ㅇㅇ 음 이해가 안가는걸 보니 역시 객체지향 공부가 더 필요하네요 일단 채찍피티 물어서 한번 해볼께요 ㅠㅠ
내가 이해 못하고 다른거 설명한걸수도.. 암튼화이팅
예시의 문명 같은 건 설치 조건, 설치 시 효과 메서드를 인터페이스나 추상클래스로 두고 오버라이딩할듯? 조건 같은건 미리 미리 메서드로 만들어서 설치 조건 메서드는 그거 나열만 주루룩 한다거나 할수도 있고...
문자열 -> bool 리턴 함수 매핑해서 return FuncMap("인접 칸 산") && FuncMap("현재 위치 언덕"); 이런 식으로?
@Ray. 오 기획중인 타일맵 게임에 적용해봐야겟군요 ㄳㄳ ㅋㅋㅋㅋㅋ
oop에서는 스탯, 패시브, 이벤트 개념은 딕셔너리로 만들면 쉬운데 dots 류는 어떻게 하나 모르겠내
ㄴㄴ 저는 oop로 하고 있슴당 근데 이벤트를 딕셔너리로 호출??? 이건 어떻게 하는건가요??? 리플렉션을 끼얹나요? (리플렉션 잘 모르는 1인)
리플렉션은 캐시 해놓는거 아니면 로딩 이외에서 쓰기 안좋은 형식이라 추천안함. 그냥 명시적 캐스팅 연산쓰던가 조금 복잡해도 인터페이스로 의존성 역전 시켜서 데이터 유형 신경 안쓰고 주고 받은 뒤 사용하는 쪽에서 as 연산자로 암시적 캐스팅 연산 쓰는게 리플렉션보다 좋음 데미지 계산으로 예 들어보면 딕셔너리에 "공격시" string 으로 key주고 value에 데미지 계산에 사용될 DamageCalc 인스턴스 객체에 접근해 값을 변동시키는 코드가 작성된 AttackPassive1이라는 인스턴스 객체를 저장해둠 나중에 공격 발생하면 공격한 케릭터의 패시브 딕셔너리에서 "공격시" 라는 key 엮인 인스턴스들 꺼내서 타겟이 된 DamageCalc 를 건네주는 방식으로 처리했음
그리고 이게 패시브 구현 뿐만 아니라 퀘스트에도 써먹기 좋고
@Indie1(61.85) 아항 dictionary에 이벤트 함수 자체를 저장할 수는 없으니까 이벤트함수가 들어있는 객체를 저장하는거군요 제대로쓰려면 직접 코딩 해봐야겠네요 의존성역전이나 암시적 캐스팅은 공부를 해야겠군요 감사합니다
개떡같이 말해서 걱정했는데 이해했다니 다행이네요. 한가지 아쉬운 점은 if로 프로그램 흐름이 직접 정해지지 않고 동적 데이터에 흐름을 맡기다보니 의도치 않은 동작이나 무한루프등이 발생할 수 있어 복잡한 규칙을 적용하기는 어려웠음.컴파일러도 동적영역은 컴파일 못해주니까 휴먼에러 심각했고 구현하려는개 복잡해지면 컴파일러 정도는 아니라도 자체적인 규칙은 만들어줘야 될거에요
@Indie1(61.85) 아....생각하지 못했던 런타임 에러가능성이 생기겠군요. 주의해야겠네요 일단 샘플로 구현해보고 추가적으로 궁금한게 생기면 다시 질문하러 와야겠어요 정 안되면 기획을 단순하게 만드는걸로 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
그동안 하드코딩 했는데, 방법 찾으면 정보글 써줘~~
과연 성공할 것인가 두근두근 도키도키