초기화
Pong 게임의 경우 사용자에게 다음과 같은 정보를 제공하는 '메뉴'를 표시하기 위해 일부 이미지를 사용합니다.
- 싱글 플레이어 게임의 경우 '1'을 누르십시오.
- 더블 플레이어 게임의 경우 '2'를 누르십시오.
이것은 GameRunner와 Pong 관계에 미묘한 비틀기를 도입합니다. 이미지로드는 비동기 프로세스이므로 이미지가 로드 될 때까지 이미지를 표시 할 수 없으므로 이미지가 완전히로드 될 때까지 GameRunner를 루프에 넣지 않아도됩니다.
이 문제를 해결하기 위해 Pong initialize 메서드는 콜백 패턴을 사용하여 이미지로드가 완료된 시점을 알 수 있으며 해당 프로세스가 완료 될 때까지 GameRunner에 start ()를 알리지 않습니다.
initialize: function(runner, cfg) {
Game.loadImages(Pong.Images, function(images) {
this.cfg = cfg;
this.runner = runner;
this.width = runner.width;
this.height = runner.height;
this.images = images;
this.playing = false;
this.scores = [0, 0];
this.menu = Object.construct(Pong.Menu, this);
this.court = Object.construct(Pong.Court, this);
this.leftPaddle = Object.construct(Pong.Paddle, this);
this.rightPaddle = Object.construct(Pong.Paddle, this, true);
this.ball = Object.construct(Pong.Ball, this);
this.runner.start();
}.bind(this));
},
키보드 입력키보드 이벤트가 발생하면 GameRunner는 게임의 onkeydown () 또는 onkeyup () 메소드 (있는 경우)를 자동으로 호출하므로 Pong 게임이 적절한 키를 감지하고 적절하게 게임을 시작하거나 중지 할 수 있습니다.
onkeydown: function(keyCode) {
switch(keyCode) {
case Game.KEY.ZERO: this.startDemo(); break;
case Game.KEY.ONE: this.startSinglePlayer(); break;
case Game.KEY.TWO: this.startDoublePlayer(); break;
case Game.KEY.ESC: this.stop(true); break;
case Game.KEY.Q: this.leftPaddle.moveUp(); break;
case Game.KEY.A: this.leftPaddle.moveDown(); break;
case Game.KEY.P: this.rightPaddle.moveUp(); break;
case Game.KEY.L: this.rightPaddle.moveDown(); break;
}
},
onkeyup: function(keyCode) {
switch(keyCode) {
case Game.KEY.Q: this.leftPaddle.stopMovingUp(); break;
case Game.KEY.A: this.leftPaddle.stopMovingDown(); break;
case Game.KEY.P: this.rightPaddle.stopMovingUp(); break;
case Game.KEY.L: this.rightPaddle.stopMovingDown(); break;
}
},
또한 사용자가 패들의 위나 아래를 움직일 수있는 입력을 감지합니다.게임 시작하기
이제 키보드 입력을 감지 할 수 있으므로 게임을 시작할 수 있습니다.
startDemo: function() { this.start(0); },
startSinglePlayer: function() { this.start(1); },
startDoublePlayer: function() { this.start(2); },
start: function(numPlayers) {
if (!this.playing) {
this.scores = [0, 0];
this.playing = true;
this.ball.reset();
this.runner.hideCursor();
}
},
경기 도중게임이 진행되는 동안 update () 메소드는 채점 된 시점과 승자를 선언하고 게임을 중단할 시기를 감지해야합니다.
update: function(dt) {
this.leftPaddle.update(dt, this.ball);
this.rightPaddle.update(dt, this.ball);
if (this.playing) {
var dx = this.ball.dx;
var dy = this.ball.dy;
this.ball.update(dt, this.leftPaddle, this.rightPaddle);
if (this.ball.left > this.width)
this.goal(0);
else if (this.ball.right < 0)
this.goal(1);
}
},
goal: function(playerNo) {
this.scores[playerNo] += 1;
if (this.scores[playerNo] == 1) {
this.menu.declareWinner(playerNo);
this.stop();
}
else {
this.ball.reset(playerNo);
}
},
게임 중지우승자가 선언되면 게임이 중지되고 ESC 키를 치는 사용자에 대한 응답으로 게임을 중지 할 수도 있습니다.
stop: function(ask) {
if (this.playing) {
if (!ask || this.runner.confirm('Abandon game in progress ?')) {
this.playing = false;
this.runner.showCursor();
}
}
},
여기에서 데모를 통해 진행중인 게임 루프를 볼 수 있습니다.
댓글 없음:
댓글 쓰기