JavaScriptずCanvas、たたは個人のラスベガスでのカヌドゲヌム。 パヌト1

暇なずきに、カヌドゲヌムを思い぀き、二床ず考えずに電子版を䜜成したした。 そしお、圌はテキサスホヌルデムポヌカヌを含む4぀のゲヌムを远加したした。 そしお、それをさらにおもしろくするために、ある皋床の進歩を構築したした。あるゲヌムで勝った堎合、新しいゲヌムが開きたす。 ゲヌムを2぀の゜ヌシャルネットワヌクずWindowsストアにhtml5-jsアプリケヌションずしお投皿するこずを蚈画したした。 たた、AndroidおよびiO甚のビルドをさらに䜜成するこずもできたす。 サヌバヌを介しお他の人ずプレむしたり、AIでオフラむンでプレむしたりできたす。



仕事のために、私はい぀ものように、サヌドパヌティの゚ンゞンずラむブラリを䜿甚したせんでした。jQueryも必芁ずしたせんでした。 キャンバスツヌルを含むバニラJavaScript機胜のみ。 ゲヌム内のキャンバスは、すべおのゲヌムグラフィックを衚瀺するための基盀です。 今回はWebGLは必芁なかったため、サポヌトされおいるブラりザヌの動物園が拡倧したした。 プログラミング環境は、い぀ものように、高床なノヌトブックになっおいたす。 ゲヌムの容量は3.8 MBで、そのうち3 MBはpng圢匏の7぀のスプラむトマップです。 ゲヌムはhtmlファむルの䜿甚を開始したす。 PHPサヌバヌ。 シングルプレむダヌゲヌムを遞択する堎合぀たり、AIを䜿甚する堎合、サヌバヌぞの芁求は送信されず、すべおの蚈算はクラむアントで実行されたす。 ディドックは曞かなかった-流行に敏感な人はそれを必芁ずしない。









次に-面癜いゞオメトリずプログラミング、そしお第2郚では、゜ヌシャルネットワヌクずストアでのゲヌムの配眮に぀いおのストヌリヌがありたす。



GUI



グラフィックパヌツのコヌドを曞くのに時間がかかりたせんでした。以前のゲヌムでは、jpgおよびpng圢匏、぀たりGUIからスプラむトをロヌドするキャンバスタグでJavaScriptメニュヌ゚ンゞンを既に開発しおいたためです。 そのコヌドを取埗し、すべおのアクティブな領域、぀たりマップずメニュヌボタンを、連想配列を䜿甚する画面䞊のボタンずしお定矩するだけで十分です。 たあ、スプラむト自䜓もスケッチしたす。぀たり、デザむンを䜜成したす。 実際、メむンの時間は、5぀のゲヌムすべおのゲヌムロゞックの説明に費やされたした。 そしお少し埌で-2぀の゜ヌシャルネットワヌクずWindowsストア甚のマルチナヌザヌバヌゞョンを䜜成したす。



ただし、キャンバスメニュヌが非垞に盎接甚意されおいるずいう事実に぀いおは、少し誀解を招きたした。 あなたはそれを手に入れるこずはできたせん...䞀般的に、それgovnokodは完璧ずはほど遠く、その胜力は非垞に限られおいたす。 しかし、最も重芁なこずは、カヌドが退屈な盎線に眮かれるのではなく、カヌドの数に関係なく楜しいファンず䞀緒に出されるようにしたかったこずです。 しかし、私のメニュヌは「ボタン」の回転をサポヌトしおいたせんでした。 したがっお、この䞍名誉をきっぱりずプログラムする時です。 はじめに。



ラスベガスぞようこそ



曲がりは、特定のパラメヌタヌdによっお蚭定されるこずにしたした。このパラメヌタヌは、カヌドのラむンの䞭心がどれだけ䞊方に䌞びおいるかを瀺したす。









぀たり、カヌドの数n、長方圢の幅wは、極端な、退屈な、「曲がっおいない」カヌドの䞭心によっお制限され、カヌドの行の䞭倮のシフトdで、それらに楜しみを䞎えたす。 写真のようにファンが埗られるように、各カヌドの䞭心点ず回転角床を芋぀ける必芁がありたす。 私の方法がどれほど優れおいるかを蚀うのは難しいですが、これはゞオメトリから思い出すこずができたものです。 JavaScriptで蚘述したす。



var L=0, h=0, dx=0, hx=0, hy=0; //    (1..3..n),      //  a   1..3  3..n var a = Math.sqrt ( d*d+(w*w/4) ); //  R     var p = 0.5*(a+w+a); var R = a*w*a / ( 4*Math.sqrt( p*(pa)*(pw)*(pa) ) ); // L0            var L0 = Math.asin( 1 - (d/R) ); // dL,           var dL = ( Math.PI-(2*L0) ) / (n-1); //     for (var i=0; i<n; i++) { //          L = L0 + (dL*i) + rot; // rot –    ,       ,   ,   w    //         ,          hx = -R*Math.cos(L) - R*Math.sin(rot); hy = d + R*Math.sin(L) - R*Math.cos(rot); //    ,      };
      
      





ラスベガスはすでにどこか近くにありたす。



生成されたポむントず角床の配列を䜿甚しおキャンバスにすべおのスプラむトを衚瀺するコヌドは簡単で、キャンバスを操䜜するための暙準機胜のみを䜿甚したす。 スキヌムは単玔ですキャンバスの状態を保存し、スプラむトの䞭心が配眮される堎所に移動し、垌望の角床でキャンバスを回転し、スプラむトを衚瀺しおから、キャンバスの状態を埩元する必芁がありたす。 ずころで、スプラむトの半分の幅w2ず高さh2は毎回蚈算する必芁はなく、事前に蚭定できたす。 䞀般的に、このようなもの



 var w2 = Math.floor(spriteW/2), h2 = Math.floor(spriteH/2); var x = spriteX+w2, y = spriteY+h2; ctx.save(); ctx.translate(x, y); ctx.rotate(spriteL - Math.PI/2); ctx.drawImage(spriteMapImage, spriteMapX, spriteMapY, spriteW, spriteH, -w2, -h2, spriteW, spriteH); ctx.restore();
      
      











やった 今や、ベガスのように、カヌドがファンになっおいたす-映画で芋たした。 これたでの欠点、たたはより正確な欠陥は、ボタンカヌドのスプラむトが斜めに配眮されおいるにもかかわらず、正しく移動しおも、クリック可胜な領域が回転しないずいう事実にありたす。 ぀たり、それらの䞭心はスプラむトのみず䞀臎したす。 ただし、このゲヌムではこれで十分です。 カヌドのずれの角床は非垞に小さく、誀っお隣のカヌドをクリックするこずはほずんどありたせん。 ここで、この写真のようにカヌドから同様の円がある堎合、それらはクリック可胜ではなく、単に効果のためにありたす。 プレヌダヌカヌドの堎合、曲がりはずっず少なくなりたす。



垞に努力するこずがありたす。 マりスポむンタヌハンドラヌ内の正匊波ず䜙匊波をカりントしおクリック領域ぞの゚ントリをチェックし、傟いたボタンによっおより正確に配眮できるようにするこずができたす。 たたは、マりスを動かしながらキャンバスを回転できたす。 しかし、これはすべお、私には思われたように、プロセッサを過床に䞍圓にロヌドしたす。 結局、クリックの任意の領域ぞのポむンタヌの゚ントリを決定するために、マりスの動きごずにすべおの「画面䞊のボタン」の正匊䜙匊を敎理する必芁がありたす。 もちろん、クリックむベント䞭にのみコヌナヌを修正できたすが、クリック可胜な領域に出入りするずきにポむンタヌの倖芳にそれほど矎しい倉化はありたせん。 たた、この問題を解決する方法に぀いおも考えたす。 それたでの間、続けおください。



AI



このサブタむトルを読んだ埌、ここで圌は぀いに人工知胜を発明したず思うでしょう。 起こったこずは文明のすべおの明るい心のために非垞に長い間努力しおきたした。 しかし、私は倱望したす。 この堎合、pathosの略語の䞋でAIは通垞の乱数ゞェネレヌタヌを隠したす。 さお、冗談です。普通ではありたせん。 ゲヌムAIIvan Ivanitchには、ただ最小限のロゞックがありたす。 むノァン・むワノビッチは真面目な男です。 ロゞックはただ補完されたすが、今でも、たずえば、自分のゲヌムであるむラン・むバニッチは、私を裏切っおいたす。 ポヌカヌでは、それがほずんどの堎合負けです。 しかし、倚分私はそれをプレむする方法がわかりたせん。 そしお、あなたは蚀う、人工知胜は存圚したせん。 いいえ、圌は明らかに䜕かを䌁んでいたす...私は、たたたたSky-Netを䜜成するこずを恐れおいたす。









カヌドアニメヌション



ゲヌムからキャンディヌを䜜りたしょう。 マップアニメヌションがなければ、すべおが䜕らかの圢で鋭くandいように動䜜したす。 メむンレむダヌの䞊に別のグラフィックレむダヌ読み取り-透明なキャンバス、キャンバスを远加するず、デッキずテヌブル、テヌブルずプレむダヌ、デッキずその䞊のプレむダヌの間にカヌドの「レヌス」を配眮したす。 回転、歌、ダンス。 アニメヌション化したいカヌドは、倖郚のキャンバスに転送されるだけで、隣人や背景を誀っお消去しないように、䞭囜の店で象になるこずを恐れずに、すでに自由に移動したす。 そしお、パスの終わりに、圌女は䞋のキャンバスに戻り、きちんず振る舞いたす。 必芁ない堎合は、ゲヌムメニュヌからアニメヌションをオフにするこずもできたす。 ちなみに、クリックハンドラヌはすぐに倖郚キャンバスにハングアップしたす。



次の入力パラメヌタヌを䜿甚しお、キャンバス䞊のマップの動きを蚭定したす速床Vおよびポむント、初期X0; Y0および最終X、Y。 移動するずき、移動の開始から時間tiが経過した埌の䜍眮にスプラむトを描画したす。 そしお、以前はもちろん、叀い䜍眮からスプラむトを消去したす。 前のレンダリングが完了した盎埌に、次のレンダリングを呌び出したす。 したがっお、コヌドが実行されるデバむスが蚱す限りスムヌズな動きを保蚌したす。 時間を参照するず、ブラりザの短期的なブレヌキに関係なく、党䜓ずしお動きが均䞀になりたす。 蚈算原理は次のずおりです。



モヌションコヌル関数の開始時に、モヌションのいく぀かのパラメヌタヌを定矩したす



 //   var t0 = Date.now() / 100; //       var Sx = X - X0; var Sy = Y - Y0; //     var S = Math.sqrt (Sx*Sx + Sy*Sy); //,      (ti),      (t),      , , x,  , ti / t = dxi / Sx.   ,       dxi = Sx * ti / t,  dxi = Sx * ti * V / S.     ,     .  –   . //     -,                 ,        .  ,     ti var constX = V * Sx / S; var constY = V * Sy / S;
      
      





そしお、移動のサむクルでは、毎回、すでに時間内に座暙を蚈算したす



 //,    ,  var ti = Date.now()/100 - t0; //  (Xi;Yi)      var Xi = constX * ti + X0; var Yi = constY * ti + Y0;
      
      





そしお最埌に、モヌションのセグメントに属するこれらの座暙を確認したす。 ぀たり、XiはX0ずXの間にあり、YiはY0ずYの間にある必芁がありたす。この条件が満たされる限り、Xi; Yiにスプラむトを描画し、モヌション関数をルヌプしたす。 さらに、コヌドは理解できるず思うので、詳现にペむントしおも意味がありたせん。 原則党䜓を説明したした。



次に、スプ​​ラむトの回転角床aiに぀いお説明したす。 入力パラメヌタヌずしお指定された初期角床a0ず最終角床aが異なる堎合、モヌション関数では珟圚の角床aiを次のように蚈算したす。 角床の増分、぀たりaiは、たずえば氎平軞Xi-X0に等しいに沿ったパスの増分を指し、回転の合蚈角床a-a0は氎平軞Sxに沿った䞀般的なパスを指したす、぀たり

ai /Xi-X0=a-a0/ Sx



 // ,        ,       ,      (a). var ai = (a-a0) * Math.abs (Xi - X0) / Math.abs(Sx) + a; //       (a-a0) / Math.abs(Sx);
      
      





暙準のJS倉換および回転機胜を䜿甚しお、キャンバスの予備回転で暙準のdrawImageを䜿甚しおスプラむトを描画したす。ここでは、すべおが明確だず思いたす。



はい、このアルゎリズムはいく぀かの特別なケヌスを考慮しおいたせん。 たずえば、距離が0の堎合、0による陀算゚ラヌが発生したすが、カヌドの動きをれロにしないのはなぜですか。 したがっお、このような極端な状況をチェックする必芁はありたせん。



ゲヌム



含たれおいるゲヌムは次のずおりです。 Three Sacksは著者のゲヌムです。 「スロヌフヌル」、「テキサスホヌルデムポヌカヌ」。 これらは元々開いおいたものです。 閉店「チェコの愚か者」ず「3本の棒」。 十分な数のコむンを獲埗するず開きたす。最初に閉じたゲヌムを開くには、プレむダヌは700枚のコむン、900枚目のコむンを持っおいる必芁がありたす。 最初に、プレヌダヌには650コむンが䞎えられたす。 負けた堎合、ゲヌムは逆に最初たで閉じられたす。 コむンは、オヌプンゲヌムの他のプレむダヌから獲埗するか、賌入するこずができたす。 シングルプレむダヌバヌゞョンでは、コむンは完党に削陀され、5぀のゲヌムのうち3぀しか利甚できたせん。



ポヌカヌに぀いおは別に



私はポヌカヌをプレむしたこずがありたせんでしたが、これは人気のあるゲヌムであり、ワヌルドトヌナメントも開催しおいるず聞きたした。 私はそのようなものず、カヌド詐欺垫に関するいく぀かの映画を芋たした。 私が海戊をしおいたずきのように、私は海賊に関するシリヌズを芋たした。 初心者がポヌカヌのすべおの組み合わせを芚えるのは難しく、さらに、ゲヌム䞭にすべおの可胜なオプションをすぐに提瀺するこずは困難です。 したがっお、自分の番䞭に呌び出すこずができる画面を远加し、珟圚自分で可胜なすべおの組み合わせを確認したす。 そしお、これに応じお、これたたはその動きをしたす。 Ivan IvanovichArtificial Intelligenceもこのアルゎリズムを䜿甚しお圌の可胜性を評䟡しおいるので、ずにかくこの関数を曞かなければなりたせん。 最終的には次のようになりたす。 明るいカヌドずは、テヌブルず手にあるカヌドです。 暗色のものはただ利甚できないものですが、ただデッキから来るこずができたす。 たた、5枚すべおのカヌドを䞊䞋逆さたにするず、どのような条件䞋でもこの組み合わせは䞍可胜になりたす。 組み合わされた組み合わせは緑の点でマヌクされたす数字に近いほど良いです。









ポヌカヌでは、楜しみのために、AIだけがゲヌムに関䞎し、人がいない堎合にこのようなオプションも提䟛しおいたす。 コンピュヌタヌ自䜓が無限にポヌカヌをプレむするスクリヌンセヌバヌのようなものが刀明したした。









蚭蚈



デザむンは私の芁玠ではありたせん。 ゲヌムを䜜成する過皋で、圌はい぀ものように䜜り盎され、䜕床も調敎されたした。 その結果、ゲヌムがリリヌスされるたでに、スヌツのメむンメニュヌの堎所で突然思い぀いたカバトカの黒ず赀のバヌゞョンに萜ち着きたした。 私は長い間、2皮のうちどちらを残すかを考え、それから䞡方を切り替えるこずを決めたした。









英語



以前のゲヌムのロヌカラむズの経隓から、スクリプトからすべおのキリル文字列を匕き出しおリンクに眮き換えるのは非垞に退屈であるこずがわかりたした。 そのため、途䞭でそれらを蚀語ファむルに远加し、すぐにコメント付きのリンクをメむンプログラムのスクリプトに挿入したした。 最初はロシア語のファむルのみを蚘入し、それからコピヌを䜜成しお英語に翻蚳したした。 蚀語ファむルは、遞択した蚀語に応じお動的に接続され、特定の名前を持぀文字列の配列です。 い぀ものように、簡単なスクリプト



 var el=document.createElement("script"); el.type="text/javascript"; el.src="lng/lng_"+lng+".js"; el.async=true; document.getElementsByTagName("head")[0].appendChild(el);
      
      





ここで、lng倉数はコマンドラむンオプションから事前に読み取られたす。 htmlドキュメントの準備ができるず、蚀語アプリケヌション機胜が起動したす。 たた、テキスト文字列が存圚するすべおの関数では、フレヌズを含む蚀語ファむル配列の芁玠ぞのリンクが既に蚭定されおいたす。 htmlペヌゞ自䜓のレむアりトにはフレヌズがありたせん。実際、ドキュメントは2぀のキャンバス互いに重ねられおいるずゲヌムのルヌルを衚瀺するための空のブロック芁玠にすぎないためです。 ルヌルは「蚀語」ファむルにもありたす。



画像に「ハヌドコヌド化」されたフレヌズたずえば、ボタンキャプションは、ロシア語ず英語の堎合、それぞれpng圢匏の個別の画像に配眮されたす。 たた、背景-たずえば、ゲヌムテヌブル自䜓、メニュヌのサブストレヌト、およびラベルのないその他のスプラむトは、共通のファむルにありたす。



次に、ロシア語のロヌカラむズの䟋ず、ロシア語ず英語の共通の背景瞮小版を瀺したす。









「ロシア語」スプラむトマップ









すべおの蚀語のスプラむト背景の䞀般的なマップ



メむンメニュヌの玠材が倧きすぎるため、別の远加ファむルに配眮されたす。 これらはすべおの蚀語にも共通しおおり、それらの「ボタン」はすでに䞡方の「蚀語」カヌドに含たれおいたす。



音



ゲヌムのサりンドは、シンセサむザヌプログラムを䜿甚しお郚分的に生成され、䞀郚は無料のアセットから取埗され、オヌディオタグに接続されおいたした。 特別な話はありたせん。 珟圚のサりンドが終了しない堎合、新しいサりンドがスキップされ、たったく再生されないずいう事実に関連する䞍快な瞬間が1぀だけありたした。 したがっお、状況によっおは音が互いに「重ならない」ように音を枛らす必芁がありたした。



小蚈



次の蚘事では、WindowsストアにナニバヌサルWindowsアプリケヌションを配眮する経隓、html-jsファむルからWindows甚のクラシックデスクトップアプリケヌションを䜜成する経隓、および゜ヌシャルネットワヌクVKontakteずFacebookのマルチナヌザヌバヌゞョンに぀いお説明したす。 珟時点では、ゲヌムはWindowsストアで、Windows 8.1〜10のシングルナヌザヌUWPアプリケヌションx86およびx64ずしおのみ利甚可胜です。たた、AndroidおよびiO甚のアセンブリも䜜成する予定です。 たた、zipアヌカむブのみをレむアりトしお、すべおのオペレヌティングシステムのindex.htmlでシングルナヌザヌバヌゞョンのゲヌムを実行するこずもできたす。



䞀般に、html-jsファむルを含むアヌカむブは、「重い」開発ツヌルを䜿甚しお䜕かをビルドする必芁がないため、むンストヌラヌを䜜成する必芁がなく、アセンブリにラむブラリを含める必芁がないため、このようなアプリケヌションを配垃するための最良のオプションであるず思われたす任意のブラりザヌを䜿甚しお任意のOSで開き、アプリケヌションが最適に動䜜するブラりザヌを遞択しお䜿甚できたす。 アプリケヌションストアがこの方法でアプリケヌションを配垃するこずを蚱可しおいないのは残念です。オペレヌティングシステムは、たずえば実行可胜ファむルでこれを行うため、htmlのショヌトカットをむンストヌルたたは䜜成したせん。 Windows 8.1〜10が䜕らかの圢でこの方向に移動しない限り、Windowsストア甚にアセンブルされたパッケヌゞは4.4 MBしか必芁ずしたせん。 ブラりザメヌカヌは、html-jsアプリケヌションに切り替えお、ブラりザ゚ンゞンを䜿甚するずきのnode-webkitなどで行われるように、ブラりザむンタヌフェむスを衚瀺せずに、ある皮の起動モヌドを提䟛するこずもできたす。 その堎合、たずえば、「クラシック」アプリケヌションのアセンブリに゚ンゞンを含めお、このような各アプリケヌションでこの゚ンゞンをドラッグする必芁はありたせん。 確かに、Webアプリケヌションには朜圚的な可胜性がありたす。3DWebGLグラフィックが利甚可胜で、バむトコヌドであり、ブラりザコヌドの速床はネむティブのものに近づいおいたす。 しかし、このすべおに぀いお-次の郚分で。 それたでは、サヌバヌを䜜成しおいたす。



All Articles