前回はC#でレトロなゲーム 万引少年を作ったので今回はJavaScriptで作成してみることにします。JavaScriptであればページにアクセスするだけ動作確認をすることができます。動作確認はこちらからお願いします。 ⇒ 動作確認はこちら
いきなり挫折?
で、早速問題発生。■がうまく表示されないのです。
HTML
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<div> ■■■■■■<br> ■■■■■■<br> ■■■■■■<br> </div> <p>行間が空いてしまうという問題はline-height:1emでクリア</p> <div style = "line-height:1em"> ■■■■■■<br> ■■■■■■<br> ■■■■■■<br> </div> |
この部分は画像で処理するしかないのかと困っていたところ、尊敬するプログラミング実況配信系YouTuberのひとりであるT Umezawaさんが「HTML, CSS, JavaScript, C# 初心者さんの質問にお答えします」と言っていたので質問をしてみました。質問は10分10秒あたりからはじまります。
結局20分くらい相談してもらった結果、preタグを使えばよいということがわかりました。
1 2 3 4 5 6 |
掲載の都合上、<と>が全角文字になっていますが半角にしてください <pre style = "line-height:1em"> ■■■■■■ ■■■■■■ ■■■■■■ </pre> |
ということでめでたしめでたし。
HTML部分
問題が解決したので最初にHTMLの部分だけ先に示します。
C#で作成したときは別クラスをつくらずにForm1クラスのなかにそのまま書いてしまいましたが、今回はシーンごとに別にクラスを作成します。オープニングならOpeningクラス、店内であればStoreクラスというように・・・。あとはインターバルが500ミリ秒のタイマーと150ミリ秒のタイマーをつくってGameStatusごとに切り分けて処理をします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>レトロなゲーム 万引き少年</title> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> body { background-color: #000; } #field { margin-top: 50px; margin-left: 50px; } </style> </head> <body> <div id = "field"></div> <script> const GAME_STATUS_OPENING = 0; // オープニング const GAME_STATUS_STEAL = 1; // 店内で万引き中 const GAME_STATUS_CATCH = 2; // 店内で警備員に見つかる const GAME_STATUS_CLEARED = 3; // ステージクリア後 const GAME_STATUS_GAMEOVER = 4; // 捕まって警察署へ let GameStatus = GAME_STATUS_OPENING; </script> <script type='text/javascript' src='./opening.js'></script> <script type='text/javascript' src='./store.js'></script> <script type='text/javascript' src='./gameover.js'></script> <script type='text/javascript' src='./stage-clear.js'></script> <script> let fieldElement = document.getElementById('field'); let pre = document.createElement('pre'); pre.style.lineHeight = '1em'; pre.style.color = 'aqua'; fieldElement.appendChild(pre); let store = new Store(pre); let gameOver = new GameOver(pre); let stageClear = new StageClear(pre); let opening = new Opening(pre); document.onkeyup = function(e){ store.OnKeyUp(e); } document.onkeydown = function(e){ store.OnKeyDown(e); // e.keyCode == 83は「S」キー // GameStatusがオープニングであれば万引き作戦開始、 // ゲームオーバー後一定時間経過後は再挑戦 // それ以外はなにもしない if(e.keyCode == 83){ if(GameStatus == GAME_STATUS_OPENING){ GameStatus = GAME_STATUS_STEAL; store.InitStore(); } else if(GameStatus == GAME_STATUS_GAMEOVER && gameOver.EnableRestart){ GameStatus = GAME_STATUS_OPENING; gameOver.EnableRestart = false; gameOver.UpdateCount = 0; store.InitGame(); } } } // 万引き中はこれで警備員を動かす setInterval(() => { if(GameStatus == GAME_STATUS_STEAL) store.Timer500ms(); }, 500); // それ以外のときはこれで描画処理をおこなう setInterval(() => { if(GameStatus == GAME_STATUS_OPENING) opening.Show(); else if(GameStatus == GAME_STATUS_CATCH) store.Timer150ms(); else if(GameStatus == GAME_STATUS_CLEARED) { stageClear.Show(); if(stageClear.End){ GameStatus = GAME_STATUS_OPENING; stageClear.End = false; } } else if(GameStatus == GAME_STATUS_GAMEOVER) { gameOver.Show(store.Score); } }, 150); </script> </body> </html> |
次回からJavaScriptで万引き少年を動作させるために必要なクラスを作成します。