\n\nフォーカスが外れました。クリックしてください\n \n```","dateModified":"2024-08-26T01:22:11.282Z","datePublished":"2024-08-26T01:22:11.282Z","upvoteCount":0,"url":"https://teratail.com/questions/c65yid36wdrn8x#reply-73c697rilj7yn8","comment":[]},{"@type":"Answer","text":"もしかしたら質問自体がなにか誤解を産むような内容だったりしませんか?\n\n個人的に思ったのはゲームなんて電源切ったら終わるのは当然だし、プロセスが終了して処理を続行できなかったら負けってことに当然なるのでは?と思いました。\nゲームオタクでは無いので常識が分からないのですが、スマブラなどやっててもホームに戻ったら対戦終了しません...?\n\n多分そういうことを聞きたい訳じゃないとは思うのですが、こういう風にしか読解出来なかったです。\n\nうーん。ほかの意図としてはjsでタブのライフサイクルを取得できないか?みたいな意図だったりするんでしょうか。\n\nスマホとかだと、アプリを開いた時と閉じた時にイベントが発生するのでそのタイミングでログインログアウトみたいなことができ、MMOみたいな?ずっとログインし続ける系のゲーム(オートセーブ的な?よくしらんが)とかも上手く制御できるかと思いますが。そういう話?\n\n\nほかの回答で「作り方が間違ってる」というのがありますが、これは決め付けでしかないし、回答として意味を成してない(作ってる本人はそれがミスかどうかなど分かるはずがない)ので、通報でもして溜飲を下げるのがいいと思います。\n反応しすぎて治安悪くなるのもアレかなと思います^^;\n\n\n","dateModified":"2024-08-24T09:23:38.254Z","datePublished":"2024-08-24T09:23:38.254Z","upvoteCount":1,"url":"https://teratail.com/questions/c65yid36wdrn8x#reply-o2c09o8pqcp38p","comment":[{"@type":"Comment","text":"例えば10秒別タブを見たらゲーム終了と判定することはできます\nしかしながら、そのような仕様は好ましくありません\nゲーム終了と判断するタイミングはそれぞれの作り手の判断となりますが、\nタブ復帰したとしてそのタブが復帰したときにゲーム継続中と判断したとして\nsetIntervalが動かないと描画されないってことです\n昔はこの仕様ではなかったのですが、リアルタイムに描画するゲームとか作れませんよねって話です","datePublished":"2024-08-25T00:06:37.554Z","dateModified":"2024-08-25T00:06:37.554Z"},{"@type":"Comment","text":"任天堂のオンラインゲームってそういう仕様なので仕様としては有り得るのでは?\n何が好ましいかは質問文には記載されてないと思うのですが","datePublished":"2024-08-25T03:46:39.258Z","dateModified":"2024-08-25T03:46:39.258Z"},{"@type":"Comment","text":"setInterval云々じゃなくてちゃんと質問内容をした方がいいのでは?","datePublished":"2024-08-25T04:05:50.214Z","dateModified":"2024-08-25T04:05:50.214Z"},{"@type":"Comment","text":"> ほかの回答で「作り方が間違ってる」というのがありますが、これは決め付けでしかないし、回答として意味を成してない(作ってる本人はそれがミスかどうかなど分かるはずがない)ので、\n\nたしかに言葉が足りなかったですね。「それを必要とする事情を考慮したうえで代替策を検討してください」のように、もう少し展開していうべきでした。\n\n(仕様書の隅をつつくような、実用性と無縁な質問もありえますが、多くの質問は「作りたいもの」「したいこと」がある状態のものです。「XY問題」なんて言葉もあるように、適切でない選択肢について質問を投げかけた場合には、正面突破するより、引き返してして道を選び直すことを進言するほうがよりよい回答となりうると考えています。それこそ、「ライセンス問題」や「Appleの審査で却下されることが明らかなアプリ」など、「作るものを変える/諦める」以外の選択肢がない場合も存在します)","datePublished":"2024-08-25T13:49:59.867Z","dateModified":"2024-08-25T14:20:04.079Z"},{"@type":"Comment","text":">質問投稿者に対して\n質問者が悪態を着くことがおかしいかもですね。\n\n他の人の質問を開いて回答しようとした時に、\nこのサイトは初心者の方も質問しますから、コードまるまる書けば伝わるだろうみたいな、気持ちで頼まれてもないのに書くとかして、\nこの投稿者みたいに怒ってくる相手だったらどうしよう?という先入観が産まれてしまって安易に人助け出来なくなってしまいました。\n\n回答に対する返信なので、配慮にかける回答をしている人ももちろん悪いですが、正直、回答する立場の自分としてはかなりショッキングな出来事ですね。\n\nと、不満を吐露して見た。\n\n>maisumakunに対して\n質問者は分からないながらも試行錯誤したり考えながら、真剣に考えても分からなくて、それで頼ってきているだろうに、頭から作り方が間違っているだけなどと否定するのはあまりにも酷いと思いますが。\n間違ってるって物言いはすごく上から目線な上に無責任な発言だと思いますけどね。\n\nもしあなたがそれを良い回答になっていると考えるなら心から軽蔑します。\nあなたが質問者の立場だったら、あなたの回答はいいものだと感じるんですかね。\n(あなたが意図するニュアンスと私が読解した時のニュアンスが異なっているのかもしれないですが。)\n\nうーん。いくら考えても自分なら、こんなこと言われたら不快に思いますね。もし知り合いに言われても不快だと思います。知らん人に言われたら二度と関わりたくないと思うでしょうね。\nまあこんなこと言う人間を見たことがないですが。","datePublished":"2024-08-27T14:36:55.058Z","dateModified":"2024-08-27T14:36:55.058Z"},{"@type":"Comment","text":"> 質問者は分からないながらも試行錯誤したり考えながら、真剣に考えても分からなくて、それで頼ってきているだろうに、頭から作り方が間違っているだけなどと否定するのはあまりにも酷いと思いますが。\n\n試行錯誤の挙げ句、来るべきないところに来た場合には、「こちらは来るところではない」と明確に宣言するのが親切だと考えています。セキュリティにまつわるものなど、問答無用に作ってしまえばさらなる危険を呼び込むものもありえますし、そこで「初心者だから」という免責が通らないことも考えられます。","datePublished":"2024-08-28T07:26:06.206Z","dateModified":"2024-08-28T07:28:59.113Z"},{"@type":"Comment","text":"そうなんですね。心から軽蔑します。","datePublished":"2024-08-28T07:30:18.080Z","dateModified":"2024-08-28T07:30:18.080Z"},{"@type":"Comment","text":">試行錯誤の挙げ句、来るべきないところに来た場合には、「こちらは来るところではない」と明確に宣言するのが親切だと考えています。セキュリティにまつわるものなど、問答無用に作ってしまえばさらなる危険を呼び込むものもありえますし、そこで「初心者だから」という免責が通らないことも考えられます。\n\n上から目線過ぎてやばすぎ。。。何様って感じ。セキュリティの神様?プログラミングの神様?のつもりなんでしょうかね。。。","datePublished":"2024-09-06T01:44:43.418Z","dateModified":"2024-09-06T01:44:43.418Z"},{"@type":"Comment","text":"> 上から目線過ぎてやばすぎ。。。\n\nえっと、その状況でも「質問者の意図に沿って、危ない道を突き進むべきだ」というのでしょうか。そうでなければ、どのように回答するのがふさわしいと考えているかご提示いただけましたら幸いです。","datePublished":"2024-09-06T06:23:11.210Z","dateModified":"2024-09-06T06:23:11.210Z"},{"@type":"Comment","text":"> 上から目線過ぎてやばすぎ。。。何様って感じ。セキュリティの神様?プログラミングの神様?のつもりなんでしょうかね。。。\n\n上から目線過ぎてやばすぎ。。。何様って感じ。お客様は神様?のつもりなんでしょうかね。。。","datePublished":"2024-09-06T06:32:28.750Z","dateModified":"2024-09-06T06:32:28.750Z"}]},{"@type":"Answer","text":"アプリがバックグラウンドになった場合以外にも、通信環境の問題などで通信がサーバーに来ないことはありえるので、このあたりは想定した処理にすべきでしょう。\n\n定期的にクライアントとサーバーの状態が一致しているかチェックし、異なっていればサーバーのデータを元にクライアントにデータを同期、再レンダリングする処理をいれる必要があるのかなと思います。\n","dateModified":"2024-08-24T06:23:06.427Z","datePublished":"2024-08-24T06:23:06.427Z","upvoteCount":2,"url":"https://teratail.com/questions/c65yid36wdrn8x#reply-pg4ynfvd27t03h","comment":[]},{"@type":"Answer","text":"> setIntervalはバッグラウンドで停止する\n> つまりゲームの整合性に支障があると思いますが、\n\n単に、「それで整合しなくなる作り方が間違っている」だけではないでしょうか。","dateModified":"2024-08-24T01:04:28.338Z","datePublished":"2024-08-24T01:04:28.338Z","upvoteCount":4,"url":"https://teratail.com/questions/c65yid36wdrn8x#reply-4atd1of5h9cdxq","comment":[{"@type":"Comment","text":"ではバックグランドになってる状態でクライアントのDOMを監視する方法を提示いただけますでしょうか","datePublished":"2024-08-24T01:23:05.357Z","dateModified":"2024-08-24T01:23:05.357Z"},{"@type":"Comment","text":"代替案でもかまいません。\nやりたいことはDOMの監視です。外せません。","datePublished":"2024-08-24T01:24:04.878Z","dateModified":"2024-08-24T01:24:04.878Z"},{"@type":"Comment","text":"「それで整合しなくなる作り方が間違っている」\nあなたはオンラインゲームを作ったことはありますか?\nまさかそれもなく「それで整合しなくなる作り方が間違っている」と申しているのでしょうか","datePublished":"2024-08-24T01:27:47.536Z","dateModified":"2024-08-24T01:30:27.680Z"},{"@type":"Comment","text":"サーバー側のデータはクライアントに依存しない\n当たり前ですが、サーバー側のデータはしっかり整合しています。\nクライアントの描画に関してはサーバー側のデータうんぬんで片付けられない部分があります","datePublished":"2024-08-24T01:32:11.568Z","dateModified":"2024-08-24T01:35:22.923Z"},{"@type":"Comment","text":"setIntervalは使うべきではない\nならわかりますが\n「それで整合しなくなる作り方が間違っている」\nとはどういうことでしょう","datePublished":"2024-08-24T01:34:48.513Z","dateModified":"2024-08-24T01:34:48.513Z"},{"@type":"Comment","text":"まさか知りもしない分野に対して\n軽はずみに「それで整合しなくなる作り方が間違っている」\nなんて言い捨てておさらばする人間ではないですよね?","datePublished":"2024-08-24T01:52:59.338Z","dateModified":"2024-08-24T01:53:21.397Z"},{"@type":"Comment","text":"「それで整合しなくなる作り方が間違っている」\nこれを回答にする\n建設的でも何でもない、何のための回答なのか意味がわからない","datePublished":"2024-08-24T01:54:49.023Z","dateModified":"2024-08-24T01:54:49.023Z"},{"@type":"Comment","text":"30分程度、コメントの回答が無いと切れるというのでは、こういう非同期の質問サイトの利用は無理では?1-2日は普通です。1週間でも珍しくない。\nすぐ反応が来ないとイヤだというのなら、リアルタイムチャット等での質問サイトを探すしかないかと思います。あるのかどうか知りませんが。\n","datePublished":"2024-08-24T14:05:07.148Z","dateModified":"2024-08-24T14:05:07.148Z"},{"@type":"Comment","text":"> やりたいことはDOMの監視です。\n\nなんのために必要なのでしょうか。バックグラウンドにいるうちにはイベントも発生しませんし、サーバサイドのデータを正としてDOMには一方的に書き出せばいいだけで、結果としてのDOMを監視する必要性が把握できていないです。","datePublished":"2024-08-24T22:55:14.709Z","dateModified":"2024-08-24T23:06:03.174Z"},{"@type":"Comment","text":"DOMを監視する必要がなければタブ復帰やスリープからの復帰時にリアルタイムな描画できない=ゲームとしては成立できないってことです\n大丈夫ですか?","datePublished":"2024-08-25T00:01:13.204Z","dateModified":"2024-08-25T00:02:39.009Z"},{"@type":"Comment","text":">30分程度、コメントの回答が無いと切れるというのでは、こういう非同期の質問サイトの利用は無理では?1-2日は普通です。1週間でも珍しくない。\nすぐ反応が来ないとイヤだというのなら、リアルタイムチャット等での質問サイトを探すしかないかと思います。あるのかどうか知りませんが。\n\nで?だから?\nあなたに関係ない、そして答えと関係ない、意味不明な指摘だけする?\nその意味ってなんでしょう","datePublished":"2024-08-25T00:09:43.785Z","dateModified":"2024-08-25T00:09:43.785Z"},{"@type":"Comment","text":"通りすがりの私からすると過剰な連投です。\nそれだから、otnさんの意見が出ているのだろうと思います。\n\nまた「大丈夫ですか?」「ポンコツ」は言い過ぎではないかと思います。\n不適切な回答とはいえ、回答者を馬鹿にする行為は許されるものではありません。\n通報レベルの問題です。","datePublished":"2024-08-25T01:54:56.049Z","dateModified":"2024-08-25T01:57:45.060Z"},{"@type":"Comment","text":"あと、JavaScriptはあまり得意ではないですが、「再表示(など)をしたタイミングで実行されるコールバック関数で、setIntervalを再度実行し直せばいい」と思うのですが、どうなんですかね?","datePublished":"2024-08-25T02:13:07.754Z","dateModified":"2024-08-25T02:13:07.754Z"},{"@type":"Comment","text":"> DOMを監視する必要がなければタブ復帰やスリープからの復帰時にリアルタイムな描画できない=ゲームとしては成立できないってことです\n\n単に、描画直前のタイミングをrequestAnimationFrameで拾う、で問題ないのではないでしょうか。バックグラウンドに居続ける間に監視する必要はなくなります。","datePublished":"2024-08-25T13:42:05.779Z","dateModified":"2024-08-25T13:51:18.420Z"},{"@type":"Comment","text":"> 建設的でも何でもない、何のための回答なのか意味がわからない\n\n伝わりにくかったのかもしれませんが、「もっと手前へ戻って必要性を見直してください」、という意味合いの回答です。初期の質問では情報が少なすぎてなんのために監視したいかすら自明ではなかったので、掘り返して初めて意味のある回答が可能となりました。","datePublished":"2024-08-25T13:47:31.412Z","dateModified":"2024-08-25T13:47:31.412Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://teratail.com","name":"トップ"}},{"@type":"ListItem","position":2,"item":{"@id":"https://teratail.com/tags/JavaScript","name":"JavaScriptに関する質問"}},{"@type":"ListItem","position":3,"item":{"@id":"https://teratail.com/questions/c65yid36wdrn8x","name":"setIntervalがバックグラウンドで停止するとオンラインゲームが成り立たない気がするが違うか?"}}]}}}
別タブを見ていたりスリープ画面になった場合に
setIntervalはバッグラウンドで停止する
 
単に、「それで整合しなくなる作り方が間違っている」だけではないでしょうか。
JavaScriptでちょっとした自作のゲームを作ったことがあるので、その経験から、ghjuirrt2さんの質問の意図を下記のように推測しました。
例えば秒速2ピクセルでキャラクターが移動するとして(ここでsetIntervalやrequestAnimationFrameを使い、要素のstyle.topやstyle.leftに座標の数値を代入する)、そのキャラクターが描画されているタブがアクティブであれば、10秒後には20ピクセル移動しているのに対し、そのタブが非アクティブの場合には、10秒後にタブをアクティブにしても20ピクセル先に移動していない。
であれば、setIntervalやrequestAnimationFrameを使うのはいいのですが、時間の経過を、第二引数で指定した時間に依存しないようにする必要があります。
先に良くない例を示します。
JavaScript
1 ( function   ( )   { 
 2      let  x  =   0 ; 
 3      setInterval ( function   move ( )   { 
 4         character . style . left   =  x  +   "px" ; 
 5         x  +=   2 ; 
 6          heavyFunction ( ) ; 
 7      } ,   1000 ) ; 
 8 } ) ( ) ; 
上記のようなコードでは10秒後に20ピクセル移動していることが保証されません。heavyFunctionが処理に時間がかかる関数である場合、次にmove関数が実行されるのが2秒後、3秒後になることもあるからです。第二引数に1000と指定して保証されるのは1秒以上経過してから実行することのみです。
次に、時間の経過を、第二引数で指定した時間に依存しないようにした例を示します。
JavaScript
1 ( function   ( )   { 
 2      let  startTime  =   new   Date ( ) . getTime ( ) ; 
 3      setInterval ( function   move ( )   { 
 4          let  x  =   Math . floor ( ( new   Date ( ) . getTime ( )   -  startTime )   /   1000 )   *   2 
 5         character . style . left   =  x  +   "px" ; 
 6          heavyFunction ( ) ; 
 7      } ,   1000 ) ; 
 8 } ) ( ) ; 
上記の例では、move関数の中で改めてnew Date().getTime() - startTimeによって経過時間を計算し、経過時間に基づいた移動量を求めたうえでleftプロパティに代入しているため、heavyFunctionで時間がかかったとしても、途中の描画が省略されるだけで、経過時間に対する移動量は保証されます。
後は必要に応じてサーバーが保持している座標とずれがないか確認する処理や、サーバーが保持している座標の情報を更新する処理を入れることになります。
DOMという言葉が出てきたのでstyle.leftを使って説明しましたが、canvasで描画する場合でも基本的な考え方は同じです。
アプリがバックグラウンドになった場合以外にも、通信環境の問題などで通信がサーバーに来ないことはありえるので、このあたりは想定した処理にすべきでしょう。
定期的にクライアントとサーバーの状態が一致しているかチェックし、異なっていればサーバーのデータを元にクライアントにデータを同期、再レンダリングする処理をいれる必要があるのかなと思います。
もしかしたら質問自体がなにか誤解を産むような内容だったりしませんか?
個人的に思ったのはゲームなんて電源切ったら終わるのは当然だし、プロセスが終了して処理を続行できなかったら負けってことに当然なるのでは?と思いました。
多分そういうことを聞きたい訳じゃないとは思うのですが、こういう風にしか読解出来なかったです。
うーん。ほかの意図としてはjsでタブのライフサイクルを取得できないか?みたいな意図だったりするんでしょうか。
スマホとかだと、アプリを開いた時と閉じた時にイベントが発生するのでそのタイミングでログインログアウトみたいなことができ、MMOみたいな?ずっとログインし続ける系のゲーム(オートセーブ的な?よくしらんが)とかも上手く制御できるかと思いますが。そういう話?
ほかの回答で「作り方が間違ってる」というのがありますが、これは決め付けでしかないし、回答として意味を成してない(作ってる本人はそれがミスかどうかなど分かるはずがない)ので、通報でもして溜飲を下げるのがいいと思います。
[香車]東上☆Aho(英帆)☆海美は、複数のゲームを立ち上げた状態で、生配信したことがある「
別タブを見ていたりスリープ画面になった場合に setInterval はバッグラウンドで停止する。
』というのが、理解できないので『
単に、「それで整合しなくなる作り方が間違っている」だけではないでしょうか。
』に同意します。
質問者さんの意図がわからないところを回答すると喧嘩腰なので回答しづらいですが、たとえばwindowをblurしたらオーバーレイしてユーザーに処理を隠すとかやり方次第では?
html
1 < style > 
 2 #overlay { 
 3 outline : none ; 
 4 border : solid  0 px ; 
 5 background-Color : lightgray ; 
 6 } 
 7 #overlay ::backdrop { 
 8 background-Color : lightgray ; 
 9 
10 } 
 11 </ style > 
 12 < script > 
 13 window . addEventListener ( 'blur' , ( ) => { 
 14   overlay . showModal ( ) ; 
 15   overlay . addEventListener ( 'click' , ( ) => { 
 16     overlay . close ( ) ; 
 17    } ) ; 
 18 } ) ; 
 19 </ script > 
 20 < dialog   id = " overlay " > 
 21 フォーカスが外れました。クリックしてください
22 </ dialog > 
15分調べてもわからないことは
ただいまの回答率
質問をまとめることで
テンプレート機能で
質問する