Skip to content

Commit d160366

Browse files
committed
Go over Chapter 17
Make some changes to the code in Chapter 16 as necessary.
1 parent 03c9471 commit d160366

File tree

8 files changed

+690
-726
lines changed

8 files changed

+690
-726
lines changed

03_functions.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,7 @@ verbose. We'll be using a lot of them in [Chapter
344344
?](higher_order).
345345

346346
{{id stack}}
347+
347348
## The call stack
348349

349350
{{indexsee stack, "call stack"}}

14_dom.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
# The Document Object Model
44

5+
// FIXME custom elements, better transitions, maybe `children`, templates, problems with obvious usage
6+
57
{{index drawing, parsing}}
68

79
When you open a web page in your browser, the browser retrieves the

16_game.md

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ quote}}
1111
{{index "Banks, Ian", "project chapter", simulation}}
1212

1313
Much of my initial fascination with computers, like that of many nerdy
14-
kids, had a lot to do with computer ((game))s. I was drawn into the
15-
tiny simulated ((world))s that I could manipulate and in which stories
14+
kids, had to do with computer ((game))s. I was drawn into the tiny
15+
simulated ((world))s that I could manipulate and in which stories
1616
(sort of) unfolded—more, I suppose, because of the way I could project
1717
my ((imagination)) into them than because of the possibilities they
1818
actually offered.
@@ -154,7 +154,7 @@ restored to its starting position, and the player may try again.
154154

155155
## Reading a level
156156

157-
{{index "Level type"}}
157+
{{index "Level class"}}
158158

159159
The following ((class)) stores a ((level)) object. Its argument should
160160
be the string that defines the level.
@@ -231,6 +231,10 @@ class State {
231231
static start(level) {
232232
return new State(level, level.startActors, "playing");
233233
}
234+
235+
get player() {
236+
return this.actors.find(a => a.type == "player");
237+
}
234238
}
235239
```
236240

@@ -297,20 +301,21 @@ behavior is very different. Let's define these classes—without
297301

298302
{{index simulation, "Player class"}}
299303

300-
The player class has a property `ySpeed` that stores its current
301-
vertical speed, which will help simulate momentum and gravity.
304+
The player class has a property `speed` that stores its current speed,
305+
to simulate momentum and gravity.
302306

303307
```{includeCode: true}
304308
class Player {
305-
constructor(pos, ySpeed) {
309+
constructor(pos, speed) {
306310
this.pos = pos;
307-
this.ySpeed = ySpeed;
311+
this.speed = speed;
308312
}
309313
310314
get type() { return "player"; }
311315
312316
static create(pos) {
313-
return new Player(pos.plus(new Vec(0, -0.5)), 0);
317+
return new Player(pos.plus(new Vec(0, -0.5)),
318+
new Vec(0, 0));
314319
}
315320
}
316321
@@ -329,7 +334,7 @@ would create and return a new `Vec` object every time the property is
329334
read, which would be wasteful. (Strings, being ((immutable)), don't
330335
have to be recreated every time they are evaluated.)
331336

332-
{{index "Lava type", bouncing}}
337+
{{index "Lava class", bouncing}}
333338

334339
When constructing a `Lava` actor, we need to initialize the object
335340
differently depending on the character it is based on. Dynamic lava
@@ -365,7 +370,7 @@ class Lava {
365370
Lava.prototype.size = new Vec(1, 1);
366371
```
367372

368-
{{index "Coin type", animation}}
373+
{{index "Coin class", animation}}
369374

370375
`Coin` actors are relatively simple. They mostly just sit in their
371376
place. But to liven up the game a little, they are given a "wobble", a
@@ -531,7 +536,7 @@ Actors are redrawn every time the display is updated with a given
531536
state. The `actorLayer` property will be used to track the element
532537
that holds the actors so that they can be easily removed and replaced.
533538

534-
{{index scaling, "DOMDisplay type"}}
539+
{{index scaling, "DOMDisplay class"}}
535540

536541
Our ((coordinates)) and sizes are tracked in units relative to the
537542
((grid)) size, where a size or distance of 1 means 1 grid unit. When
@@ -713,7 +718,7 @@ DOMDisplay.prototype.scrollPlayerIntoView = function(state) {
713718
let left = this.dom.scrollLeft, right = left + width;
714719
let top = this.dom.scrollTop, bottom = top + height;
715720
716-
let player = state.actors.find(a => a.type == "player");
721+
let player = state.player;
717722
let center = player.pos.plus(player.size.times(0.5))
718723
.times(scale);
719724
@@ -827,6 +832,8 @@ steps.
827832

828833
{{index obstacle, "touches method", "collision detection"}}
829834

835+
{{id touches}}
836+
830837
This method tells us whether a ((rectangle)) (specified by a position
831838
and a size) touches a grid element of the given type.
832839

@@ -876,7 +883,7 @@ State.prototype.update = function(time, keys) {
876883
877884
if (newState.status != "playing") return newState;
878885
879-
let player = actors.find(a => a.type == "player");
886+
let player = newState.player;
880887
if (this.level.touches(player.pos, player.size, "lava")) {
881888
return new State(this.level, actors, "lost");
882889
}
@@ -938,7 +945,7 @@ Coin.prototype.collide = function(state) {
938945

939946
## Actor updates
940947

941-
{{index actor, "Lava type", lava}}
948+
{{index actor, "Lava class", lava}}
942949

943950
Actor objects' `update` methods take as arguments the time step, the
944951
state object, and a `keys` object. The one for the `Lava` actor type
@@ -957,7 +964,7 @@ Lava.prototype.update = function(time, state) {
957964
};
958965
```
959966

960-
{{index bouncing, multiplication, "Vector type", "collision detection"}}
967+
{{index bouncing, multiplication, "Vect class", "collision detection"}}
961968

962969
It computes a new position by adding the product of the ((time)) step
963970
and the current speed to its old position. If no obstacle blocks that
@@ -967,7 +974,7 @@ position, to which it jumps back when it hits something. Bouncing lava
967974
inverts its speed by multiplying it by -1, so that it starts moving in
968975
the opposite direction.
969976

970-
{{index "Coin type", coin, wave}}
977+
{{index "Coin class", coin, wave}}
971978

972979
Coins use their `act` method to wobble. They ignore collisions since
973980
they are simply wobbling around inside of their own square.
@@ -990,7 +997,7 @@ argument to `Math.sin` to find the new position on the ((wave)). The
990997
coin's current position is then computed from its base position and an
991998
offset based on this wave.
992999

993-
{{index "collision detection", "Player type"}}
1000+
{{index "collision detection", "Player class"}}
9941001

9951002
That leaves the ((player)) itself. Player motion is handled separately
9961003
per ((axis)) because hitting the floor should not prevent horizontal
@@ -1012,7 +1019,7 @@ Player.prototype.update = function(time, state, keys) {
10121019
pos = movedX;
10131020
}
10141021
1015-
let ySpeed = this.ySpeed + time * gravity;
1022+
let ySpeed = this.speed.y + time * gravity;
10161023
let movedY = pos.plus(new Vec(0, ySpeed * time));
10171024
if (!state.level.touches(movedY, this.size, "wall")) {
10181025
pos = movedY;
@@ -1021,7 +1028,7 @@ Player.prototype.update = function(time, state, keys) {
10211028
} else {
10221029
ySpeed = 0;
10231030
}
1024-
return new Player(pos, ySpeed);
1031+
return new Player(pos, new Vec(xSpeed, ySpeed));
10251032
};
10261033
```
10271034

0 commit comments

Comments
 (0)