LEARN

今日 学ぶこと、学んだこと ── ブロックくずし

ISSUE #1 の 読みもの。さきに 読んでも、あとで 読んでも いい。
ざひょうや へんすうの きほんは ISSUE #0 の「学ぶ」に くわしく 書いてある。 ここでは この ゲームで あたらしく 出てくる「なぜ」に こたえる。

Chapter 1 / Bounce第1章 はねかえりの しくみ

ボールは「ばしょ」と「むき」で できている

ボールの 箱は 4つ。ばしょの ballX ballY と、むきの ballDX ballDY。D は「どれだけ うごくか」の D。まいかい、ばしょに むきを たす——ballX = ballX + ballDX——それだけで ボールは すすむ。むきが プラスなら 右(下)へ、マイナスなら 左(上)へ。マイナスの 数も りっぱな「はやさ」なのが 今日の 発見。

なぜ かべで はねかえるの?
はねかえりの 正体は、むきの 数字を ぎゃくに する こと。ballDX = -ballDX と 書くと、3 なら -3 に、-3 なら 3 に なる。たった 1行で、右に とんでいた ボールが 左に とぶ。左右の かべでは よこの むき(DX)を、上の かべと パドルでは たての むき(DY)を ぎゃくに して いる。
かべ(ここで ballDY が ぎゃくに なる) いく(DY マイナス) はねる(DY プラス)

図1 はねかえり=むきの 数字の ぎゃく。かべは 何も して いない

Chapter 2 / Variables第2章 7つの 数字の「なぜ」

へんすう変えるとなぜ 変わるのか
paddleSpeedパドルの はやさキーを おしている あいだ、1コマごとに paddleX に たす 数だから
paddleWidthパドルの ながさかく ときの よこはばと、あたり判定の「どこまでが パドルか」の 両方に つかわれるから。長い ほど 受けやすい
ballSpeedボールの はやささいしょの ballDX・ballDY に この数が 入るから。はねかえっても「はやさ」は 変わらず、むきだけ 変わる
brickRowsブロックの だんすうブロックを ならべる くりかえしの 回数に つかわれるから。4 なら 8こ × 4だん = 32こ
paddleColorパドルの 色かく 直前に えんぴつ(pen)に セットされる 色だから
ballColorボールの 色同じく、ボールを かく 前に えんぴつに セットされるから
bgColorはいけいの 色まいかい がめん ぜんぶを ぬりつぶす 色だから。パーツ6は これを「うすい 色」に して ざんぞうを 作る
置き場A〜Dの 考えかた(データ/まいかい/かく/出来事)は ISSUE #0 と まったく 同じ。ちがうのは 置き場Dが「おかしを とった とき」から「ブロックを こわした とき」に なった ことだけ。

Chapter 3 / How it works第3章 しくみを ぜんぶ よむ

なぜ パドルで はねかえるの?
まいかい「ボールは パドルの たかさに いる?」「よこの はんいは パドルの 上?」と しらべて、両方 あてはまったら ballDY を ぎゃくに して いるから。ballDY > 0(下に むかっている とき だけ)という 条件も ついて いる。これが ないと、パドルの 中で 何度も はねて ふるえて しまう。
「はこの あたり判定」って なに? ISSUE #0 と なにが ちがうの?
#0 の おかしは まるいので「きょりが 近いか」で きめた(まるい 判定)。ブロックは 四角いので「ボールの x が はこの 左はしから 右はしの あいだ、かつ y が 上はしから 下はしの あいだ」で きめる。これが はこの 判定。isHit() の 中の 2つの if が、よこの はんいと たての はんいを 1つずつ しらべて いる。6 を たしたり ひいたり して いるのは、ボールの はんけい ぶんだけ はんいを 広げる ため。
ISSUE #0:まるい あたり判定 きょりが はんけいより 近いか ISSUE #1:はこの あたり判定 x と y が はこの はんいに 入っているか

図2 まるい ものは きょりで、四角い ものは はんいで。かたちに あわせて 判定を えらぶ

なぜ ブロックは きえるの?
あたった ブロックを けして いるのでは なく、のこった ブロックだけを 新しい リストに もちこして いる。rest(のこり)に、あたって いない ものだけ push して、さいごに bricks = rest。#0 で おかしを けした ときと 同じ やりかた。
なぜ ぜんぶ こわすと CLEAR が 出るの?
bricks.length は リストの こすう。0 に なったら「もう ない」ので gameover = true。draw() の さいごに「gameover が true なら CLEAR! と かく」が あるから、文字が 出る。
なぜ おとすと ボールは まんなかに もどるの?
ballY > 400(がめんの 下はしを こえた)とき、ミスを 1 たして、ばしょを まんなかに 書きもどして いるから。ballDY = -Math.abs(ballDY) の Math.abs() は「かならず プラスに する」どうぐ。その 前に マイナスを つけるので、ボールは かならず 上むきで 再スタートする。
コラム:はやさが「マイナス」って どういう こと?
算数では はやさは プラスだけど、プログラムでは むきこみの はやさ(速度)を つかう。 -3 は「左(上)に 3」という いみ。こう すると「すすむ」も「はねる」も たし算と ぎゃくに する だけで 書けて、if が ぐっと へる。 高校の 物理で ならう「ベクトル」の 入り口が、この ballDX と ballDY。

Chapter 4 / Why the parts work第4章 パーツの「なぜ」

パーツ1 なぜ スコアが 大きく なるの?
えんぴつの 文字の 設定 pen.font を 64px に して から かいて いるから。#0 と 同じ しくみ。
パーツ2 なぜ 音が 出るの?
スピーカーは 電気の ふるえで 音を 出す。createOscillator() が「決まった はやさで ふるえる 電気」を 作り、660 が 高さ、g.gain.value が 大きさ。置き場Dに beep を 書くから、こわした しゅんかんだけ 鳴る。
パーツ3 なぜ 3回で おわるの?
core(しくみの ぶぶん)が ミスの 回数を miss に 数えて いる。置き場Bで まいかい「miss は 3 いじょう?」と しらべて、なったら gameover を true に するだけ。
パーツ4 なぜ だんだん はやく なるの?
ballDX = ballDX * 1.07 は「いまの はやさの 1.07ばいに する」。かけ算なので、こわす たびに ふえかたも 大きく なる(3 → 3.21 → 3.43…)。たし算との ちがいを 感じて みよう。
パーツ5 なぜ なまえが 出るの?
文字の 入った 箱 myName を 作って、fillText で かいて いるだけ。スコアと 同じ しくみ。
パーツ6 なぜ ざんぞうが 出るの?
まいかいの ぬりつぶしを「25%だけ ぬる すきとおった ペンキ」に するから、前の コマが うっすら のこる。くわしい たねあかしは ISSUE #0 の 学ぶ 第3章に ある。
ここまで 読めたら、おかわりミッションへ。かたい ブロックは メモ(hp)、 タイムアタックは 数とり器(time)、ななめの はねかえりは 引き算—— ぜんぶ この ページの 考えかたで とける。