VK向けのゲヌムを䜜成䞭に遭遇した6぀の興味深いバグ

画像

私はゲヌムを䜜るのが奜きです、これは私の趣味です。 合蚈で、私は自由時間で玄1幎、VKontakteのJavaScriptでゲヌムを䜜成したした。 珟圚、ゲヌムは完成し、発売され、VKontakteによっお管理され、ゲヌムカタログで入手できたす。 これは、「ゲヌムの䜜り方」のような蚘事ではなく、䜜成䞭に遭遇した問題に関するストヌリヌです。 この情報がプロゞェクトの困難な状況を回避するのに圹立぀こずを願っおいたす。 前もっおいく぀かのバグを知っおいたなら、それははるかに簡単だったでしょうし、おそらくコヌドに関しお他の決定をしたでしょう。 詳现に぀いおは、katぞようこそ。

゚ントリヌ


バグの本質をより明確にするために、ゲヌムに぀いお簡単に説明したす。 ゲヌムは䞭囜のパズル「 タングラム 」に基づいおおり、その意味は、いく぀かの単玔な圢状からより耇雑な圢状を収集する必芁があるずいうこずです。 叀兞的なタングラムでは7぀の暙準数字を䜿甚したすが、私のゲヌムでは、この原則を任意の数ず皮類の数字に䞀般化するこずにしたした。

画像

最初は、グラフィック゚ンゞンずしおpixi.jsを䜿甚したした。 その埌、いく぀かの理由で、私はそれを攟棄し、すべおをキャンバスに描くこずにしたした。 これは議論の䜙地のある決定であり、説明されおいるバグの䞀郚はたさにそれから生じたものです。 䞀方、pixiを䜿えば、他にも驚きがありたす。

バグに移る前に、さらにいく぀かのポむントがありたす。

たず、タむトルに「バグ」ずいう蚀葉を䜿甚したしたが、以䞋に説明する状況の䞀郚はバグではありたせん。 この機胜、たたはゲヌム/ブラりザの正しいが、非論理的たたは非暙準の動䜜ですらありたす。 たたは私が遭遇した困難。

第二に、プロゞェクトのサむズはそれほど倧きくありたせんが、もちろん、䜜成する際により倚くの間違いがありたした。 すべおを説明するのは意味がありたせん。 たれな状況、耇雑な状況、たたは興味深い状況を蚘憶したした。 たた、これらすべおのバグは、流onなグヌグルで、そしおおそらくは思慮深いグヌグルで、それらに関するかなりの情報があるずいう事実によっお結合されおいたす。 したがっお、ここでそれらを説明するこずは有甚だず思いたす。

第䞉に、いく぀かのバグを修正しおいたせん。 どうすればいいのか、それがたったく可胜かどうかわからないからです。 私はただそれらに぀いお曞く必芁があるず思うので、同様の開発者が盎面しおいる他の開発者は、圌らが䞀人ではないこずを知り、少なくずもいく぀かの反省のための資料を受け取っおいたす。 誰かが回埩䞍胜な問題を修正する方法を知っおいれば、私はコメントで答えを聞いおうれしいです。

この時点で、長匕く導入は終了し、本質に戻りたす。

1番 党画面モヌドfullscreen apiで螊る。


そしお、フルスクリヌンモヌドのサポヌトが導入されおから1幎以䞊が経ちたしたが、ただそこにありたす。 むンタヌネットずHabréの䞡方に倚くの蚘事がありたす 。たずえばここにありたす 。 しかし、以前ず同様に、すべおのブラりザヌは独自の方法ですべおを実行したす。

ブラりザの数たあ、たたぱンゞンの数、フルスクリヌンAPIのメ゜ッドの名前のオプションが倚いように芋えたす。

プレフィックス自䜓が玛らわしいだけではありたせんmoz、webkit。 IE11は、msずMSの2぀のプレフィックスを䜿甚したす。 䞀郚のブラりザは、フルスクリヌンの䞀郚であるフルスクリヌンhello firefoxを䜿甚したす。 フルスクリヌン倉曎むベントは、倧文字なしで蚘述されたすfullscreenchangeもちろん、プレフィックス付き。 しかし、IE11では、EdgeでMSFullscreenChangeず蚘述されおいたす-fullscreenChange。

たた、ブラりザの䞀郚は党画面芁玠を画面の䞭倮に配眮し、䞀郚はそれがあった同じ䜍眮に残したす。

フルスクリヌンモヌドをオンたたはオフにするのは簡単なこずのように思えたす。 その結果、これはすべお、目的のブラりザでの目的のメ゜ッドの名前の怜玢ず長いテストに倉わりたす。

興味のある方は、 CodePenの結果をご芧ください 。 クロム、ダンデックス、オペラ、Firefox、IE11でチェックむン。 残念ながら、私はサファリず゚ッゞをチェックむンする方法がありたせん。誰かがこれを行うこずができれば、コメントを賌読解陀したす。

2番 消える圱context.shadowBlur。


図圢にカヌ゜ルを合わせるず、圱が远加されお匷調衚瀺されたす。 ぀たり、通垞の画像に次の圱を远加したす。

context.shadowBlur = 5 context.shadowColor = “#000” 

すべおの圢状で、これは通垞の長方圢を陀き正垞に機胜したす。 圌の圱は珟れたせん。

長い間、私はそれが難しくないこずを考慮しお、このバグによる分解を埌たで延期したした。 真剣に考える時が来たずき、すべおがそれほど単玔ではないこずが刀明したした。

長時間の怜玢、さたざたなオプションの詊甚、そしお結果ずしお、私はこれだけを芋぀けたした


すべおの数字は同じコヌドで画面に衚瀺されたす。぀たり、コヌドに問題はありたせん。 䞀方、ゲヌムコヌド以倖ではこのバグを再珟するこずはできたせん。぀たり、問題はコヌドにありたす。

率盎に蚀っお、私はこのバグを突き止めるこずに非垞にうんざりしおおり、結果は次のずおりです。䜕が原因であるかわかりたせん。 修正方法がわかりたせん。

しかし、束葉杖の䜜り方ず修正方法は知っおいたす。 私がしたこず。 グラフィック゚ディタヌで四角圢の画像を開き、1ピクセルを遞択しコヌナヌで、そうは思わない、透明床を255ではなく254にしたした。その結果、画像は元の画像ず倖芋䞊区別できたせんが、圱、぀たりがかしは魔法です画像が衚瀺されたす。 そしお、私がこれをどのように思い぀いたのか聞かないでください。

番号3。 音声デコヌドのバグdecodeAudioData


ゲヌムでサりンドを再生するには、AudioContextを䜿甚したす。 サりンドはXMLHttpRequestを介しお読み蟌たれ、decodeAudioData関数を䜿甚しおデコヌドされたす。 すべおが正垞です。

しばらくしお、私は叀いラップトップでゲヌムをテストするこずを匕き受けたした。それはただXPがあり、それに応じお叀いバヌゞョンのChromeがありたす。 ここで、次の圢匏の゚ラヌが発生したしたキャッチされない玄束DOMExceptionオヌディオデヌタをデコヌドできたせん。 yandexブラりザでも同じ゚ラヌが発生したす。

画像

このバグで最も興味深いのは、事前に予枬できなかったこずです。 存圚を確認するだけで、オヌディオコンテキストのサポヌトを確認できたす window.hasOwnProperty("AudioContext") 。 しかし、デコヌドを詊みるこずを陀いお、サりンドをデコヌドできるかどうかを確認する方法は

try-catchコンストラクトも圹に立ちたせん。 ゚ラヌはjsスクリプトではなくブラりザのコヌドで発生するため、単に䟋倖をスロヌしおスクリプトを停止したす。

1぀のチャネルでwavファむルをデコヌドしようずするず゚ラヌが発生するこずが刀明したした。 ファむルを2チャンネルに倉換するか、mp3に曞き蟌むず、バグは消えたす。

クロムの最近のバヌゞョンでは、このバグはありたせん。

番号4。 アンロヌドおよびデヌタストレヌゞの前。


beforeunloadむベントハンドラヌでゲヌムを終了するず、サヌバヌにリク゚ストを送信しお、最埌のオヌプンレベルを保存したす。

箄50のケヌスで、おそらくもっず頻繁に、デヌタは保存されたせんでした。 ブラりザがbeforeunloadむベントを凊理するのにどれくらいの時間を費やし、サヌバヌがリク゚ストを凊理するのにどれくらいの時間を費やしたかを考えるず、これがポむントではないこずに気付きたした。 答えは既にわかっおいれば簡単でした。 非同期ではなく、同期サヌバヌ芁求を䜿甚する必芁がありたす。

すべお同じ、驚くべきこず-矀れの本胜、たたは習慣ず信念の力。 マニュアルずガむドに曞かれおいたす同期リク゚ストを䜿甚しないでください 非同期リク゚ストを䜿甚しおください そしお、ほずんどの堎合、そのたたです。

さお、同期芁求を䜿甚できるそしおすべきですたさにここです この堎合、アンロヌドが埅機する前にスクリプトの実行が䞀時停止され、結果が返されないため、デヌタを保存する時間がありたす。

PS最終的には、各レベルの埌に保存したので、より信頌性が高くなりたした。

5番 キャンバス+テキスト+ Firefox


ダモリ゚ンゞンのかなり叀いバグです。これは事前には知りたせんでしたが、無駄でした。 firefoxのキャンバスにテキストが衚瀺される堎合、テキストは他のブラりザヌ゚ンゞンよりも数ピクセル高く衚瀺されたす。 これは、 context.textBaseline = "top"プロパティを䜿甚する堎合に特に顕著です。 芖芚的には、次のようになりたす。

画像

オフセットはフォントサむズ、぀たり 同じではありたせん。 context.textBaselineの他の倀を䜿甚する堎合、オフセットは小さくなりたすが、目で芋おもただわかりたす。フォントサむズが20ピクセル以䞋のピクセルです。

このバグの議論はここで芋぀けるこずができたす 。

私が詊したもの


その結果、圌はこの問題を「真正面から」解決したした。圌はブラりザ゚ンゞンを決定し、必芁に応じお、個々の碑文ごずに必芁な距離だけ手動でテキストをシフトしたした。 奇劙なこずではなく、最も簡単な方法でした。

No. 6。 フラッシュマりスアりト


このバグに぀いお曞くべきかどうか考えたした それを捕たえるのは非垞に難しいです、私にはそれが私に思われたかどうかさえ疑いたした。 しかし、私が非垞に積極的に䜿甚しおいるvivaldiブラりザヌでは、バグは安定しお怜出されたす。 たた、クロムで圌を捕たえるこずができたしたしかし、それは確かではありたせん。 Firefoxおよびオペラでは、バグを取埗するこずはできたせんでしたが、うたく機胜しなかった可胜性がありたす。

だから、それはすべお、ゲヌム内のボタンを数回連続しおクリックするず、マりスを動かさないず、カヌ゜ルがデフォルトに蚭定されるこずに気づいたずいう事実から始たりたした。 ボタンから出おくるかのように。 さたざたなオプションをテストした埌、mouseoutむベントが突然発生するため、バグが発生するこずが刀明したした。

ここでこのバグがあるかどうかをテストできたす 。

繰り返したすが、バグは倚かれ少なかれ自信を持っおビバルディ5〜30回のクリック埌で、クロムでは確実にキャッチされたす。 他のブラりザでは、バグをキャッチできたせんでした。

テストの本質ペンを開き、コン゜ヌルF12を開き、碑文のある段萜の䞊にマりスを移動し、動かさないように泚意しおマりスを順番にクリックし始めたす。 コン゜ヌルメッセヌゞを远跡したす。 䞀定回数クリックするず、碑文が点滅したす。 mouseoutむベントが発生したした。 mouseoutむベントが発生し、マりスカヌ゜ルがデフォルトに倉曎された埌、mouseoverむベントが再び発生し、カヌ゜ルがポむンタに倉曎された埌、マりスのわずかな動きで十分な効果を埗るこずができたす。

mouseenter / mouseleaveむベントを䜿甚しようずしたした。 ファむルをロヌカルでテストしたす。 クリック遞択をオフにしたす。 結果のプラスたたはマむナスは同じです。

私はそれが䜕であり、なぜそうなのかわかりたせん。 特定のブラりザのバグしか想定できたせん。 ゲヌムでは、これに぀いお䜕もしたせんでした。䞀般に、連続しお䜕床も抌すこずができるたたは必芁なボタンがないためです。 はい、そしおこのバグで䜕ができるのか、正盎に思い぀きたせんでした。

もう少し


圌はタむトルに6番を瀺したしたが、いく぀かの面癜い間違いを思い出したした。 それらに぀いお簡単に説明するず、倚くのこずは曞くべきものではないようです。

context.drawImageメ゜ッドは、異なる数の匕数で呌び出すこずができるこずが知られおいたす。 特に、゜ヌスからコピヌしおコンテキストに描画する領域のサむズを指定できたす。 したがっお、クロムではサむズ0x0の領域を描画できたすが、firefoxぱラヌを出したす-間違ったサむズでscられたす。

ビュヌコヌドの奇劙なバグ

 bounds = { left: 0 right: GAME_WIDTH top: 0 bottom: GAME_HEIGHT } 

すべおがうたくいくように芋えたすが、䜕らかの理由で、コヌドのさらにbounds.topは0ではなく、1e-14のようなもので、もちろんれロに非垞に近いが、それでも0ではありたせん。そしお、以䞋のコヌドをれロず比范するず、結果はすでに異なりたす。
ここには2぀の奇劙な点がありたす。 たず、このバグはrequire.jsを䜿甚しおコヌドを単䞀のファむルにビルドした埌にのみ発生したす。 コヌドは異なるモゞュヌル-ファむルにありたすが、そのような動䜜に気付きたせんでした。 第二に、䜕らかの理由で、そのような奇劙さは倀topでのみ発生したすが、bounds.leftは䟝然ずしお厳密にれロです。

よろしくお願いしたす


それだけです、他に䜕も芚えおいたせんでした。 誰かが䜜業の結果を確認し、評䟡しおテストしたい堎合は、 こちらにアクセスしおください 。

ご枅聎ありがずうございたした。この情報が圹に立぀こずを願っおいたす

Source: https://habr.com/ru/post/J350832/


All Articles