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

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

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

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

Q&A

解決済

3回答

1842閲覧

Javascriptでif文が機能しない

nikuman1251

総合スコア15

JavaScript

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

0グッド

2クリップ

投稿2018/10/11 03:02

編集2018/10/11 03:45

前提・実現したいこと

Zキーを押すと自機から弾が発射されるようにしたい。

発生している問題

Zキーを押すと自機から弾が発射されるようにするためにキーが入力されたら弾が発射されるようにしようとしましたが、Zキーを押しても反応がありませんでした。

該当のソースコード

Javascript

1var app_height = 600; 2var app_width = 420; 3tm.main(function () { 4 app = tm.display.CanvasApp("#app"); //appという名前のcanvasに描画する 5 app.fps = 60; //fpsを60にする。 6 app.resize(app_width, app_height); //解像度をapp_width,app_widthにし、ウィンドウいっぱいにする。 7 app.replaceScene(MainScene()); 8 app.run(); 9}); 10 11tm.define("MainScene", { 12 superClass: "tm.app.Scene", 13 init: function () { 14 this.superInit(); 15 16 17 {var gradation = tm.graphics.LinearGradient(0, 0, 500, 500) //背景(グラデーション) 18 .addColorStopList(Array.range(0, 20).map(function(i) { 19 return { 20 offset: i / 20, 21 color: "hsl({0}, 80%, 80%)".format(360 * i / 20), 22 }; 23 })) 24 .toStyle(); 25 tm.display.RectangleShape(app_width*2, app_height*2, { 26 fillStyle: gradation 27 }).setPosition(200, 200).addChildTo(this);} 28 29 30 this.fromJSON({ //出現キャラ 31 children: { 32 enemy: { 33 type: "tm.display.CircleShape", 34 init: [50, 50], 35 x: app_width * 0.5, y: app_height * 0.1 //敵の初期位置 36 }, 37 poyoenemy:{ 38 type: "tm.display.HeartShape", 39 init: [20,20], 40 x:app_width , y:app_height *0.3 //poyo敵 41 }, 42 player: { 43 type: "Player", 44 x: app_width * 0.5, y: app_height * 0.9 //プレイヤーの初期位置 45 } 46 } 47 }); 48 49 50 var params = { 51 target: this.player, //ターゲットをプレイヤーに設定 52 createNewBullet: function (runner,attr) { //弾を生成 53 var bullet = tm.bulletml.Bullet(runner).addChildTo(this); 54 bullet.boundingType = "circle"; 55 bullet.radius = 2; 56 bullet.onenterframe = function () { 57 58 if (this.x < 0 || app_width < this.x || this.y < 0 || app_height < this.y) { 59 this.remove(); 60 } 61 if (this.isHitElement(Player.SINGLETON)) { 62 this.remove(); 63 } 64 }; 65 }.bind(this) 66 67 }; 68 69 var pparams = { 70 target: this.enemy, 71 createNewBullet: function(runner) { 72 var bullet = tm.bulletml.Bullets(runner).addChildTo(this); 73 bullet.boundingType = "circle"; 74 bullet.radius = 2; 75 bullet.onenterframe = function (){ 76 if (this.x < 0 || app_width < this.x || this.y < 0 || app_height < this.y) { 77 this.remove(); 78 } 79 }; 80 }.bind(this) 81 }; 82 83 tm.define("MyBullet",{ 84 superClass:"tm.bulletml.Bullets", 85 init: function(runner,attr){ 86 this.superInit(runner); 87 this.color = attr.color; 88 this.removeChildren(); 89 //colorプロパティに応じて初期化 90 switch(attr,color){ 91 case "blue": 92 tm.display.Splite("bullet",20,20) 93 .setFrameIndex(0) 94 .addChildTo(this); 95 break; 96 case "red": 97 tm.display.Splite("bullet",20,20) 98 .setFrameIndex(1) 99 .setScale(1.5,0.5) 100 .addChildTo(this); 101 break; 102 } 103 104 this.beforeX = this.x; 105 this.beforeY = this.y; 106 }, 107 onenterframe:function(){ 108 if(this.color ==="blue"){ 109 this.rotation +=10; 110 }else if(this.color ==="red"){ 111 this.rotation = Math.atan2(this.y -this.beforeY,this.x - this.beforeX)*Math.RAD_TO_DEG; 112 } 113 114 this.beforeX = this.x; 115 this.beforeY = this.y; 116 } 117 }) 118 119 bulletml.dsl(); 120 var DANMAKU_SAKURETU = new bulletml.Root({ 121 top: action([ 122 repeat(100, [ //100回fireとwaitを繰り返す。 123 fire(bullet(actionRef("explosion"))), 124 //fire(方向,弾) 125 //方向1.aim(自機狙い)2.absolute(絶対方向)3.sequence(直前に打った弾と相対方向)単位は°(度) 126 wait(200)//wait(x) xフレーム待機。自然数のみ 127 128 ]) 129 ]), 130 explosion: action([ 131 wait(100), 132 changeSpeed(speed(0), 20), 133 wait(20), 134 repeat(8, [ 135 fire(direction("$rand *360"), bullet({color:"red"})) 136 ]), 137 vanish() 138 ]) 139 }); 140 var DANMAKU_RENSHA = new bulletml.Root({ 141 top: action([ 142 repeat(999, [ 143 fire(speed(2.1), bullet({color:"blue"})), 144 wait("$rand *20") 145 ]) 146 ]), 147 }); 148 var DANMAKU_KAITEN = new bulletml.Root({ 149 top: action([ 150 repeat(990, [ 151 fire(direction(23, "sequence"), bullet()), 152 wait(1) 153 ]) 154 ]) 155 }); 156 var DANMAKU_KOTEI = new bulletml.Root({ 157 top: action([ 158 repeat(999, [ 159 fire(direction(180, "absolute"), speed(2.1), bullet()), 160 wait("$rand * 20"), 161 ]), 162 ]), 163 }); 164 var DANMAKU_NWAY = new bulletml.Root({ 165 top: action([ 166 repeat(999, [ 167 fire(direction(-30), speed(1.5), bullet()), 168 repeat(4, [ 169 fire(direction(15, "sequence"), speed(0, "sequence"), bullet()), 170 ]), 171 wait(120), 172 ]), 173 ]), 174 }); 175 var DANMAKU_ALL = new bulletml.Root({ 176 top: action([ 177 repeat(999, [ 178 fire(speed(1.5), bullet()), 179 repeat(35, [ 180 fire(direction(10, "sequence"), speed(0, "sequence"), bullet()), 181 ]), 182 wait(120), 183 ]), 184 ]), 185 }); 186 var DANMAKU_WHIP = new bulletml.Root({ 187 top: action([ 188 repeat(999, [ 189 fire(speed(1.5), bullet()), 190 repeat(10, [ 191 wait(5), 192 fire(direction(0, "sequence"), speed(0.5, "sequence"), bullet()), 193 ]), 194 wait(120), 195 ]), 196 ]), 197 }); 198 var DANMAKU_WINDER = new bulletml.Root({ 199 top: action([ 200 repeat(10000, [ 201 bindVar("d", "Math.sin($loop.index * 0.03) * 20"), 202 fire(direction("179 + $d", "absolute"), speed(5.0), bullet(), offsetX(-40)), 203 fire(direction("181 + $d", "absolute"), speed(5.0), bullet(), offsetX(40)), 204 wait(5), 205 ]), 206 ]), 207 }); 208 209 var DANMAKU0 = new bulletml.Root({ 210 top: action([ 211 repeat(999, [ 212 fire(speed(2.1), bullet({ color: "red" })), 213 wait("$rand * 20"), 214 fire(direction(180, "absolute"), speed(2.1), bullet({ color: "blue" })), 215 wait("$rand * 20"), 216 ]), 217 ]), 218 }); 219 220 var PLAYER_BULLET = new bulletml.Root({ 221 top: action([ 222 repeat(10000,[ 223 fire(direction(360,"absolute"),speed(20,0),bullet()), 224 wait(5), 225 ]), 226 ]), 227 }); 228 229 230 { 231 {//////////////問題の場所はここです/////////////////////////// 232 var kb =app.keyboard; 233 if(kb.getKey("Z")){ 234 this.player.startDanmaku(PLAYER_BULLET,pparams); 235 }/////////////////////////////////////////////////////////// 236 this.enemy.startDanmaku(DANMAKU0, params); 237 } 238 239 } 240 // 上の定義を敵が打ち始める。 241 } 242}); 243 244tm.define("Player", { 245 superClass: "tm.display.TriangleShape", 246 247 init: function () { 248 this.superInit(25, 25); //プレイヤーのサイズ 249 this.boundingType = "circle"; //当たり判定の形 250 this.radius = 1.5; //当たり判定のサイズ 251 Player.SINGLETON = this; 252 }, 253 254 update: function (app) { //キー入力監視 255 var X =4; 256 var kb = app.keyboard; 257 if(kb.getKey("shift")){ //shiftで低速移動 258 X -= 3; 259 } 260 if (this.x < 1) this.x =1; 261 if (app_width-2 < this.x)this.x=app_width-1; 262 if (this.y < 1 ) this.y =1; 263 if (app_height-1 < this.y) this.y=app_height-1; 264 265 this.position.add(kb.getKeyDirection().mul(X)); 266 } 267}); 268Player.SINGLETON = null;

試したこと

Zキーを押すと弾が発射されるのではなく、Zキーが押されていなかったら弾が発射されるようにすると、Zキーを押されていないときも押されているときも弾が発射され続けました。

補足情報(FW/ツールのバージョンなど)

tmlib.js
tmlib.bulletml.js
bulletml.js

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

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

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

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

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

y_waiwai

2018/10/11 03:06

どこのif文のはなしなんでしょうか
nikuman1251

2018/10/11 03:08

tm.define("MainScene"の一番下です
Udomomo

2018/10/11 03:16

if文がずっとelseになるというのは具体的に何が起こっているのでしょうか。
nikuman1251

2018/10/11 03:20

Zキーを押しても反応がありませんでした。試しにelseに処理を書いてみたところ、その処理がずっと行われました。
mather

2018/10/11 03:24

kb.getKey("tab") とあるのに「Zキーを押しても反応がありませんでした」とは…?
nikuman1251

2018/10/11 03:25

すみません。ソースコードがまちがえていました。正しくは、kb.getKey("Z")です。
mather

2018/10/11 03:30

実際に動かないときのソースコードを提示しましょう。「Zキーを押しても反応がありませんでした。」などの情報は質問に追記してください。ifが動かない、といきなり決めつけるのではなく「どんな処理をしようとして、どんな操作を行ったが、〇〇という期待した結果にならず、〇〇という結果になってしまう」と具体的に書いてください。
think49

2018/10/11 03:34

tmの定義コードが見あたりませんが、質問文に貼って頂いたコードのみで動作しますか。
nikuman1251

2018/10/11 03:38

tmlib.js、tmlib.bulletml.js、bulletml.jsを使用しているため、このコードだけでは動作しません。
guest

回答3

0

どこかのコードをまるっとコピペした感じですかね。
「tm」が指すライブラリは存じませんが、kb.getKeyを書く場所がそもそもおかしいと感じます。
今書かれている場所は、「init」のブロックですので、初期化処理なのでしょう。
そこでコード入力を受け付けようとしても、まだ起動していない状態なのでキーは反応しないと思います。
(なので、yambejpさんの提案で書かれたconsole.logはfalseになった)

ですから、key.getKeyを書くとしたら、コード下部にある「Player」の

update: function (app) { //キー入力監視

の部分じゃないでしょうか。
Shiftキーを押した際の動作を書かれているようですので、それを真似たらいいと思います。

正直、この問題一つですむものではないと思いますので、まずは自分でコードを理解される学習の期間を置かれたほうが良いかと思います。

投稿2018/10/11 04:06

編集2018/10/11 04:08
kunai

総合スコア5405

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

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

0

自己解決

勉強不足により、まだまだ基礎的な知識が足りていないため、勉強をしてから、再度挑戦しようと思います。

投稿2018/10/31 06:32

nikuman1251

総合スコア15

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

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

0

if(kb.getKey("Z")){

の前行で

javascript

1console.log(kb.getKey("Z"));

などでチェックすることですかね
あとは「Z」を「z」にして再度チェックしてみるとか

投稿2018/10/11 03:40

yambejp

総合スコア114779

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

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

nikuman1251

2018/10/11 03:47

console.log(kb.getKey("Z")); でチェックしてみると、1度だけfalseが出力されました。その後はいくらZを押してもコンソールに出力されることはありませんでした。
yambejp

2018/10/11 03:49

では、単にgetKeyの使い方が違うのでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問