|
12 | 12 | 'stages/03': stage3, |
13 | 13 | 'stages/04': stage4, |
14 | 14 | 'stages/05': stage5, |
15 | | - 'stages/06': stage6 |
| 15 | + 'stages/06': stage6, |
| 16 | + 'stages/07': stage7 |
16 | 17 | }; |
17 | 18 |
|
18 | 19 | demoDoc_ = demo.contentDocument; |
|
381 | 382 |
|
382 | 383 | } |
383 | 384 |
|
| 385 | + /** |
| 386 | + * 檢查 |
| 387 | + * 1. 網頁互動區的數值,是否和超音波的數值一致 |
| 388 | + * 2. 超音波數值小於 50 時,蜂鳴器要發出聲音,並且三色 LED 有顏色變化,及伺服馬達要有 90 度的變化 |
| 389 | + * 3. 超音波數值超過 50 時,蜂鳴器無聲,三色 LED 無變化,伺服馬達恢復 0 度 |
| 390 | + * 做法: |
| 391 | + * 1. 蜂鳴器的發聲與否,以 2 筆資料為準,有 2 筆以上,判斷發聲 |
| 392 | + * 2. 三色 led,變化與否,看儲存的顏色是否超過 1 筆 |
| 393 | + */ |
| 394 | + function stage7() { |
| 395 | + var ultrasonics = engine_.list().ultrasonic; |
| 396 | + var buzzers = engine_.list().buzzer; |
| 397 | + var rgbLeds = engine_.list().rgbled; |
| 398 | + var servos = engine_.list().servo; |
| 399 | + var showEl = demoDoc_.querySelector('#show'); |
| 400 | + var buzzerData = {}; |
| 401 | + var rgbData = {}; |
| 402 | + var curDistance = void 0; |
| 403 | + var check = [false, false]; |
| 404 | + var isPassed = false; |
384 | 405 |
|
| 406 | + if (!ultrasonics.length) return; |
| 407 | + if (!buzzers.length) return; |
| 408 | + if (!rgbLeds.length) return; |
| 409 | + if (!servos.length) return; |
| 410 | + |
| 411 | + ultrasonics.forEach(function (us) { |
| 412 | + us.setSendHandler(send); |
| 413 | + }); |
| 414 | + |
| 415 | + buzzers.forEach(function (bz) { |
| 416 | + bz.setCmdHandler(cmd); |
| 417 | + }); |
| 418 | + |
| 419 | + rgbLeds.forEach(function (rgbLed) { |
| 420 | + rgbLed.state(state); |
| 421 | + }); |
| 422 | + |
| 423 | + // 當超音波距離不同時,做檢查,並建立 array 來儲存蜂鳴器命令發送的時間 |
| 424 | + function send(distance) { |
| 425 | + // 檢查超音波偵測到的距離,是否和畫面相同 |
| 426 | + if (Number(distance) !== Number(showEl.textContent)) return; |
| 427 | + |
| 428 | + // 把之前的記錄清除,以便正確判斷蜂鳴器發聲的記錄 |
| 429 | + if (curDistance && curDistance !== distance) { |
| 430 | + buzzerData[curDistance] = []; |
| 431 | + rgbData[curDistance] = {}; |
| 432 | + } |
| 433 | + |
| 434 | + buzzerData[distance] = buzzerData[distance] || []; |
| 435 | + rgbData[distance] = rgbData[distance] || {}; |
| 436 | + curDistance = distance; |
| 437 | + |
| 438 | + if (curDistance < 50) { |
| 439 | + checkPoint1(); |
| 440 | + } else { |
| 441 | + checkPoint2(); |
| 442 | + } |
| 443 | + |
| 444 | + checking(); |
| 445 | + } |
| 446 | + |
| 447 | + // 儲存蜂鳴器送出命令的時間 |
| 448 | + function cmd() { |
| 449 | + if (curDistance) { |
| 450 | + buzzerData[curDistance] && buzzerData[curDistance].push(Date.now()); |
| 451 | + } |
| 452 | + } |
| 453 | + |
| 454 | + // 儲存三色 led 狀態 |
| 455 | + function state(r, g, b) { |
| 456 | + if (curDistance) { |
| 457 | + rgbData[curDistance]["[" + r + "," + g + "," + b + "]"] = true; |
| 458 | + } |
| 459 | + } |
| 460 | + |
| 461 | + function checkPoint1 () { |
| 462 | + if (check[0]) return; |
| 463 | + if (buzzerData[curDistance].length < 2) return; |
| 464 | + if (Object.keys(rgbData[curDistance]).length < 2) return; |
| 465 | + |
| 466 | + check[0] = servos.some(function (servo, idx, ary) { |
| 467 | + return servo.getAngle() === 90; |
| 468 | + }); |
| 469 | + } |
| 470 | + |
| 471 | + function checkPoint2 () { |
| 472 | + if (check[1]) return; |
| 473 | + if (buzzerData[curDistance].length > 2) return; |
| 474 | + if (Object.keys(rgbData[curDistance]).length > 1) return; |
| 475 | + |
| 476 | + check[1] = servos.some(function (servo, idx, ary) { |
| 477 | + return servo.getAngle() === 5; |
| 478 | + }); |
| 479 | + } |
| 480 | + |
| 481 | + function checking() { |
| 482 | + if (isPassed) return; |
| 483 | + |
| 484 | + isPassed = check.reduce(function (acc, val) { |
| 485 | + return acc && val; |
| 486 | + }, true); |
| 487 | + |
| 488 | + if (isPassed) { |
| 489 | + checkOver(); |
| 490 | + |
| 491 | + // 考量畫面有些動畫未完成,所以延遲 1 秒執行 |
| 492 | + setTimeout(function () { |
| 493 | + alert('第 7 關 過關!'); |
| 494 | + }, 1000); |
| 495 | + } |
| 496 | + } |
| 497 | + |
| 498 | + function checkOver() { |
| 499 | + ultrasonics.forEach(function (us) { |
| 500 | + us.setSendHandler(null); |
| 501 | + }); |
| 502 | + |
| 503 | + buzzers.forEach(function (bz) { |
| 504 | + bz.setCmdHandler(null); |
| 505 | + }); |
| 506 | + |
| 507 | + rgbLeds.forEach(function (rgbLed) { |
| 508 | + rgbLed.state(null); |
| 509 | + }); |
| 510 | + } |
| 511 | + |
| 512 | + } |
385 | 513 |
|
386 | 514 |
|
387 | 515 | Code.stageCheck = { |
|
0 commit comments