質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.47%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

HTML5

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

JavaScript

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

enchant.js

enchant.jsとは、アプリやゲームを簡単に開発できるオープンソースのHTML5+JavaScriptベースのフレームワークです。プログラミング学習にも用いられ、多くの素材やプラグインが用意されています。

Q&A

解決済

1回答

1220閲覧

enchantjsでキーボード同時押しするとkeyupの挙動がおかしくなる。

web11

総合スコア52

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

HTML5

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

JavaScript

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

enchant.js

enchant.jsとは、アプリやゲームを簡単に開発できるオープンソースのHTML5+JavaScriptベースのフレームワークです。プログラミング学習にも用いられ、多くの素材やプラグインが用意されています。

0グッド

0クリップ

投稿2020/06/09 07:43

編集2020/06/09 15:39

A連打やBボタンを押しつづけている状態で横移動をするとA、Bのボタンのactive時の状態から戻らず直し方が分かりません。
また、Aボタンを押した際攻撃モーションを振る動作をつけているのですが、たまに終わった時のフレームの値がundefinedが帰って来てしまうため、すぐさまifで値を入れる処理をしているのですが、どうしてもチラツキが出てしまいます。
こちらも解決できないでしょうか?
以下のコードは必要そうな箇所だけ抜き出しています。
一応、テストurlはこちらになります。解答宜しくおねがいします。
http://www.xblog.shop/test/

javascript

1 2//定数 3const SCREEN_WIDTH = 414; 4const SCREEN_HEIGHT = 736; 5 6 7//スタート画面画像 8const START = "images/start/start.png"; 9const START_SKY = "images/start/start_sky.jpg"; 10const START_CLOUD01 = "images/start/start_cloud01.png"; 11const START_CLOUD02 = "images/start/start_cloud02.png"; 12 13//スタートタイトル 14const START_TITLE = "images/start/start_title.png"; 15const START_DORAGON = "images/start/start_doragon.png"; 16const START_GAME = "images/start/start_game.png"; 17const START_ICON = "images/start/start_icon.png"; 18 19//ミュージックボタン 20const MUSIC_BTN = "images/music_btn.png"; 21 22//音楽素材 23const OP_BGM = "images/music/op.mp3"; 24 25 26//プレイシーン画像 27const PLAY_BG = "images/play/background.jpg"; 28 29const PLAY_CHARA = "images/play/chara.png"; 30 31const PLAY_MAP = "images/play/map.png"; 32 33const PLAY_BTN = "images/play/btn.png"; 34 35//アセット 36const START_BG_ASSETS = [ 37 START_SKY, START_CLOUD01, START_CLOUD02, START 38]; 39 40const START_TITLE_ASSETS = [ 41 START_DORAGON, START_ICON, START_TITLE, START_GAME 42]; 43 44const ASSETS = [ 45 MUSIC_BTN, OP_BGM, PLAY_BG, PLAY_CHARA, PLAY_MAP, PLAY_BTN 46]; 47 48 49//パラメータ関連 50const TITLE_PARAMETER = [ 51 [102, 113, 21, 295], //START_DORAGON 52 [101, 143, 182, 290], //START_ICON 53 [360, 87, 28, 325], //START_TITLE 54 [135, 23, 142, 445] //START_GAME 55]; 56 57const PLAY_BG_WIDTH = 414; 58const PLAY_BG_HEIGHT = 5152; 59 60const PLAYER_WIDTH = 32; 61const PLAYER_HEIGHT = 32; 62 63const PLAY_MAP_WIDTH = 16; 64const PLAY_MAP_HEIGHT = 16; 65 66const PLAY_CHARA_ACTION = { 67 "walk": [27, 28, 29], 68 "attack": [30, 31, 32, 33, 34, 35] 69}; 70const MAP_PARAMETER = [178, 199, 220]; 71 72const PLAYER_PARAMETER = [171, 192, 211]; 73//グローバル変数 74 75var game = null; 76var play = null; 77var timeflg = null; 78var time = null; 79var score = null; 80var pad = null; 81var btn_a = null; 82var action_flg = true; 83var bg = null; 84var speed_y = 3; 85 86 87 88 89 90var createPlayScene = function () { 91 play = new Player(); 92 scene.addChild(play); 93 //バーチャルパッド 94 pad = new Pad(); 95 pad.width = 92.4; 96 pad.moveTo(10, SCREEN_HEIGHT - 100); 97 scene.addChild(pad); 98 99 pad.ontouchend = function () { 100 game.keyflg = false; 101 pad.frame = 0; 102 103 //ゲームキーフラグをfalseにしないと1回しか押せないため毎回false 104 } 105 game.keybind(65, 'a'); 106 game.keybind(66, 'b'); 107 btn_a = new Play_Btn_A(); 108 scene.addChild(btn_a); 109 btn_a.x = SCREEN_WIDTH - 65; 110 btn_a.y = SCREEN_HEIGHT - 100; 111 112 var btn_b = new Play_Btn_B(); 113 scene.addChild(btn_b); 114 btn_b.x = SCREEN_WIDTH - 115; 115 btn_b.y = SCREEN_HEIGHT - 60; 116 117 // タイトルシーンを返します。 118 return scene; 119} 120 121 122 123// キー入力対策 124window.focus(); 125document.onkeyup = function () { 126 127 game.keyflg = false; // gameオブジェクトにオリジナルのメンバ変数keyflgを追加 128 129 game.keyflg_b = false; 130 game.keyflg_a = false; 131 return true; 132}; 133 134 135 136//プレイヤー 137var Player = Class.create(Sprite, { 138 initialize: function () { 139 Sprite.call(this, PLAYER_WIDTH, PLAYER_HEIGHT); 140 this.image = game.assets[PLAY_CHARA]; 141 this.frame = PLAY_CHARA_ACTION.walk[0]; 142 this.x = PLAYER_PARAMETER[1]; 143 this.y = SCREEN_HEIGHT - 35; 144 this.count = 0; 145 this.action = 1; 146 147 }, 148 onenterframe: function () { 149 var input = game.input; 150 if (typeof this.frame === "undefined") { 151 this.count = 0; 152 this.frame = PLAY_CHARA_ACTION.walk[this.count]; 153 } 154 if (action_flg) { 155 if (game.frame % 5 == 0 && this.frame == 29) { 156 this.count = 0; 157 this.frame = PLAY_CHARA_ACTION.walk[this.count]; 158 this.count++; 159 } else if (game.frame % 5 == 0) { 160 this.frame = PLAY_CHARA_ACTION.walk[this.count]; 161 this.count++; 162 } 163 } 164 165 166 //左が押された時かつ中央の場合 167 if (input.left == true && this.action == 1 || input.left == true && this.action == 2) { 168 if (!game.keyflg) { 169 this.action--; 170 this.x = PLAYER_PARAMETER[this.action]; 171 game.keyflg = true; 172 pad.frame = 1; 173 document.onkeyup = function () { 174 175 pad.frame = 0; 176 game.keyflg = false; 177 }; 178 } 179 } 180 181 182 //右が押された時かつ一番左の場合 183 if (input.right == true && this.action == 0 || input.right == true && this.action == 1) { 184 if (!game.keyflg) { 185 this.action++; 186 this.x = PLAYER_PARAMETER[this.action]; 187 game.keyflg = true; 188 pad.frame = 3; 189 document.onkeyup = function () { 190 pad.frame = 0; 191 game.keyflg = false; 192 }; 193 } 194 } 195 196 } 197}); 198 199 200 201 202 203//ボタンベース 204var Play_Btn = Class.create(Sprite, { 205 initialize: function () { 206 Sprite.call(this, 65.5, 61); 207 this.image = game.assets[PLAY_BTN]; 208 }, 209 attack: function () { 210 var count = 0; 211 action_flg = false; 212 var countup = function () { 213 requestAnimationFrame(function () { 214 play.frame = PLAY_CHARA_ACTION.attack[count]; 215 count++ 216 }); 217 } 218 countup(); 219 var id = setInterval(function () { 220 countup(); 221 if (count > 5) { 222 action_flg = true; 223 count = 0; 224 clearInterval(id); //idをclearIntervalで指定している 225 } 226 }, 60); 227 }, 228 speed: function () { 229 230 } 231}); 232 233 234//Play_Btnを継承 235var Play_Btn_A = Class.create(Play_Btn, { 236 initialize: function () { 237 Play_Btn.call(this); 238 this.frame = 0; 239 }, 240 ontouchstart: function () { 241 //game.input.a = true; 242 this.attack(); 243 this.frame = 2; 244 }, 245 ontouchend: function () { 246 //game.input.a = false; 247 this.frame = 0; 248 }, 249 onenterframe: function () { 250 if (game.input.a && !game.keyflg_a) { 251 this.attack(); 252 var up_this = this; 253 game.keyflg_a = true; 254 this.frame = 2; 255 document.onkeyup = function () { 256 up_this.frame = 0; 257 game.keyflg_a = false; 258 }; 259 } 260 } 261}); 262 263var Play_Btn_B = Class.create(Play_Btn, { 264 initialize: function () { 265 Play_Btn.call(this); 266 this.frame = 1; 267 }, 268 ontouchstart: function () { 269 //game.input.a = true; 270 271 this.frame = 3; 272 speed_y = 7; 273 }, 274 ontouchend: function () { 275 //game.keyflg_b = false; 276 //game.input.a = false; 277 this.frame = 1; 278 speed_y = 3; 279 }, 280 onenterframe: function () { 281 if (game.input.b && !game.keyflg_b) { 282 //bg.speed = 6; 283 speed_y = 7; 284 //console.log(bg.y); 285 var up_this = this; 286 game.keyflg_b = true; 287 this.frame = 3; 288 console.log("ter"); 289 document.onkeyup = function (e) { 290 291 game.keyflg_b = false; 292 up_this.frame = 1; 293 speed_y = 3; 294 295 }; 296 } 297 298 } 299 300});

##keyup挙動の解決 コード変更箇所
各クラスに書いていたkeyup処理を削除してcreatePlayScene内のA、Bボタン・横移動ボタンのインスタンスで処理をまとめて条件分岐で解決しました。

javascript

1 scene.onenterframe = function () { 2 document.onkeyup = function (e) { 3 if (e.key == "ArrowRight" || e.key == "ArrowLeft") { 4 pad.frame = 0; 5 game.keyflg = false; 6 } else if (e.key == "b") { 7 game.keyflg_b = false; 8 btn_b.frame = 1; 9 speed_y = 3; 10 } else if (e.key == "a") { 11 btn_a.frame = 0; 12 game.keyflg_a = false; 13 } 14 }; 15 }

・横移動 十字キーボード
・Aボタン キーボードA
・Bボタン キーボードB

##追記
ローカルで確認してた際はバーチャルパッド、機能していたのですが、テストサーバーだと機能しなくなっているようです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

enchantjsでキーボード同時押しするとkeyupの挙動がおかしくなる。

っていう理由だけはなんとなくわかったので記載します。

document.onkeyupをAボタン押してもBボタン押しても関数上書きしてるので

処理として
0. Aボタン押す
0. document.onkeyupがAボタン離したときの関数になる
0. (Aボタン離さずに)Bボタン押す
0. ocument.onkeyupがBボタン離したときの関数になる
0. Bボタンを離す
0. Bボタン離したときの関数が呼ばれる
0. Aボタンを離す
0. Bボタン離したときの関数が呼ばれる

ってなります(Aボタン離したときの関数が呼ばれません)

解決方法としては、
document.onkeyupを一箇所にする&なんのキーを押したかを見て処理をする
…っていう感じになります。

投稿2020/06/09 14:57

rururu3

総合スコア5545

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

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

web11

2020/06/09 15:38

keyupって押したボタンだけのキーの処理勝手に判定してくれるのかと勘違いしてました。1つ目の質問解決しました、ありがとうございます。 クラス内で処理を完結させたほうが良いのか、ちょっと判断ができないですが、今回は、インスタンス内で処理するようにしてみました。
web11

2020/06/11 21:46

バーチャルパッドの件はサーバーの問題でした、ベストアンサーに選ばせていただきます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問