# **ゼミナールB** ### **今回の目標** 「例4:Micro:bitのボタン操作応じて図形の色や形,大きさを変える」に挑戦して、canvasの使い方を学ぶ ### 図形の変化 ボタンAをおすと図形の形が、ボタンBを押すと図形の色が変わるプログラムを作成する 参考資料 ・[【JavaScript】 Canvas上でクリックした線の色変更と移動](https://note.affi-sapo-sv.com/js-line-move.php) ・[キャンバスを作ってその上に描画する](https://developer.mozilla.org/ja/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Create_the_Canvas_and_draw_on_it) ・[JavaScriptで図形を描画したい!canvasの基本とライブラリの活用方法](https://www.sejuku.net/blog/96127) ・[[JavaScript] canvasの内容をクリアする(.clearRect)](https://javascript.programmer-reference.com/js-canvas-clearrect/) ### 考え方 以前に作ったボタンサービスのプログラムを元に、ボタンが押された時の処理を変更する ### プログラム ``` <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Micro:bitのボタン操作応じて図形の色や形を変える</title> </head> <body> <button onclick="scan()">スキャン</button> <button onclick="connect()">接続</button> <button onclick="getButton()">ボタン状態取得</button> <button onclick="disconnect()">切断</button> <canvas id = "myCanvas" width="300" height="300"></canvas> <script> const UUID_BUTTON_SERVICE = 'e95d9882-251d-470a-a062-fa1922dfa9a8' const UUID_BUTTON_SERVICE_CHARACTERISTIC_A = 'e95dda90-251d-470a-a062-fa1922dfa9a8' const UUID_BUTTON_SERVICE_CHARACTERISTIC_B = 'e95dda91-251d-470a-a062-fa1922dfa9a8' let device = null; let service = null; let service_button = null; let char_buttonA = null; let char_buttonB = null; let canvas = document.getElementById("myCanvas"); let ctx = canvas.getContext("2d"); let color = ["red","blue","green","black","pink","orange","purple","lightblue"]; let i = 0; let j = 0; async function scan() { device = await navigator.bluetooth.requestDevice({ filters: [ {services: [UUID_BUTTON_SERVICE]}, { namePrefix: "BBC micro:bit" } ]} ); } async function connect() { server = await device.gatt.connect();  alert('接続しました。'); } async function getButton() { service_button = await server.getPrimaryService(UUID_BUTTON_SERVICE); char_buttonA = await service_button.getCharacteristic(UUID_BUTTON_SERVICE_CHARACTERISTIC_A); char_buttonB = await service_button.getCharacteristic(UUID_BUTTON_SERVICE_CHARACTERISTIC_B); await char_buttonA.startNotifications(); char_buttonA.addEventListener('characteristicvaluechanged', ButtonAState); await char_buttonB.startNotifications(); char_buttonB.addEventListener('characteristicvaluechanged', ButtonBState); } function ButtonAState(event) { let buttonA = event.target.value.getUint8(0); switch(buttonA) { case 1: i++; if(i % 3 == 0){ ctx.clearRect(100, 100, 150, 150); ctx.beginPath(); ctx.rect(100, 100, 150, 150); ctx.fillStyle = color[j]; ctx.fill(); ctx.closePath(); }else if(i % 3 == 1){ ctx.clearRect(100, 100, 150, 150); ctx.beginPath(); ctx.arc(175, 175, 75, 0, Math.PI*2); ctx.fillStyle = color[j]; ctx.fill(); ctx.closePath(); }else if(i % 3 == 2){ ctx.clearRect(100, 100, 150, 150); ctx.beginPath(); ctx.moveTo(175,100); ctx.lineTo(250,250); ctx.lineTo(100,250); ctx.fillStyle = color[j]; ctx.fill(); ctx.closePath(); } break; } } function ButtonBState(event) { let buttonB = event.target.value.getUint8(0); switch(buttonB) { case 1: j++; if(j > 7){ j = 0; } if(i % 3 == 0){ ctx.clearRect(100, 100, 150, 150); ctx.beginPath(); ctx.rect(100, 100, 150, 150); ctx.fillStyle = color[j]; ctx.fill(); ctx.closePath(); }else if(i % 3 == 1){ ctx.clearRect(100, 100, 150, 150); ctx.beginPath(); ctx.arc(175, 175, 75, 0, Math.PI*2); ctx.fillStyle = color[j]; ctx.fill(); ctx.closePath(); }else if(i % 3 == 2){ ctx.clearRect(100, 100, 150, 150); ctx.beginPath(); ctx.moveTo(175,100); ctx.lineTo(250,250); ctx.lineTo(100,250); ctx.fillStyle = color[j]; ctx.fill(); ctx.closePath(); } break; } } function disconnect() { if (!device || !device.gatt.connected) return; device.gatt.disconnect(); alert("切断しました。"); } </script> </body> </html> ``` ### 結果 ボタンを押すたびに図形の形と色を変更することができた canvasの使い方が少しは分かってきたので、次は加速度なども用いてゲームの作成に挑戦したい