From 0a8089dfbbbb52ab81b8b89a5df38a29f5c576ff Mon Sep 17 00:00:00 2001 From: Dima Fitiskin Date: Tue, 16 May 2017 13:37:59 +0400 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=B8=20=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20?= =?UTF-8?q?=D0=B8=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F:=20=D0=A3=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20move=20?= =?UTF-8?q?=D1=83=20Actor=20=D0=B8=20=D0=B5=D0=B3=D0=BE=20=D0=B8=D1=81?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=BD=D0=B0=20=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D0=BE=D0=B4=20act=20=D1=83=20Fireball.=20=D0=94?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B=20=D0=B8=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=B2=D0=BE?= =?UTF-8?q?=D0=B9=D1=81=D1=82=D0=B2=20actors=20=D0=B8=20player=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20Level=20=D0=92=D0=BD=D0=B5=D1=81=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=BF=D1=80=D0=BE=D1=87=D0=B8=D0=B5=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BA=D0=B8,=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD=20?= =?UTF-8?q?=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D0=B9=20=D0=BA=D0=BE=D0=B4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ js/app.js | 24 ------------------------ test/actor.spec.js | 8 ++++---- test/coin.spec.js | 12 ++++++------ test/fireball.spec.js | 37 ++++++++++++++++++++++++++++++++++--- test/level.spec.js | 19 +++++++++++++++++-- test/vector.spec.js | 8 ++++---- 7 files changed, 67 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index 4717b02..6ddb2f4 100644 --- a/README.md +++ b/README.md @@ -442,6 +442,8 @@ items.forEach(status); Имеет свойство `actors` — список движущихся объектов игрового поля, массив объектов `Actor`. +Имеет свойство `player` — движущийся объект тип которого (свойство `type`) равно `player`. + Имеет свойство `height` — высота игрового поля, равное числу строк в сетке из первого аргмента. Имеет свойство `width` - ширина игрового поля, равное числу ячеек в строке сетки из первого аргмента. При этом, если в разных строках разное число ячеек, то `width` будет равно максимальному количеству ячеек в строке. diff --git a/js/app.js b/js/app.js index d8241ec..ef35375 100644 --- a/js/app.js +++ b/js/app.js @@ -228,15 +228,6 @@ function initGameObjects() { var motion = new Vector(this.speed.x, 0).times(step); this.move(motion, level); - return; - var newPos = this.pos.plus(motion); - var obstacle = level.obstacleAt(newPos, this.size); - if (obstacle) { - level.playerTouched(obstacle); - - } - else - this.pos = newPos; }; Player.prototype.moveY = function (step, level, keys) { @@ -245,21 +236,6 @@ function initGameObjects() { var motion = new Vector(0, this.speed.y).times(step); this.move(motion, level); - return; - var newPos = this.pos.plus(motion); - var obstacle = level.obstacleAt(newPos, this.size); - if (obstacle) { - level.playerTouched(obstacle); - - if (keys.up && this.speed.y > 0) { - this.speed.y = -jumpSpeed; - } else { - this.speed.y = 0; - } - - } else { - this.pos = newPos; - } }; Player.prototype.act = function (step, level, keys) { diff --git a/test/actor.spec.js b/test/actor.spec.js index f442bfc..fef4078 100644 --- a/test/actor.spec.js +++ b/test/actor.spec.js @@ -113,25 +113,25 @@ describe('Класс Actor', () => { it('Имеет свойство left, которое содержит координату левой границы объекта по оси X', () => { const player = new Actor(position, size); - expect(player.left).is.equal(position.x); + expect(player.left).is.equal(30); }); it('Имеет свойство right, которое содержит координату правой границы объекта оп оси X', () => { const player = new Actor(position, size); - expect(player.right).is.equal(position.x + size.x); + expect(player.right).is.equal(35); }); it('Имеет свойство top, которое содержит координату верхней границы объекта по оси Y', () => { const player = new Actor(position, size); - expect(player.top).is.equal(position.y); + expect(player.top).is.equal(50); }); it('Имеет свойство bottom, которое содержит координату правой границы объекта оп оси Y', () => { const player = new Actor(position, size); - expect(player.bottom).is.equal(position.y + size.y); + expect(player.bottom).is.equal(55); }); }); diff --git a/test/coin.spec.js b/test/coin.spec.js index 39d1355..df25f6e 100644 --- a/test/coin.spec.js +++ b/test/coin.spec.js @@ -24,7 +24,7 @@ describe('Класс Coin', () => { it('Реальная позициия сдвинута на Vector(0.2, 0.1)', () => { const coin = new Coin(position); - const realPosition = position.plus(new Vector(0.2, 0.1)); + const realPosition = new Vector(5.2, 5.1); expect(coin.pos).to.eql(realPosition); }); @@ -55,7 +55,7 @@ describe('Класс Coin', () => { coin.updateSpring(); - expect(coin.spring).to.equal(initialSpring + coin.springSpeed); + expect(coin.spring).to.equal(initialSpring + 8); }); it('Если передать время, увеличит свойство spring на springSpeed умноженное на время', () => { @@ -65,7 +65,7 @@ describe('Класс Coin', () => { coin.updateSpring(time); - expect(coin.spring).to.equal(initialSpring + (coin.springSpeed * time)); + expect(coin.spring).to.equal(initialSpring + 40); }); }); @@ -91,7 +91,7 @@ describe('Класс Coin', () => { const vector = coin.getSpringVector(); - expect(vector.y).to.equal(Math.sin(coin.spring) * coin.springDist); + expect(vector.y).to.equal(Math.sin(coin.spring) * 0.07); }); }); @@ -102,7 +102,7 @@ describe('Класс Coin', () => { coin.getNextPosition(); - expect(coin.spring).to.equal(initialSpring + coin.springSpeed); + expect(coin.spring).to.equal(initialSpring + 8); }); it('Если передать время, увеличит свойство spring на springSpeed умноженное на время', () => { @@ -112,7 +112,7 @@ describe('Класс Coin', () => { coin.getNextPosition(time); - expect(coin.spring).to.equal(initialSpring + (coin.springSpeed * time)); + expect(coin.spring).to.equal(initialSpring + 40); }); it('Вернет вектор', () => { diff --git a/test/fireball.spec.js b/test/fireball.spec.js index 3aa069c..68cd05f 100644 --- a/test/fireball.spec.js +++ b/test/fireball.spec.js @@ -46,7 +46,7 @@ describe('Класс Fireball', () => { const nextPosition = ball.getNextPosition(); - expect(nextPosition).to.eql(position.plus(speed)); + expect(nextPosition).to.eql(new Vector(6, 5)); }); it('Если передать время первым аргументом, то вернет новую позицию увелеченную на вектор скорости помноженный на переданное время', () => { @@ -54,7 +54,7 @@ describe('Класс Fireball', () => { const nextPosition = ball.getNextPosition(time); - expect(nextPosition).to.eql(position.plus(speed.times(time))); + expect(nextPosition).to.eql(new Vector(10, 5)); }); }); @@ -64,7 +64,38 @@ describe('Класс Fireball', () => { ball.handleObstacle(); - expect(ball.speed).to.eql(speed.times(-1)); + expect(ball.speed).to.eql(new Vector(-1, -0)); + }); + }); + + describe('Метод act', () => { + it('Если препятствий нет, меняет позицию на ту что получена с помощью getNextPosition', () => { + const level = { + obstacleAt() { + return false; + } + }; + const ball = new Fireball(position, speed); + const nextPosition = ball.getNextPosition(time); + + ball.act(time, level); + + expect(ball.speed).to.eql(speed); + expect(ball.pos).to.eql(nextPosition); + }); + + it('При столкновении с препятствием не меняет позицию объекта, меняет вектор скорости на противоположный', () => { + const level = { + obstacleAt() { + return true; + } + }; + const ball = new Fireball(position, speed); + + ball.act(time, level); + + expect(ball.speed).to.eql(new Vector(-1, -0)); + expect(ball.pos).to.eql(position); }); }); }); diff --git a/test/level.spec.js b/test/level.spec.js index 4e27172..baf718b 100644 --- a/test/level.spec.js +++ b/test/level.spec.js @@ -58,6 +58,21 @@ describe('Класс Level', () => { expect(level.finishDelay).to.equal(1); }); + + it('Имеет свойство actors, в котором все движущиеся переданные в конструктор', () => { + const actors = [ player ]; + const level = new Level(undefined, actors); + + expect(level.actors).to.eql(actors); + }); + + it('Имеет свойство player, в котором движущийся объект со свойством type равным player', () => { + const player = { type: 'player', title: 'Игрок' }; + const coin = { type: 'coin', title: 'Монетка' }; + const level = new Level(undefined, [ player, coin ]); + + expect(level.player).to.equal(player); + }); }); describe('Метод isFinished', () => { @@ -119,12 +134,12 @@ describe('Класс Level', () => { }); it('Вернет undefined если ни один объект игрового поля не пересекается с переданным объектом', () => { + const player = new Actor(new Vector(1, 1)); const level = new Level(undefined, [player, coin]); - player.move(1, 1); const actor = level.actorAt(player); - expect(actor).to.be.equal(coin); + expect(actor).to.be.undefined; }); it('Вернет объект игрового поля, который пересекается с переданным объектом', () => { diff --git a/test/vector.spec.js b/test/vector.spec.js index 8fc2d0d..e7b6ea0 100644 --- a/test/vector.spec.js +++ b/test/vector.spec.js @@ -44,8 +44,8 @@ describe('Класс Vector', () => { const newPosition = position.plus(new Vector(left, top)); - expect(newPosition.x).is.equal(x + left); - expect(newPosition.y).is.equal(y + top); + expect(newPosition.x).is.equal(8); + expect(newPosition.y).is.equal(17); }); }); @@ -63,8 +63,8 @@ describe('Класс Vector', () => { const newPosition = position.times(n); - expect(newPosition.x).is.equal(x * n); - expect(newPosition.y).is.equal(y * n); + expect(newPosition.x).is.equal(15); + expect(newPosition.y).is.equal(35); }); });