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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

340閲覧

setTimeoutで画像を動かす

williamsArk

総合スコア46

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/05/06 04:13

ゲーム作成などにおいて、制限時間を表すと言う目的で、アイコン画像をA地点からB地点に動かそうと思っています。B地点にたどり着いたらGAMEOVERと言うものです。
マリオを動かす際に、style.left += "50px"と言う風にしてしまうと、setTimeoutにしても、そこからさらに動くことはなく、ずっと同じ場所で止まってしまいます。
予想ですが、"50px"とすると、数値を足しあげるというよりは、そこの場所指定になってしまうのかな、と思っています。
setTimeoutなどで、毎秒少しずつ画像を動かす処理を考察していただけると幸いです。

function MarioMove() { timerId = setTimeout(step, 1000); } function step() { Mario.style.left += "50px"; if(time === 0){ clearTimeout(timerId); countdown = false; } else { timerId = setTimeout(step, 1000); } }

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

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

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

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

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

guest

回答2

0

例えば、Mario.style.leftに"10px"と入っていたとしましょう。
Mario.style.left += "50px";で行われるのは文字列と文字列の足し算ですから、"10px50px"という文字列がMario.style.leftに入ろうとしますが、そんな指定の仕方はないので無効になります。
やるとしたら、parseInt()などでMario.style.leftを数値にして、50を足してから、後ろに"px"を足して文字列にして、Mario.style.leftに入れてあげればいいのではないでしょうか。

JavaScript

1Mario.style.left = (parseInt(Mario.style.left) + 50) + "px";

投稿2019/05/06 04:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Asylum35aO2

2019/05/06 11:59

文字列と数列、基本的なことでしたねお恥ずかしい。 お陰さまでまた1つ成長できました。ありがとうございました。
guest

0

ベストアンサー

style.left += "50px"

style.leftがnullだったときに加算できません
また文字列だったときにも加算できません
50pxに50pxを足すと50px50pxですね

たとえばこう

javascript

1<script> 2var time=5; 3var Mario; 4window.addEventListener('DOMContentLoaded', function(e){ 5 Mario=document.querySelector('#mario'); 6 MarioMove(); 7}); 8function MarioMove() { 9 timerId = setTimeout(step, 1000); 10} 11 12function step() { 13 var l=Mario.style.marginLeft; 14 l=(reg=l.match(/\d+/))?reg[0]:"0"; //数値を含めばその数、なければ0 15 l=parseInt(l); //文字列を数値化 16 l+=50; //数値に50を加算 17 l+="px"; //単位を付加 18 console.log(l); 19 Mario.style.marginLeft = l; //値を代入 20 time--; 21 if(time === 0){ 22 clearTimeout(timerId); 23 } else { 24 timerId = setTimeout(step, 1000); 25 } 26} 27</script> 28 29<img id="mario" src="https://placehold.jp/ff0000/00ffff/100x100.png?text=mario">

※コメントつけておきました

解説

javascript

1l=(l.match(/\d+/))?reg[0]:"0"; 2```javascript 3上記分解すると 4```javascript 5reg=l.match(/\d+/)

\dは0-9の数字それに+がついてるので1文字以上の数字
それをスラッシュで挟んでmatchにあたえると
変数lの文字列の中にある数字を拾い、結果をregという変数に配列として返します。

javascript

1l=条件?reg[0]:"0";

条件の中でregに数値がはいっていればその数値であるreg[0]をlに代入します
そうでないとき(つまりlに数値が含まれないとき)にはlには"0"を代入します
これを三項演算子といいます

結果としてlの中から数値だけを取り出してlに入れ直しています

投稿2019/05/06 04:36

編集2019/05/08 11:08
yambejp

総合スコア114839

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

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

Asylum35aO2

2019/05/06 11:58

確かに文字列と数字は並べないですね。基本的な事が分かっていませんでした。ご指摘感謝致します。 御手数ですが、 l=(reg=l.match(/\d+/))?reg[0]:"0"; の処理の説明をもう少し頂けますか? 全体的に、特にmatch(/\d+/))辺りが難しいです。
yambejp

2019/05/08 11:08

追加の質問気が付きませんでした。追記しておきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問