2012-01-18 4 views
0

OOP에 대한 정확한 정보를 얻기가 어렵습니다. 가능한 한 짧게하려고했습니다.Javascript object interaction (OOP)

현재 HTML5에서 점프 n을 개발 중입니다. 게임 개발에 대한 실제 경험이 없습니다. 하지만 기본이 어떻게 작동하는지 알고 있습니다. 내가 제대로하고 있는지 알고 싶다.

게임, 플레이어 및 레벨 개체가 있습니다.

내가 현재하고 있어요 것은 다음

Game.player = new Player(); 
Game.level = new Level(); 

Game.level.load(Game.currentLevel); 
... 
Game.run(); 

는 가장 좋은 방법은 내가 예를 들어, 자신에 그들 모두를 호출해야 또는인가요 : 그들은 방법 난

var Player = new Player(); 
var Level = new Level(); 
Level.load(Game.currentLevel); 
... 
Game.run(); 

지금 당장 (첫 번째) 그것을하는 것이 나에게 더 많은 논리처럼 보입니다. 하지만 .. 레벨 개체 함수에서 게임 개체의 다양한 변수를 확인하거나 자체 함수를 호출해야합니다. 따라서 Level 객체 함수 내에 Game.level.funcName을 써야합니다. 그러나 Game.level은 레벨 객체 선언 지점에 실제로 존재하지 않으므로 다소 틀리고 더러운 것으로 느껴집니다. 여기에 또 다른 예입니다

Level.prototype.reset = function() { 
    this.load(Game.currentLevel); 
}; 

Game.currentLevel는 하드 코드는 현재 게임 오브젝트를 처리하는 변수를 감지 할 수있는 더 좋은 방법이 아니거나 내가 그 일을 해요 방법은 완전히 괜찮아?

그래서 기본적인 질문은 개체가 서로 상호 작용할 수있는 가장 좋은 방법입니다.

그리고 마지막으로 한 가지 질문은 좀 어색하지만,()(); 해야 할 것? 나는 가끔이 같은 사용에 beeing 참조 : 당신은 당신의 시간과 답변에 대한 감사 내 문제를 이해 바랍니다

(function() { 
    // Content 
}); 

합니다. :)

+0

질문을 나누어야합니다. 하나만 대답하는 것은 어렵습니다. 그것이 말했다. 마지막 질문에; 그것은 자기 호출 람다 (self-calling lambda)입니다. 즉, 파싱되는 순간 항상 실행됩니다. 일반적으로 함수를 정의하는 경우 별도로 호출해야합니다. –

답변

1

모듈 식이기 때문에 첫 번째 방법을 권합니다.
Game 인스턴스의 참조를 다른 구성 요소에 전달하여 게임을 인식하도록하면 문제를 해결할 수 있습니다.
그것은 객체가 자바 스크립트의 순환 구조를 가지고하는 드문 일이 아니에요 :

Game.level = new Level(); 
Game.level._game = Game; 
//... 
Level.prototype.reset = function() { 
    this.load(this._game.currentLevel); 
}; 
당신이 초기화에 대한 참조를 전달하여 좀 더 우아한 그것을 할 수 물론

,하지만 난 당신이 내 지점을 가지고 생각합니다.

+0

고마워, 나는 이미 그것에 대해 생각했다. 왜 밑줄을 사용했는지 설명해 주시겠습니까? 원래 게임 기능/개체와의 혼동을 방지하려면? –

+0

가시성을 높이기 위해 따라야하는 명명 규칙입니다. js는 private 멤버를 기본적으로 지원하지 않기 때문에 보안 문제가 아닌 경우 일반적으로 private 멤버의 이름을 밑줄로 시작합니다. –

0

나는 마지막 질문에

질문에 대답을 가지고 :()() 무엇을; 해야 할 것? 나는 가끔이 같은 사용에 beeing 참조 :

(function() { 
    // Content 
}); 

그것은이 자동 실행 폐쇄입니다. 나는 여기서 가장 간단한 설명을 제공 할 것이다. 우리가 자바 스크립트 함수를 작성할 때 그것들을 실행하기 위해 호출 될 필요가있다.예를 들어

,

function alertMe(){ 
alert('alerted'); 
} 

alertMe(); // We need to call intentionally for execution of function. 

자동 실행 폐쇄 개별적으로 호출 할 필요가 없습니다. 스크립트가로드 될 때 자바 스크립트 위의 예

,

(function(){ 
alert('alerted'); 
})(); 

가 자동으로 실행됩니다. 동일한 질문은 SO here에 대한 답입니다.

+0

자세한 설명을 해주셔서 감사합니다.내가 뭐라 부르는 지 또는 무엇을하는지 모르기 때문에 나는 그것을 스스로 찾을 수 없었다. –

0

사용자 상호 작용으로 시작하여 뒤로 작업하십시오. 디자인 프로세스에 너무 많이 관여하고 너무 유연하거나 너무 많은 문제를 해결할 경우 복잡한 디자인을 생각해 낼 수 있습니다.

게임에 대한 제한된 지식과 게임 프로그래밍의 적은 지식과 귀하가 우리에게 보여 주신 내용을 토대로 여기서 다루는 두 가지 사용자 상호 작용이 있다고 생각합니다.

  1. 사용자는 특정 게임 레벨이
  2. 사용자가 게임 개체의 속성을 완벽하게 괜찮으로 현재 수준을 저장하는 게임 레벨

을 다시 재생 선택합니다. Game 개체에서 이러한 상호 작용을 처리하는 데 필요한 두 가지 방법을 생각해 볼 수 있습니다.

function setLevel(levelNumber) { 
    this.currentLevelNumber = levelNumber; 
    this.level = new Level(levelNumber); 
} 

function resetCurrentLevel() { 
    this.setLevel(this.currentLevelNumber); 
} 

나는 게임 객체에 '오브젝트에서 연결을 중단하고, 독립적으로 가능한 한 많은 게임의 수준을로드합니다. 그래서 그 대신

game.level = new Level(); 
game.level.load(game.currentLevel); 

, 일을 내가 같이 레벨 생성자 자체에 따라 수준을 초기화의

game.level = new Level(8); 

또는 더 나은 부담을 밀어 것, 그것에게 게임 객체에 대한 메서드 호출을 위 예에서와 같이 - setLevel(n). 이 메서드는 레벨이 변경 될 때 게임 개체가 일관성을 유지할 책임이 있습니다. 리셋 기능 resetCurrentLevel 내부에서이 방법을 사용하기 때문에

game.setLevel(8); 

레벨 변경 처리는 새로운 레벨을로드 또는 전류 레벨을 재설정 여부 통합한다.

+0

실제로 플레이어 컨트롤 외에는 사용자 상호 작용이 없습니다. 게임은 레벨 0에서 시작하지만 저장 상태는 나중에 사용할 수 있습니다. 당신은 사용자 상호 작용으로 이것을 고려할 수 있습니다. 생성자에서 레벨을로드하는 것이 좋습니다. 당신이 interessted 있다면 당신은 현재 progess을 볼 수 있습니다 : http://elias-schuett.de/canvas/iwbtg/ 아직 코드를 최적화하지 않았지만, 일부 기능은 꽤 못 생겼고 나는 더 나은 것을 찾지 못했습니다. 모든 시스템에서 게임 속도를 일정하게 유지하는 루프 기능. –