2013-07-22 4 views
8

저는 전체 객체 지향 패러다임에 대해 매우 새롭습니다.객체 지향 자바 스크립트로 모델을 작성하려고 시도합니다.

특정 게임에서 캐릭터를 모델링하려고하고 있는데, 레벨, 클래스 및 장비가 서로 다릅니다.

등 결국 내 목표는, 플레이어가 사이트를 열 수있는 몇 가지 종류의 "옷장"을 만들 일부 갖추고있다에 시도하고 그것이 비용이 얼마나 자신의 매개 변수에 영향을 미치는 방식을 볼 수있을 것

,

이미 프로그래밍 된 주요 부분이 있지만 (here) html, css 및 javascript로 작업 한 첫 번째 작품이었으며 현재로서는 큰 혼란이 있습니다. 내가 제대로이 시간을 밖으로 시작하고 싶어 :)


나는 우리가 시뮬레이션 될 문자 객체가 있다고 가정 나이트가로 시작 :

var Lord = function(){ 

    this.Level =  1; 
    this.Gender =  'Male'; 
    this.Faction =  'Knight'; 

    this.Attack =  0; 
    this.Defense =  1; 
    this.SpellPower = 0; 
    this.Knowledge = 0; 
    this.Luck =  0; 
    this.Morale =  1; 
    this.Initiative = 0; 

    this.addParameter = function(Parameter, amount){ 
     this[Parameter] += amount; 
    }; 
    this.changeLevelTo = function(Level){ 
     this.Level = Level; 
    }; 
    this.changeGenderTo = function(Gender){ 
     this.Gender = Gender; 
    }; 
    this.changeFactionTo = function(Faction){ 
     this.Faction = Faction; 
     //adjust default stats based on new faction 
    }; 
}; 

내 문제는이입니다 1 방위와 1 사기, 다른 파벌은 당신에게 다른 stat 부스트를 줄 것입니다. 이 값은 다시 할당 할 수 없습니다. 플레이어는 평준화시 다른 매개 변수를 사용하기 위해 몇 가지 stat 포인트를 얻었으며 다시 할당 할 수 있습니다.

플레이어는 또한 스탯 강화를 제공하는 장비를 장비 할 수 있으며, 장비를 재배치 할 수는 없습니다.

내가 이전에 해왔 던 것은 각 매개 변수에 해당하는 색인을 가진 모든 배열을 만들었고, 각 배열은 다른 진영의 기본 통계 증가, 장비의 총 통계 증가 및 플레이어가 수동으로 할당 한 통계입니다. 그런 다음 각각의 인덱스를 합하여 최종 매개 변수 배열을 표시합니다. 그러면 플레이어는 다른 배열이 아닌 3 번째 배열에서만 포인트를 재 할당 할 수 있습니다.

객체 지향 프로그래밍을 사용하여 구현하려면 어떻게해야합니까?

것은 내가 기본 개념 (캡슐화, 상속, 다형성)의 일부에 읽었하지만 그들은 오히려 추상적이고 나는 그것을 내려 할 때, 난 정말 안 할 확실히 알고 :의

-

-


응답


01 내가 노력하고 내가 qternion의 대답에서 얻을 수있는 것을 볼 수 있습니다,

O 확인 : 23,516,

이 webstie 사용하는 것은 매우 어렵다, 내가 가진 것이 주님 객체에 다음

var Faction = function(atk, def, sp, kn, luk, mor, ini){ 
    this.Attack =  atk; 
    this.Defense =  def; 
    this.SpellPower = sp; 
    this.Knowledge = kn; 
    this.Luck =  luk; 
    this.Morale =  mor; 
    this.Initiative = ini; 
} 

var Knight = new Faction(0,1,0,0,0,1,0); 
var Wizard = new Faction(0,0,0,1,0,1,0); 

//this.Faction = 'Knight' 
    this.Faction = Knight 

    this.Defense = function(){ 
     return this.Faction.Defense + this.someOtherClass.Defense; 
    } 

내가 프로토 타입 http://javascript.crockford.com/prototypal.html

를 사용하여 위를 개선하기 위해 찾고있을거야

여러분의 모든 기여에 감사드립니다.

+0

'나이트는 1 Defense'로 시작 - 그래서 개체 리터럴 1로 설정 ...'방어 : 0,'=>' 방어 : 1, ' –

+0

맞음, 기다림 : – Sylin

+1

Javascript OO 기술을 향상시키려는 정신으로이 프로토 타입 기능에 대한이 게시물을보고 싶을 수도 있습니다. http://stackoverflow.com/questions/12238103// javascript-prototype-vs-general-functions-performance-readability –

답변

2

회원 변수 대신 통계 값을 사용할 수 있습니다. 그런 식으로, 예기치 않은 knight.defense()를 호출 할 때 주어진 stat를 계산할 수 있습니다. 차례대로 캐릭터 클래스의 defense() 메소드는 faction 클래스의 defense(), equipmentSet 클래스의 defense() 등을 호출 할 수 있습니다.이 장점은 추가로 stat 수정자를 추가 할 수 있다는 것입니다. 예를 들어, 당신은 퍽 시스템이나 뭔가를 원합니다.

각 진영 클래스는 자신의 수 정치에 대한 defense() 함수를 재정의 할 수 있습니다.

나는 이것을 가장 객체 지향적 인 방법이라고 부르지는 않겠지 만, 나는 자바 프로그래머로서 스스로 그것을 할 수있는 방법이다.

부록 : 명왕성의 대답은 재사용 가능한 "클래스"(개별 개체 대신)를 얻는 방법이기도합니다. 앞서 언급했듯이 저는 Faction을 문자열이 아닌 클래스로 만듭니다 (instanceof로 유형을 확인할 수 있습니다) :

var Faction = function(){ 
    this.prototype.defense = function() { return this.Defense; }; 
    this.prototype.initStats = function() { this.Defense = 0;}; 
    this.initStats(this); 
}; 

var Knight = new Faction(); 
Knight.prototype.initStats = function() { this.Defense = 1;}; 

예를 들어.

+0

기다려주십시오. 다음을 시도해보십시오. q – Sylin

+0

대기 중이므로 계산할 예정입니다. 어쨌든 방위를 제시하기 전에 방위 법의 반환 값을 컴퓨팅 대신 계산하여 방위 속성에 할당 한 다음 속성 자체를 사용할 수 있습니까? 나는 이것을 조금씩 시작하기 시작했다. D – Sylin

+0

그래, 그게 다예요. 예를 들어 일시적인 stat 수정이있을 수 있고 다른 검사를하기 위해 캐릭터의 기본 방어를 캐싱하려는 경우와 같이 반환 값을 수동으로 할당하기 만하면됩니다. – qternion

2

원하는 경우 배열을 유지할 수 있습니다. 객체 지향 프로그래밍의 가장 중요한 점은 캡슐화입니다. 하위 레벨 구현에 대해 아무 것도 알지 못해도 Character 객체와 상호 작용할 수있는 방법을 제공합니다. ,

var link = Knight(); 
link.equip(new MasterSword()); 
alert(link.getAttackPoints()); 

어를 : 당신은 (!도 모두 아래에있는 경우, 그 객체가 실제로 구축 방법) 당신이 원하는 것은 다음과 같습니다 코드를 작성하는 것입니다 객체이 아닌 배열이나 해시 테이블을 처리 할 그것의 @qternion 종류를 이길. 그래서 저는이 답변을 위키로 바꾸고 있습니다! 이걸로 SO의 지혜를 발휘해 봅시다.

+0

Answer2wiki가 의미하는 바는 잘 모르겠지만, 도움이된다면 그리고 나, 그때 나는 괜찮아. :) – Sylin

2

Lord를 함수 (즉, var Lord = function() { /* current code */ })로 변경하고 속성을 this.Level = 1;으로 설정하면됩니다.이제부터는 대부분의 객체 지향 프로그래밍 언어와 마찬가지로 new Lord()으로 원하는만큼의 영주를 만들 수 있습니다.

실제로 이러한 예 ...

var Lord = function() { 

    this.Level=1; 
    this.Gender='Male'; 
    this.Faction='Knight'; 

    /* ... */ 

    this.addParameter=function(Parameter, amount){ 
     this[Parameter] += amount; 
    }; 

    /* ... */ 
}; 
var a=new Lord(); 
var b=new Lord(); 
+0

좋아, 아마도 내가 이것으로 바꿀거야 나는이 표기법을 장비 등에 사용할 계획이었고 주위에 옷을 입을 캐릭터가 한 명만있을 것이므로 나는 문자 그대로의 표기법이지만, 나는 그것에 익숙하지 않았다. – Sylin

관련 문제