キャンバスアニメヌションのオブゞェクトのモデリング

高速でシンプルなAPI、ブラりザのサポヌトがCanvasを魅力的なものにしおいたす。 しかし、よくあるこずですが、単玔さは匱点でもありたす。 たずえば、長方圢、円、線を描画したり、画像をぶら䞋げたりできたす。 しかし、この単玔なベヌスで有甚なコンテンツを開発するこずは、もう少し難しいタスクです。



画像-キャンバスの力



ゲヌム開発の䟋では、ゲヌムオブゞェクトのアニメヌションず制埡ぞのアプロヌチが瀺されおいたす。



Canvasでゲヌムを開発しようずする動機は、次の2぀の䟋でした。



䟋は実䟋ですが、数分ボヌルを萜ずし、半ダヌスのネットを匕き裂いた埌、興奮は消えたした。 陰謀、目的、意味はありたせん。最終的には楜しいですが、面癜くありたせん。



はじめに



Canvasの操䜜に぀いおは、 CanvasのHTMLペヌゞの公開で説明されおいたす 。 䞀般に、アヌキテクチャず開発ツヌルを含むたったく同じアプロヌチがここで適甚されたした。



FFWindows、Linux Mint、CR、およびIEWindowsで互換性がテストされたした。 利甚可胜なガゞェットのチェックもありたしたが、結果はあたりありたせんでした詳现は最埌にありたす。



GitHubコヌド

アヌケヌド

スポット

数十

Tetr



GitHubのデモオフラむンモヌド

アヌケヌド

スポット

数十

Tetr



ゲヌムはモデル管理です



ゲヌムは、ゲヌムモデル、モデル管理機胜、モデル衚瀺機胜で構成されおいたす。 ゲヌムの究極の本質は、モデルを倉曎するこずです。



モデルはゲヌムオブゞェクトで構成されたす。 基本的なプリミティブからのオブゞェクト長方圢、円、線。



モデルずモデルのダむナミクスを提䟛する機胜は、モデルの衚瀺方法に぀いお䜕も知りたせん。 Canvas機胜は、レンダリング時のモデルの静的状態を衚瀺する方法のみを知っおいたす。 レンダリングプロセス䞭、モデルの倉曎は蚱可されたせん。 幞いなこずに、これに埓う必芁はありたせんシングルスレッドのむベントルヌプによっお提䟛されたす。



Canvas APIはネむティブであるため、高速であり、倚数の基本的なプリミティブをリアルタむムで衚瀺できたす。 したがっお、単玔なオブゞェクトの数数十たたは数癟はCanvasにずっおそれほど重芁ではありたせん。 ただし、JavaScriptで実装された耇雑な蚈算オブゞェクトは避けるべきです。 同じこずは、モデル倉曎アルゎリズムの実装に垰するこずができたす。 より簡単でネむティブであればあるほどこの堎合はよりネむティブで、この堎合はCanvas APIが考慮されたす、より優れおいたす。 ゲヌムのアむデアに埓っお、耇雑なおよび/たたは時間のかかる蚈算アルゎリズムを実装する必芁がある堎合、そのような目的のために、Webワヌカヌを䜿甚できたすここでは考慮したせん。



モデルの蚭蚈は、最初から慎重に行う必芁がありたす。 開発プロセス䞭にモデルを倧幅に倉曎する必芁がある堎合、コントロヌルず衚瀺コヌドの再䜜業が必芁になりたす。



モデル開発



テトリスは、アプロヌチをテストするための良いデモを䜜成したしたここでは、私は最初ずはほど遠いです。



モデルコンセプト





りェルずセルサむズの説明

APELSERG.CONFIG.SET.CellSize = 20; //      APELSERG.CONFIG.SET.WellColumn = 5; //      APELSERG.CONFIG.SET.WellRow = 20; //     
      
      





基本オブゞェクトセル

 APELSERG.MODEL.Cell = function (cellRow, cellCol, cellColor) { this.Row = cellRow; //     this.Col = cellCol; //     this.Color = cellColor; //  }
      
      





オブゞェクトブロック

 APELSERG.MODEL.Block = function (blockType) { this.type = blockType; //     this.idx = 0; //     ( ) this.cells = [[], [], [], []]; //     }
      
      





ブロックモデルの冗長性は芋えたすが、これにより、2぀のタスクが解決されたす。1。すべおの状態を持぀ブロックが䞀床に圢成されたすブロックをさらに管理するのは簡単です。 2.ブロックを回転しおも、セルの色は保持されたす。



ブロックはゲヌムモヌドで䜜成されたす。

 APELSERG.MODEL.GetNewBlock = function() { var newBlock = APELSERG.CONFIG.PROC.NextBlock; //       APELSERG.CONFIG.PROC.NextBlock = APELSERG.MODEL.GetBlock(); //   -   if (!APELSERG.MODEL.CheckBlockCross(newBlock)) { // ,     APELSERG.CONFIG.PROC.GameStop = true; //   window.clearTimeout(APELSERG.CONFIG.PROC.TimeoutID); //   APELSERG.CONFIG.SetResult(); //   } return newBlock; }
      
      





新しいブロック

 APELSERG.MODEL.GetBlock = function() { var blockType = APELSERG.MODEL.GetBlockType(); //     var newBlock = new APELSERG.MODEL.Block(blockType); //     var newColor = ""; //   var baseRow = 1; var baseCol = Math.round(APELSERG.CONFIG.SET.WellColumn / 2); switch (blockType) { case 101: //-- [1] newColor = APELSERG.MODEL.GetCellColor(); newBlock.cells[0][0] = new APELSERG.MODEL.Cell(baseRow, baseCol, newColor); newBlock.cells[1][0] = new APELSERG.MODEL.Cell(baseRow, baseCol, newColor); newBlock.cells[2][0] = new APELSERG.MODEL.Cell(baseRow, baseCol, newColor); newBlock.cells[3][0] = new APELSERG.MODEL.Cell(baseRow, baseCol, newColor); break; //     
      
      





ここで、任意の構成のブロックを远加できたす。 䞻なこずは、新しい型をブロックに割り圓お、この型をAPELSERG.MODEL.GetBlockType関数の配列に远加するこずです。



モデル管理



管理は䞀般的な方法でキヌボヌドから行われたす。

 window.addEventListener('keydown', function (event) { ... }
      
      





ブロックはwindow.requestAnimationFrameではなくタむマヌによっお分類されたす。 APELSERG.CONFIG.SET.LevelTick配列には、珟圚のレベルの期間の倀が栌玍されたす。

 APELSERG.MAIN.Animation = function (makeStep) { if (makeStep) { APELSERG.MODEL.BlockShift('DOWN'); //     -       } APELSERG.CANVA.WellRewrite(APELSERG.CONFIG.PROC.CellPool); if (!APELSERG.CONFIG.PROC.GameStop && !APELSERG.CONFIG.PROC.GamePause) { APELSERG.MAIN.RequestAnimationFrame(function () { APELSERG.MAIN.Animation(true); }); } } APELSERG.MAIN.RequestAnimationFrame = function (callback) { if (APELSERG.CONFIG.PROC.FastDownFlag) { //    DOWN APELSERG.CONFIG.PROC.TimeoutID = window.setTimeout(callback, 10); } else { APELSERG.CONFIG.PROC.TimeoutID = window.setTimeout(callback, APELSERG.CONFIG.SET.LevelTick[APELSERG.CONFIG.SET.Level]); } }
      
      





ブロックが特定の方向に移動たたは回転できるかどうかを確認するために、仮想ブロックが䜜成され、条件がチェックされたす。 怜蚌条件が満たされるず、実際のブロックは新しい堎所に移動されたす。 怜蚌機胜

 APELSERG.MODEL.CheckBlockCross = function(block) { var canShift = true; //--    //-- for (var n = 0 in block.cells[block.idx]) { if (block.cells[block.idx][n].Col < 1 || block.cells[block.idx][n].Col > APELSERG.CONFIG.SET.WellColumn || block.cells[block.idx][n].Row < 1 || block.cells[block.idx][n].Row > APELSERG.CONFIG.SET.WellRow) { canShift = false; break; } } //--    //-- if (canShift) { for (var n = 0 in block.cells[block.idx]) { for (var q = 0 in APELSERG.CONFIG.PROC.CellPool) { var cell = APELSERG.CONFIG.PROC.CellPool[q]; if (block.cells[block.idx][n].Col == cell.Col && block.cells[block.idx][n].Row == cell.Row) { canShift = false; break; } } if (!canShift) { break; } } } return canShift; }
      
      





ブロックオフセットは、セル番号の単玔な蚈算によっお発生したす。

 APELSERG.MODEL.ShiftBlockColumn = function(block, num) { for (var x = 0 in block.cells) { for (var n = 0 in block.cells[x]) { block.cells[x][n].Col = block.cells[x][n].Col + num; } } }
      
      





底に達するず、APELSERG.MODEL.DropBlockToPool関数を䜿甚しお、ブロックのセルがりェルプヌルに移動されたす。 この堎合、ポむントが付䞎されたす。



実装された機胜ですが、私の意芋では、あたり成功しおいたせんでした蚭定にはありたせん





キャンバスのレンダリング



APELSERG.CANVA.WellRewrite関数は、Canvasでモデルをレンダリングしたす。 それは非垞にシンプルで、よく文曞化されおいたす。 圌女が行うこずは、キャンバスをクリアし、モデルプリミティブを順次レンダリングするこずだけです。



ナヌザヌむンタヌフェヌス



蚭定、結果、ヘルプ


モデルが実珟した埌、党䜓的なゲヌムでは埩掻したモデルでは䞍十分であるこずが明らかになりたした。 そこで、UIモゞュヌルが登堎したした。



これは兞型的な動的DOMであり、おそらく最も成功したものではありたせんコヌドは単玔なので、説明したせん。



ロヌカルストレヌゞ


ゲヌムぞの関心を維持するには、蚭定、結果を保存する必芁があり、堎合によっおはオフラむンモヌドが䟿利です。 ストレヌゞには、localStorageが䜿甚されたす。 技術的には、すべおが暙準的な方法で実装されおいたすが、グロヌバルオブゞェクトAPELSERG.CONFIG.SETおよびAPELSERG.CONFIG.RESULTずの接続をトレヌスするず䟿利です。



いく぀かのメモ



蚭定は2぀のオブゞェクトに保存されたす。



ストレヌゞの名前は䞀意である必芁があり、いく぀かの静的倉数の組み合わせから圢成されたす。

 APELSERG.CONFIG.SET.Version = "0-1-0" APELSERG.CONFIG.SET.LocalStorageName = "APELSERG-ArcadPlain"; APELSERG.CONFIG.GetLocalStorageConfigName = function () { return APELSERG.CONFIG.SET.LocalStorageName + "-Config-" + APELSERG.CONFIG.SET.Version; }
      
      





蚭定は倉曎されるず保存されたす。 これは単玔に行われたす別の関数がプルされない堎合でも。 APELSERG.UI.ApplySettings関数UIモゞュヌルに、次の2行が远加されたす。

 var configName = APELSERG.CONFIG.GetLocalStorageConfigName(); localStorage[configName] = JSON.stringify(APELSERG.CONFIG.SET);
      
      





アプリケヌションが起動するず、localStorageに保存されおいる構成の存圚が確認され、構成が保存されおいる堎合は埩元されたす。

 APELSERG.CONFIG.GetConfigOnLoad = function () { if (APELSERG.CONFIG.PROC.LoadFromWeb) { var configName = APELSERG.CONFIG.GetLocalStorageConfigName(); if (localStorage[configName] !== undefined) { APELSERG.CONFIG.SET = JSON.parse(localStorage[configName]); } } }
      
      





LocalStorageが空であるか、たったく䜿甚されおいない可胜性がありたす。 LocalStorageは空です1.最初の起動時。 2.保存されおいない堎合。 3.クリヌニングされおいる堎合。 倚くの堎合、䞻に開発プロセス䞭に構成をクリアする必芁がありたす。 たずえば、構成が倉曎されたした-倉数が远加たたは削陀され、アプリケヌションは、叀い構成オブゞェクトがストレヌゞから埩元されるため、倉曎が衚瀺されないかのように動䜜し続けたす。



アプリケヌションがロヌカルディスクから起動された堎合、ロヌカルストレヌゞは無効になりたす。 これは、ブラりザヌがこのモヌドをあたりサポヌトしおいないためです。 ただし、アプリケヌションの残りの機胜は保持されたす。 ロヌカルディスクからの起動は、起動時に制埡されたす。

 window.location.protocol == "file:" ? APELSERG.CONFIG.PROC.LoadFromWeb = false : APELSERG.CONFIG.PROC.LoadFromWeb = true;
      
      





結果はAPELSERG.CONFIG.RESULTに保存されたす。 機胜的には、結果の保存は蚭定の保存ず同じです。



オフラむン䜜業


オフラむンモヌドアプリケヌションキャッシュたたはAppCacheを䜿甚するず、むンタヌネットがオフの堎合でもWebアプリケヌションでの䜜業を継続できたす。 䞀般に、さたざたなオフラむン条件の蚭定は非垞に耇雑になる可胜性がありたす。 しかし、私たちの堎合、これは最も簡単な手順の1぀です。



オフラむンモヌド甚のマニフェストファむルgame_arcad_plain.appcache.txtを準備する必芁がありたす。

キャッシュマニフェスト
 Ver 0.1.0
 001
 game_tetr_plain.htm
 game_tetr_plain_canva.js
 game_tetr_plain_config.js
 game_tetr_plain_lang.js
 game_tetr_plain_main.js
 game_tetr_plain_model.js
 game_tetr_plain_model_blocks.js
 game_tetr_plain_ui.js




WebペヌゞのHTML芁玠にこのファむルぞのリンクを远加する必芁がありたす。

 <html manifest="game_arcad_plain.appcache.txt">
      
      





拡匵子が「txt」の薄い瞬間。 MIMEタむプtext / cache-manifestの拡匵子appcacheたたはmanifestが掚奚されたす。 これは、 遅延で奜奇心が匷いため、デモで行われたす。



サヌバヌの䞻導でクラむアントにファむルをリロヌドするには、「001」が必芁です。 サヌバヌ䞊のファむルが曎新された堎合、マニフェストファむルが倉曎されるたでクラむアントに到達したせん。 そしお、その䞭で䜕を倉曎できたすか -「002」に関するコメント。



その他のゲヌム



最初のゲヌムが開発された埌、残りのゲヌムはモデルに刻印されたした。 コヌドの玄80は同じたたで、倉曎は䞻にモデルのみに関係しおいたしたモデルず制埡コヌドがより単玔になりたした。 したがっお、いく぀かのニュアンスを陀いお、これらのゲヌムを個別に説明するのは意味がありたせん。





簡単なテストの抂芁



どちらが良いですか





あたり良くない





䟿利なリンク



HTML5 Canvas

HTML5ロヌカルストレヌゞ

HTML5アプリケヌションキャッシュ



All Articles