\r\n \r\n\r\n```\r\n```JavaScript\r\nvar cvs = document.querySelector(\"canvas\");\r\ncvs.width = window.innerWidth;\r\ncvs.height = window.innerHeight;\r\nvar ctx = cvs.getContext(\"2d\");\r\nvar x = cvs.width / 2;\r\n\r\nwindow.addEventListener(\"keydown\", (evt) => {\r\n if (evt.key == 37) {\r\n x--;\r\n }\r\n});\r\n\r\nfunction upd() {\r\n ctx.clearRect(0, 0, cvs.width, cvs.height);\r\n ctx.beginPath();\r\n ctx.fillStyle = \"#000\";\r\n ctx.arc(x, cvs.height / 2, 20, 0, 360);\r\n ctx.fill();\r\n ctx.closePath();\r\n requestAnimationFrame(upd);\r\n}\r\n\r\nupd();\r\n```\r\n\r\n---\r\n### 解決のために行った事\r\n- addEventListenerのkeydownは実はキー長押しが関係ないのではと思い、実は少しずつ移動しているのではないかと思ったので、addEventListener内のif文の処理を「x -= 100;」にしてみたことがありますが移動しませんでした。\r\n- addEventListenerの記述を関数内の手前や関数内の後ろや関数外の後ろに書き直したこともありましたが円は移動しませんでした。\r\n- 関数内のif文の条件式が「evt == 37」となっていたことに、質問を投稿した時気付きました。「evt.key == 37」に訂正したのですが、円は移動しませんでした。","answerCount":3,"upvoteCount":0,"datePublished":"2021-12-12T10:12:41.123Z","dateModified":"2021-12-12T10:18:46.821Z","acceptedAnswer":{"@type":"Answer","text":"キーコードで判断する場合は `evt.key` ではなく `evt.keyCode` ではないでしょうか?\r\n\r\n```javaScript\r\n//if (evt.key == 37) {\r\nif (evt.keyCode == 37) {\r\n```\r\n\r\nただ、`evt.keyCode` は非推奨のようなので `evt.key` を使った方が良さそうです。\r\n`evt.key` の場合は `\"ArrowLeft\"` のような文字列で判断します。\r\n\r\n```javaScript\r\nif (evt.key == \"ArrowLeft\" ) {\r\n```\r\n\r\n\r\n<参考>\r\n■ KeyboardEvent.key\r\n[https://developer.mozilla.org/ja/docs/Web/API/KeyboardEvent/key](https://developer.mozilla.org/ja/docs/Web/API/KeyboardEvent/key)\r\n■ KeyboardEvent.keyCode\r\n[https://developer.mozilla.org/ja/docs/Web/API/KeyboardEvent/keyCode](https://developer.mozilla.org/ja/docs/Web/API/KeyboardEvent/keyCode)","dateModified":"2021-12-12T12:24:57.658Z","datePublished":"2021-12-12T12:24:57.658Z","upvoteCount":2,"url":"https://teratail.com/questions/373474#reply-505666"},"suggestedAnswer":[{"@type":"Answer","text":"```js\r\n\r\n\r\n\r\n\r\n\r\n\r\n \r\n\r\n\r\n\r\n```","dateModified":"2021-12-12T13:54:23.347Z","datePublished":"2021-12-12T13:54:23.347Z","upvoteCount":1,"url":"https://teratail.com/questions/373474#reply-505680","comment":[{"@type":"Comment","text":"ありがとうございました。","datePublished":"2021-12-13T14:04:18.088Z","dateModified":"2021-12-13T14:04:18.088Z"}]},{"@type":"Answer","text":"canvas要素に対してキーイベントを有効にするためには、canvas要素に対してtabindexを設定して、その上で、canvas要素に対してfocus()メソッドを適用してあげてください。\r\n```html\r\n\r\n```\r\n```javascript\r\ncvs.focus();\r\n```","dateModified":"2021-12-12T13:26:05.820Z","datePublished":"2021-12-12T13:26:05.820Z","upvoteCount":1,"url":"https://teratail.com/questions/373474#reply-505675","comment":[{"@type":"Comment","text":"ありがとうございました。","datePublished":"2021-12-13T14:04:07.323Z","dateModified":"2021-12-13T14:04:07.323Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://teratail.com","name":"トップ"}},{"@type":"ListItem","position":2,"item":{"@id":"https://teratail.com/tags/HTML5","name":"HTML5に関する質問"}},{"@type":"ListItem","position":3,"item":{"@id":"https://teratail.com/questions/373474","name":"arcメソッドによる円が動かない"}}]}}}
質問するログイン新規登録

Q&A

解決済

3回答

1006閲覧

arcメソッドによる円が動かない

退会済みユーザー

退会済みユーザー

総合スコア0

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2021/12/12 10:12

編集2021/12/12 10:18

0

2

目標

左矢印キーを押している間、円が左に移動するようにしたいです。

問題

円が左に移動しません。


HTML5

1<!DOCTYPE html> 2<html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>test</title> 6 </head> 7 <body> 8 <canvas width="" height=""></canvas> 9 <script src=".js"></script> 10 </body> 11</html>

JavaScript

1var cvs = document.querySelector("canvas"); 2cvs.width = window.innerWidth; 3cvs.height = window.innerHeight; 4var ctx = cvs.getContext("2d"); 5var x = cvs.width / 2; 6 7window.addEventListener("keydown", (evt) => { 8 if (evt.key == 37) { 9 x--; 10 } 11}); 12 13function upd() { 14 ctx.clearRect(0, 0, cvs.width, cvs.height); 15 ctx.beginPath(); 16 ctx.fillStyle = "#000"; 17 ctx.arc(x, cvs.height / 2, 20, 0, 360); 18 ctx.fill(); 19 ctx.closePath(); 20 requestAnimationFrame(upd); 21} 22 23upd();

解決のために行った事

  • addEventListenerのkeydownは実はキー長押しが関係ないのではと思い、実は少しずつ移動しているのではないかと思ったので、addEventListener内のif文の処理を「x -= 100;」にしてみたことがありますが移動しませんでした。
  • addEventListenerの記述を関数内の手前や関数内の後ろや関数外の後ろに書き直したこともありましたが円は移動しませんでした。
  • 関数内のif文の条件式が「evt == 37」となっていたことに、質問を投稿した時気付きました。「evt.key == 37」に訂正したのですが、円は移動しませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

キーコードで判断する場合は evt.key ではなく evt.keyCode ではないでしょうか?

javaScript

1//if (evt.key == 37) { 2if (evt.keyCode == 37) {

ただ、evt.keyCode は非推奨のようなので evt.key を使った方が良さそうです。
evt.key の場合は "ArrowLeft" のような文字列で判断します。

javaScript

1if (evt.key == "ArrowLeft" ) {

<参考>
■ KeyboardEvent.key
https://developer.mozilla.org/ja/docs/Web/API/KeyboardEvent/key
■ KeyboardEvent.keyCode
https://developer.mozilla.org/ja/docs/Web/API/KeyboardEvent/keyCode

投稿2021/12/12 12:24

cx20

総合スコア4707

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/12/13 14:03

ありがとうございました。
guest

0

js

1<!DOCTYPE hrml> 2<meta charset="UTF-8"> 3<title></title> 4<style> 5body { overflow: hidden; } 6</style> 7 8<body> 9 <canvas width="" height=""></canvas> 10 11<script> 12const 13 cvs = document.querySelector("canvas"), 14 ctx = cvs.getContext("2d"); 15 16cvs.width = window.innerWidth; 17cvs.height = window.innerHeight; 18 19let 20 x = cvs.width / 2, 21 y = cvs.height / 2, 22 key = null; 23 24 25function handler (event) { 26 switch (event.type) { 27 case 'keydown' : key = event.key; break; 28 case 'keyup' : key = null; break; 29 } 30} 31 32 33function upd() { 34 x += (key === 'ArrowRight') - (key === 'ArrowLeft'); 35 y += (key === 'ArrowDown') -(key === 'ArrowUp'); 36 37 ctx.clearRect(0, 0, cvs.width, cvs.height); 38 ctx.beginPath(); 39 ctx.fillStyle = "#000"; 40 ctx.arc(x, y, 20, 0, 360); 41 ctx.fill(); 42 ctx.closePath(); 43 requestAnimationFrame(upd); 44} 45 46['keyup', 'keydown'].forEach (t=> document.addEventListener (t, handler, false)); 47upd(); 48</script> 49

投稿2021/12/12 13:54

babu_babu_baboo

総合スコア616

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/12/13 14:04

ありがとうございました。
guest

0

canvas要素に対してキーイベントを有効にするためには、canvas要素に対してtabindexを設定して、その上で、canvas要素に対してfocus()メソッドを適用してあげてください。

html

1<canvas width="" height="" tabindex="0"></canvas>

javascript

1cvs.focus();

投稿2021/12/12 13:26

justmeet0924

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/12/13 14:04

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問