brick-engine-js 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/dist/docs/GAME_DEVELOPER_GUIDE.html +1 -1
  2. package/dist/docs/brick-engine-guide.html +1 -1
  3. package/dist/docs/getting-started.html +1 -1
  4. package/dist/docs/jsdoc_standard.html +1 -1
  5. package/dist/docs/publishing.html +1 -1
  6. package/dist/docs/reference/interfaces/modules/Session.html +1 -1
  7. package/dist/docs/reference/modules/GameMenu.html +1 -1
  8. package/dist/docs/reference/modules/GameSession.html +1 -1
  9. package/dist/docs/reference/modules/InitialStateSnapshot.html +1 -1
  10. package/dist/docs/reference/modules/SessionModal.html +1 -1
  11. package/dist/docs/testing_best_practices.html +1 -1
  12. package/package.json +2 -1
  13. package/public/CNAME +1 -0
  14. package/public/docs/GAME_DEVELOPER_GUIDE.html +727 -0
  15. package/public/docs/brick-engine-guide.html +610 -0
  16. package/public/docs/diagrams/lifecycle.mmd +19 -0
  17. package/public/docs/documentation_style_guide.html +994 -0
  18. package/public/docs/getting-started.html +648 -0
  19. package/public/docs/images/lifecycle.svg +1 -0
  20. package/public/docs/index.html +593 -0
  21. package/public/docs/jsdoc_standard.html +656 -0
  22. package/public/docs/publishing.html +573 -0
  23. package/public/docs/reference/enums/Color.html +533 -0
  24. package/public/docs/reference/enums/ControlEventType.html +505 -0
  25. package/public/docs/reference/enums/ControlKey.html +529 -0
  26. package/public/docs/reference/enums/FontAlignment.html +545 -0
  27. package/public/docs/reference/enums/FontSize.html +517 -0
  28. package/public/docs/reference/enums/Sound.html +558 -0
  29. package/public/docs/reference/enums/StateProperty.html +525 -0
  30. package/public/docs/reference/helpers/CellHelper.html +520 -0
  31. package/public/docs/reference/helpers/ControlInputHandlerHelper.html +569 -0
  32. package/public/docs/reference/helpers/CoordinateHelper.html +703 -0
  33. package/public/docs/reference/helpers/RelativeValuesHelper.html +560 -0
  34. package/public/docs/reference/interfaces/Debuggable.html +501 -0
  35. package/public/docs/reference/interfaces/GameModules.html +544 -0
  36. package/public/docs/reference/interfaces/Initializable.html +495 -0
  37. package/public/docs/reference/interfaces/RendererInitializable.html +517 -0
  38. package/public/docs/reference/interfaces/StateSyncable.html +542 -0
  39. package/public/docs/reference/interfaces/modules/Control.html +648 -0
  40. package/public/docs/reference/interfaces/modules/Grid.html +1256 -0
  41. package/public/docs/reference/interfaces/modules/Renderer.html +522 -0
  42. package/public/docs/reference/interfaces/modules/RendererComposite.html +577 -0
  43. package/public/docs/reference/interfaces/modules/Score.html +669 -0
  44. package/public/docs/reference/interfaces/modules/Session.html +585 -0
  45. package/public/docs/reference/interfaces/modules/State.html +897 -0
  46. package/public/docs/reference/interfaces/modules/Text.html +668 -0
  47. package/public/docs/reference/interfaces/modules/Time.html +684 -0
  48. package/public/docs/reference/modules/Debugger.html +579 -0
  49. package/public/docs/reference/modules/DisplayRenderer.html +557 -0
  50. package/public/docs/reference/modules/Game.html +909 -0
  51. package/public/docs/reference/modules/GameControl.html +716 -0
  52. package/public/docs/reference/modules/GameGrid.html +1910 -0
  53. package/public/docs/reference/modules/GameHudGrid.html +508 -0
  54. package/public/docs/reference/modules/GameMenu.html +538 -0
  55. package/public/docs/reference/modules/GameRenderer.html +589 -0
  56. package/public/docs/reference/modules/GameScore.html +664 -0
  57. package/public/docs/reference/modules/GameSession.html +533 -0
  58. package/public/docs/reference/modules/GameSound.html +636 -0
  59. package/public/docs/reference/modules/GameState.html +922 -0
  60. package/public/docs/reference/modules/GameText.html +701 -0
  61. package/public/docs/reference/modules/GameTime.html +696 -0
  62. package/public/docs/reference/modules/HudRenderer.html +568 -0
  63. package/public/docs/reference/modules/InitialStateSnapshot.html +557 -0
  64. package/public/docs/reference/modules/SessionModal.html +520 -0
  65. package/public/docs/reference/types/Axis.html +505 -0
  66. package/public/docs/reference/types/Cell.html +514 -0
  67. package/public/docs/reference/types/ControlCallback.html +488 -0
  68. package/public/docs/reference/types/Coordinate.html +510 -0
  69. package/public/docs/reference/types/GameEntry.html +514 -0
  70. package/public/docs/reference/types/GameEvent.html +514 -0
  71. package/public/docs/reference/types/Piece.html +506 -0
  72. package/public/docs/reference/types/RendererMetrics.html +514 -0
  73. package/public/docs/reference/types/Vector.html +509 -0
  74. package/public/docs/testing_best_practices.html +770 -0
  75. package/public/favicon.ico +0 -0
  76. package/public/fonts/digital-7.monoitalic.ttf +0 -0
  77. package/public/images/cell.svg +32 -0
  78. package/public/images/close.png +0 -0
  79. package/public/images/games.png +0 -0
  80. package/public/images/github.png +0 -0
  81. package/public/images/letter-a.png +0 -0
  82. package/public/images/letter-d.png +0 -0
  83. package/public/images/letter-j.png +0 -0
  84. package/public/images/letter-s.png +0 -0
  85. package/public/images/letter-w.png +0 -0
  86. package/public/images/meta-image.png +0 -0
  87. package/public/images/number-1.png +0 -0
  88. package/public/images/number-2.png +0 -0
  89. package/public/images/number-3.png +0 -0
  90. package/public/images/number-4.png +0 -0
  91. package/public/images/number-5.png +0 -0
  92. package/public/images/number-6.png +0 -0
  93. package/public/images/splash.gif +0 -0
  94. package/public/index.html +15 -0
  95. package/public/sounds/sound_00.wav +0 -0
  96. package/public/sounds/sound_01.wav +0 -0
  97. package/public/sounds/sound_02.wav +0 -0
  98. package/public/sounds/sound_03.wav +0 -0
  99. package/public/sounds/sound_04.wav +0 -0
  100. package/public/sounds/sound_05.wav +0 -0
  101. package/public/sounds/sound_06.wav +0 -0
  102. package/public/sounds/sound_07.wav +0 -0
  103. package/public/sounds/sound_08.wav +0 -0
  104. package/public/sounds/sound_09.wav +0 -0
  105. package/public/sounds/sound_10.wav +0 -0
  106. package/public/sounds/sound_11.wav +0 -0
  107. package/public/sounds/sound_12.wav +0 -0
  108. package/public/sounds/sound_13.wav +0 -0
  109. package/public/sounds/sound_14.wav +0 -0
  110. package/public/sounds/sound_15.wav +0 -0
  111. package/public/style/body.css +86 -0
  112. package/public/style/buttons.css +233 -0
  113. package/public/style/debugger.css +117 -0
  114. package/public/style/sessionModal.css +155 -0
  115. package/public/style/sourceCodeAndCommands.css +74 -0
  116. package/public/style/splash.css +13 -0
  117. package/public/style/theme.css +137 -0
@@ -0,0 +1,593 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="generator" content="Asciidoctor 2.0.20">
8
+ <meta name="description" content="Modular TypeScript game engine for retro grid-based games.">
9
+ <meta name="keywords" content="typescript, game-engine, retro, grid-based, p5js, modular">
10
+ <title>Brick Engine JS Documentation</title>
11
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
12
+ <style>
13
+ /*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
14
+ /* Uncomment the following line when using as a custom stylesheet */
15
+ /* @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"; */
16
+ html{font-family:sans-serif;-webkit-text-size-adjust:100%}
17
+ a{background:none}
18
+ a:focus{outline:thin dotted}
19
+ a:active,a:hover{outline:0}
20
+ h1{font-size:2em;margin:.67em 0}
21
+ b,strong{font-weight:bold}
22
+ abbr{font-size:.9em}
23
+ abbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none}
24
+ dfn{font-style:italic}
25
+ hr{height:0}
26
+ mark{background:#ff0;color:#000}
27
+ code,kbd,pre,samp{font-family:monospace;font-size:1em}
28
+ pre{white-space:pre-wrap}
29
+ q{quotes:"\201C" "\201D" "\2018" "\2019"}
30
+ small{font-size:80%}
31
+ sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
32
+ sup{top:-.5em}
33
+ sub{bottom:-.25em}
34
+ img{border:0}
35
+ svg:not(:root){overflow:hidden}
36
+ figure{margin:0}
37
+ audio,video{display:inline-block}
38
+ audio:not([controls]){display:none;height:0}
39
+ fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
40
+ legend{border:0;padding:0}
41
+ button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
42
+ button,input{line-height:normal}
43
+ button,select{text-transform:none}
44
+ button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}
45
+ button[disabled],html input[disabled]{cursor:default}
46
+ input[type=checkbox],input[type=radio]{padding:0}
47
+ button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
48
+ textarea{overflow:auto;vertical-align:top}
49
+ table{border-collapse:collapse;border-spacing:0}
50
+ *,::before,::after{box-sizing:border-box}
51
+ html,body{font-size:100%}
52
+ body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;line-height:1;position:relative;cursor:auto;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
53
+ a:hover{cursor:pointer}
54
+ img,object,embed{max-width:100%;height:auto}
55
+ object,embed{height:100%}
56
+ img{-ms-interpolation-mode:bicubic}
57
+ .left{float:left!important}
58
+ .right{float:right!important}
59
+ .text-left{text-align:left!important}
60
+ .text-right{text-align:right!important}
61
+ .text-center{text-align:center!important}
62
+ .text-justify{text-align:justify!important}
63
+ .hide{display:none}
64
+ img,object,svg{display:inline-block;vertical-align:middle}
65
+ textarea{height:auto;min-height:50px}
66
+ select{width:100%}
67
+ .subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
68
+ div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
69
+ a{color:#2156a5;text-decoration:underline;line-height:inherit}
70
+ a:hover,a:focus{color:#1d4b8f}
71
+ a img{border:0}
72
+ p{line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
73
+ p aside{font-size:.875em;line-height:1.35;font-style:italic}
74
+ h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
75
+ h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
76
+ h1{font-size:2.125em}
77
+ h2{font-size:1.6875em}
78
+ h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
79
+ h4,h5{font-size:1.125em}
80
+ h6{font-size:1em}
81
+ hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em}
82
+ em,i{font-style:italic;line-height:inherit}
83
+ strong,b{font-weight:bold;line-height:inherit}
84
+ small{font-size:60%;line-height:inherit}
85
+ code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
86
+ ul,ol,dl{line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
87
+ ul,ol{margin-left:1.5em}
88
+ ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0}
89
+ ul.circle{list-style-type:circle}
90
+ ul.disc{list-style-type:disc}
91
+ ul.square{list-style-type:square}
92
+ ul.circle ul:not([class]),ul.disc ul:not([class]),ul.square ul:not([class]){list-style:inherit}
93
+ ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
94
+ dl dt{margin-bottom:.3125em;font-weight:bold}
95
+ dl dd{margin-bottom:1.25em}
96
+ blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
97
+ blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
98
+ @media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
99
+ h1{font-size:2.75em}
100
+ h2{font-size:2.3125em}
101
+ h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
102
+ h4{font-size:1.4375em}}
103
+ table{background:#fff;margin-bottom:1.25em;border:1px solid #dedede;word-wrap:normal}
104
+ table thead,table tfoot{background:#f7f8f7}
105
+ table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
106
+ table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
107
+ table tr.even,table tr.alt{background:#f8f8f7}
108
+ table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
109
+ h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
110
+ h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
111
+ .center{margin-left:auto;margin-right:auto}
112
+ .stretch{width:100%}
113
+ .clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
114
+ .clearfix::after,.float-group::after{clear:both}
115
+ :not(pre).nobreak{word-wrap:normal}
116
+ :not(pre).nowrap{white-space:nowrap}
117
+ :not(pre).pre-wrap{white-space:pre-wrap}
118
+ :not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
119
+ pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
120
+ pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
121
+ pre>code{display:block}
122
+ pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
123
+ em em{font-style:normal}
124
+ strong strong{font-weight:400}
125
+ .keyseq{color:rgba(51,51,51,.8)}
126
+ kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
127
+ .keyseq kbd:first-child{margin-left:0}
128
+ .keyseq kbd:last-child{margin-right:0}
129
+ .menuseq,.menuref{color:#000}
130
+ .menuseq b:not(.caret),.menuref{font-weight:inherit}
131
+ .menuseq{word-spacing:-.02em}
132
+ .menuseq b.caret{font-size:1.25em;line-height:.8}
133
+ .menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
134
+ b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
135
+ b.button::before{content:"[";padding:0 3px 0 2px}
136
+ b.button::after{content:"]";padding:0 2px 0 3px}
137
+ p a>code:hover{color:rgba(0,0,0,.9)}
138
+ #header,#content,#footnotes,#footer{width:100%;margin:0 auto;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
139
+ #header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
140
+ #header::after,#content::after,#footnotes::after,#footer::after{clear:both}
141
+ #content{margin-top:1.25em}
142
+ #content::before{content:none}
143
+ #header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
144
+ #header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
145
+ #header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
146
+ #header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap}
147
+ #header .details span:first-child{margin-left:-.125em}
148
+ #header .details span.email a{color:rgba(0,0,0,.85)}
149
+ #header .details br{display:none}
150
+ #header .details br+span::before{content:"\00a0\2013\00a0"}
151
+ #header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
152
+ #header .details br+span#revremark::before{content:"\00a0|\00a0"}
153
+ #header #revnumber{text-transform:capitalize}
154
+ #header #revnumber::after{content:"\00a0"}
155
+ #content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
156
+ #toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
157
+ #toc>ul{margin-left:.125em}
158
+ #toc ul.sectlevel0>li>a{font-style:italic}
159
+ #toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
160
+ #toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
161
+ #toc li{line-height:1.3334;margin-top:.3334em}
162
+ #toc a{text-decoration:none}
163
+ #toc a:active{text-decoration:underline}
164
+ #toctitle{color:#7a2518;font-size:1.2em}
165
+ @media screen and (min-width:768px){#toctitle{font-size:1.375em}
166
+ body.toc2{padding-left:15em;padding-right:0}
167
+ #toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
168
+ #toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
169
+ #toc.toc2>ul{font-size:.9em;margin-bottom:0}
170
+ #toc.toc2 ul ul{margin-left:0;padding-left:1em}
171
+ #toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
172
+ body.toc2.toc-right{padding-left:0;padding-right:15em}
173
+ body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
174
+ @media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
175
+ #toc.toc2{width:20em}
176
+ #toc.toc2 #toctitle{font-size:1.375em}
177
+ #toc.toc2>ul{font-size:.95em}
178
+ #toc.toc2 ul ul{padding-left:1.25em}
179
+ body.toc2.toc-right{padding-left:0;padding-right:20em}}
180
+ #content #toc{border:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px}
181
+ #content #toc>:first-child{margin-top:0}
182
+ #content #toc>:last-child{margin-bottom:0}
183
+ #footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
184
+ #footer-text{color:hsla(0,0%,100%,.8);line-height:1.44}
185
+ #content{margin-bottom:.625em}
186
+ .sect1{padding-bottom:.625em}
187
+ @media screen and (min-width:768px){#content{margin-bottom:1.25em}
188
+ .sect1{padding-bottom:1.25em}}
189
+ .sect1:last-child{padding-bottom:0}
190
+ .sect1+.sect1{border-top:1px solid #e7e7e9}
191
+ #content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
192
+ #content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
193
+ #content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
194
+ #content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
195
+ #content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
196
+ details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
197
+ details{margin-left:1.25rem}
198
+ details>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;outline:none;-webkit-tap-highlight-color:transparent}
199
+ details>summary::-webkit-details-marker{display:none}
200
+ details>summary::before{content:"";border:solid transparent;border-left:solid;border-width:.3em 0 .3em .5em;position:absolute;top:.5em;left:-1.25rem;transform:translateX(15%)}
201
+ details[open]>summary::before{border:solid transparent;border-top:solid;border-width:.5em .3em 0;transform:translateY(15%)}
202
+ details>summary::after{content:"";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem}
203
+ .admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
204
+ table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
205
+ .paragraph.lead>p,#preamble>.sectionbody>[class=paragraph]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
206
+ .admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
207
+ .admonitionblock>table td.icon{text-align:center;width:80px}
208
+ .admonitionblock>table td.icon img{max-width:none}
209
+ .admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
210
+ .admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
211
+ .admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
212
+ .exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px}
213
+ .sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px}
214
+ .sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
215
+ .exampleblock>.content>:first-child,.sidebarblock>.content>:first-child{margin-top:0}
216
+ .exampleblock>.content>:last-child,.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
217
+ .literalblock pre,.listingblock>.content>pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
218
+ @media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
219
+ @media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
220
+ .literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class=highlight],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
221
+ .literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
222
+ .listingblock>.content{position:relative}
223
+ .listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
224
+ .listingblock:hover code[data-lang]::before{display:block}
225
+ .listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
226
+ .listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
227
+ .listingblock pre.highlightjs{padding:0}
228
+ .listingblock pre.highlightjs>code{padding:1em;border-radius:4px}
229
+ .listingblock pre.prettyprint{border-width:0}
230
+ .prettyprint{background:#f7f7f8}
231
+ pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
232
+ pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
233
+ pre.prettyprint li code[data-lang]::before{opacity:1}
234
+ pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
235
+ table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
236
+ table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
237
+ table.linenotable td.code{padding-left:.75em}
238
+ table.linenotable td.linenos,pre.pygments .linenos{border-right:1px solid;opacity:.35;padding-right:.5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
239
+ pre.pygments span.linenos{display:inline-block;margin-right:.75em}
240
+ .quoteblock{margin:0 1em 1.25em 1.5em;display:table}
241
+ .quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
242
+ .quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
243
+ .quoteblock blockquote{margin:0;padding:0;border:0}
244
+ .quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
245
+ .quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
246
+ .quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
247
+ .verseblock{margin:0 1em 1.25em}
248
+ .verseblock pre{font-family:"Open Sans","DejaVu Sans",sans-serif;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
249
+ .verseblock pre strong{font-weight:400}
250
+ .verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
251
+ .quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
252
+ .quoteblock .attribution br,.verseblock .attribution br{display:none}
253
+ .quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
254
+ .quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
255
+ .quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
256
+ .quoteblock.abstract{margin:0 1em 1.25em;display:block}
257
+ .quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
258
+ .quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
259
+ .quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
260
+ .quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
261
+ .quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;font-size:.85rem;text-align:left;margin-right:0}
262
+ p.tableblock:last-child{margin-bottom:0}
263
+ td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
264
+ td.tableblock>.content>:last-child{margin-bottom:-1.25em}
265
+ table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
266
+ table.grid-all>*>tr>*{border-width:1px}
267
+ table.grid-cols>*>tr>*{border-width:0 1px}
268
+ table.grid-rows>*>tr>*{border-width:1px 0}
269
+ table.frame-all{border-width:1px}
270
+ table.frame-ends{border-width:1px 0}
271
+ table.frame-sides{border-width:0 1px}
272
+ table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
273
+ table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
274
+ table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
275
+ table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
276
+ table.stripes-all>*>tr,table.stripes-odd>*>tr:nth-of-type(odd),table.stripes-even>*>tr:nth-of-type(even),table.stripes-hover>*>tr:hover{background:#f8f8f7}
277
+ th.halign-left,td.halign-left{text-align:left}
278
+ th.halign-right,td.halign-right{text-align:right}
279
+ th.halign-center,td.halign-center{text-align:center}
280
+ th.valign-top,td.valign-top{vertical-align:top}
281
+ th.valign-bottom,td.valign-bottom{vertical-align:bottom}
282
+ th.valign-middle,td.valign-middle{vertical-align:middle}
283
+ table thead th,table tfoot th{font-weight:bold}
284
+ tbody tr th{background:#f7f8f7}
285
+ tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
286
+ p.tableblock>code:only-child{background:none;padding:0}
287
+ p.tableblock{font-size:1em}
288
+ ol{margin-left:1.75em}
289
+ ul li ol{margin-left:1.5em}
290
+ dl dd{margin-left:1.125em}
291
+ dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
292
+ li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
293
+ ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
294
+ ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
295
+ ul.unstyled,ol.unstyled{margin-left:0}
296
+ li>p:empty:only-child::before{content:"";display:inline-block}
297
+ ul.checklist>li>p:first-child{margin-left:-1em}
298
+ ul.checklist>li>p:first-child>.fa-square-o:first-child,ul.checklist>li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
299
+ ul.checklist>li>p:first-child>input[type=checkbox]:first-child{margin-right:.25em}
300
+ ul.inline{display:flex;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
301
+ ul.inline>li{margin-left:1.25em}
302
+ .unstyled dl dt{font-weight:400;font-style:normal}
303
+ ol.arabic{list-style-type:decimal}
304
+ ol.decimal{list-style-type:decimal-leading-zero}
305
+ ol.loweralpha{list-style-type:lower-alpha}
306
+ ol.upperalpha{list-style-type:upper-alpha}
307
+ ol.lowerroman{list-style-type:lower-roman}
308
+ ol.upperroman{list-style-type:upper-roman}
309
+ ol.lowergreek{list-style-type:lower-greek}
310
+ .hdlist>table,.colist>table{border:0;background:none}
311
+ .hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
312
+ td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
313
+ td.hdlist1{font-weight:bold;padding-bottom:1.25em}
314
+ td.hdlist2{word-wrap:anywhere}
315
+ .literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
316
+ .colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
317
+ .colist td:not([class]):first-child img{max-width:none}
318
+ .colist td:not([class]):last-child{padding:.25em 0}
319
+ .thumb,.th{line-height:0;display:inline-block;border:4px solid #fff;box-shadow:0 0 0 1px #ddd}
320
+ .imageblock.left{margin:.25em .625em 1.25em 0}
321
+ .imageblock.right{margin:.25em 0 1.25em .625em}
322
+ .imageblock>.title{margin-bottom:0}
323
+ .imageblock.thumb,.imageblock.th{border-width:6px}
324
+ .imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
325
+ .image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
326
+ .image.left{margin-right:.625em}
327
+ .image.right{margin-left:.625em}
328
+ a.image{text-decoration:none;display:inline-block}
329
+ a.image object{pointer-events:none}
330
+ sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
331
+ sup.footnote a,sup.footnoteref a{text-decoration:none}
332
+ sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
333
+ #footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
334
+ #footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
335
+ #footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
336
+ #footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
337
+ #footnotes .footnote:last-of-type{margin-bottom:0}
338
+ #content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
339
+ div.unbreakable{page-break-inside:avoid}
340
+ .big{font-size:larger}
341
+ .small{font-size:smaller}
342
+ .underline{text-decoration:underline}
343
+ .overline{text-decoration:overline}
344
+ .line-through{text-decoration:line-through}
345
+ .aqua{color:#00bfbf}
346
+ .aqua-background{background:#00fafa}
347
+ .black{color:#000}
348
+ .black-background{background:#000}
349
+ .blue{color:#0000bf}
350
+ .blue-background{background:#0000fa}
351
+ .fuchsia{color:#bf00bf}
352
+ .fuchsia-background{background:#fa00fa}
353
+ .gray{color:#606060}
354
+ .gray-background{background:#7d7d7d}
355
+ .green{color:#006000}
356
+ .green-background{background:#007d00}
357
+ .lime{color:#00bf00}
358
+ .lime-background{background:#00fa00}
359
+ .maroon{color:#600000}
360
+ .maroon-background{background:#7d0000}
361
+ .navy{color:#000060}
362
+ .navy-background{background:#00007d}
363
+ .olive{color:#606000}
364
+ .olive-background{background:#7d7d00}
365
+ .purple{color:#600060}
366
+ .purple-background{background:#7d007d}
367
+ .red{color:#bf0000}
368
+ .red-background{background:#fa0000}
369
+ .silver{color:#909090}
370
+ .silver-background{background:#bcbcbc}
371
+ .teal{color:#006060}
372
+ .teal-background{background:#007d7d}
373
+ .white{color:#bfbfbf}
374
+ .white-background{background:#fafafa}
375
+ .yellow{color:#bfbf00}
376
+ .yellow-background{background:#fafa00}
377
+ span.icon>.fa{cursor:default}
378
+ a span.icon>.fa{cursor:inherit}
379
+ .admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
380
+ .admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
381
+ .admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
382
+ .admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
383
+ .admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
384
+ .admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
385
+ .conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
386
+ .conum[data-value] *{color:#fff!important}
387
+ .conum[data-value]+b{display:none}
388
+ .conum[data-value]::after{content:attr(data-value)}
389
+ pre .conum[data-value]{position:relative;top:-.125em}
390
+ b.conum *{color:inherit!important}
391
+ .conum:not([data-value]):empty{display:none}
392
+ dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
393
+ h1,h2,p,td.content,span.alt,summary{letter-spacing:-.01em}
394
+ p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
395
+ p,blockquote,dt,td.content,td.hdlist1,span.alt,summary{font-size:1.0625rem}
396
+ p{margin-bottom:1.25rem}
397
+ .sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
398
+ .exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc}
399
+ .print-only{display:none!important}
400
+ @page{margin:1.25cm .75cm}
401
+ @media print{*{box-shadow:none!important;text-shadow:none!important}
402
+ html{font-size:80%}
403
+ a{color:inherit!important;text-decoration:underline!important}
404
+ a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
405
+ a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
406
+ abbr[title]{border-bottom:1px dotted}
407
+ abbr[title]::after{content:" (" attr(title) ")"}
408
+ pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
409
+ thead{display:table-header-group}
410
+ svg{max-width:100%}
411
+ p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
412
+ h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
413
+ #header,#content,#footnotes,#footer{max-width:none}
414
+ #toc,.sidebarblock,.exampleblock>.content{background:none!important}
415
+ #toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
416
+ body.book #header{text-align:center}
417
+ body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
418
+ body.book #header .details{border:0!important;display:block;padding:0!important}
419
+ body.book #header .details span:first-child{margin-left:0!important}
420
+ body.book #header .details br{display:block}
421
+ body.book #header .details br+span::before{content:none!important}
422
+ body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
423
+ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
424
+ .listingblock code[data-lang]::before{display:block}
425
+ #footer{padding:0 .9375em}
426
+ .hide-on-print{display:none!important}
427
+ .print-only{display:block!important}
428
+ .hide-for-print{display:none!important}
429
+ .show-for-print{display:inherit!important}}
430
+ @media amzn-kf8,print{#header>h1:first-child{margin-top:1.25rem}
431
+ .sect1{padding:0!important}
432
+ .sect1+.sect1{border:0}
433
+ #footer{background:none}
434
+ #footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
435
+ @media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
436
+ </style>
437
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
438
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.3/styles/github.min.css">
439
+ </head>
440
+ <body class="article toc2 toc-left">
441
+ <div id="header">
442
+ <h1>Brick Engine JS Documentation</h1>
443
+ <div id="toc" class="toc2">
444
+ <div id="toctitle">Table of Contents</div>
445
+ <ul class="sectlevel1">
446
+ <li><a href="#objective">1. Objective</a></li>
447
+ <li><a href="#key-features">2. Key Features</a></li>
448
+ <li><a href="#getting-started">3. Getting Started</a></li>
449
+ <li><a href="#publishing-your-game">4. Publishing Your Game</a></li>
450
+ <li><a href="#structure">5. Structure</a></li>
451
+ </ul>
452
+ </div>
453
+ </div>
454
+ <div id="content">
455
+ <div class="sect1">
456
+ <h2 id="objective"><a class="link" href="#objective">1. Objective</a></h2>
457
+ <div class="sectionbody">
458
+ <div class="paragraph">
459
+ <p>The <strong>Brick Engine</strong> is a modular, TypeScript-based game engine designed for creating retro grid-based games (like Tetris, Snake, Breakout) that run in a browser. It leverages <strong>P5.js</strong> for rendering and simulates the experience of a classic handheld gaming device, complete with a dot-matrix style display, a HUD (Head-Up Display), and physical button controls.</p>
460
+ </div>
461
+ </div>
462
+ </div>
463
+ <div class="sect1">
464
+ <h2 id="key-features"><a class="link" href="#key-features">2. Key Features</a></h2>
465
+ <div class="sectionbody">
466
+ <div class="ulist">
467
+ <ul>
468
+ <li>
469
+ <p><strong>Grid-Based Logic</strong>: Built-in support for 2D grid management, collision detection, and row/column manipulations.</p>
470
+ </li>
471
+ <li>
472
+ <p><strong>Retro Aesthetic</strong>: Simulates a physical device with customizable colors and responsive layout.</p>
473
+ </li>
474
+ <li>
475
+ <p><strong>Modular Architecture</strong>: core functionality is split into distinct modules (Grid, Control, Renderer, State, Text, Time, Score) for clean separation of concerns.</p>
476
+ </li>
477
+ <li>
478
+ <p><strong>Input Handling</strong>: Unified control system supporting keyboard and on-screen button inputs.</p>
479
+ </li>
480
+ <li>
481
+ <p><strong>Game Loop</strong>: Separated logic ticks (game speed) from rendering frames (60fps smooth animations).</p>
482
+ </li>
483
+ <li>
484
+ <p><strong>Debugger</strong>: Built-in real-time state inspector. See <a href="reference/modules/Debugger.html">Debugger Reference</a>.</p>
485
+ </li>
486
+ </ul>
487
+ </div>
488
+ </div>
489
+ </div>
490
+ <div class="sect1">
491
+ <h2 id="getting-started"><a class="link" href="#getting-started">3. Getting Started</a></h2>
492
+ <div class="sectionbody">
493
+ <div class="paragraph">
494
+ <p>The fastest way to start is using the <strong>Brick Engine CLI</strong>, which scaffolds a complete project with build tools, standard scripts, and a boilerplate <code>src/index.ts</code> ready for development.</p>
495
+ </div>
496
+ <div class="listingblock">
497
+ <div class="content">
498
+ <pre class="highlightjs highlight"><code class="language-bash hljs" data-lang="bash">npx brick-engine-cli init my-brick-game</code></pre>
499
+ </div>
500
+ </div>
501
+ <div class="paragraph">
502
+ <p>For a detailed walkthrough on installation, project structure, and how to implement your game logic, see our <strong><a href="getting-started.html">Getting Started Guide</a></strong>.</p>
503
+ </div>
504
+ </div>
505
+ </div>
506
+ <div class="sect1">
507
+ <h2 id="publishing-your-game"><a class="link" href="#publishing-your-game">4. Publishing Your Game</a></h2>
508
+ <div class="sectionbody">
509
+ <div class="paragraph">
510
+ <p>Once your game is ready, you can bundle and publish it directly to the Brick Engine library using the CLI. This will submit your game for review and make it available in the main engine menu.</p>
511
+ </div>
512
+ <div class="listingblock">
513
+ <div class="content">
514
+ <pre class="highlightjs highlight"><code class="language-bash hljs" data-lang="bash">npx brick-engine-cli publish</code></pre>
515
+ </div>
516
+ </div>
517
+ <div class="paragraph">
518
+ <p>For detailed information about the publishing and review process, see the <strong><a href="publishing.html">Publishing Guide</a></strong>.</p>
519
+ </div>
520
+ </div>
521
+ </div>
522
+ <div class="sect1">
523
+ <h2 id="structure"><a class="link" href="#structure">5. Structure</a></h2>
524
+ <div class="sectionbody">
525
+ <div class="paragraph">
526
+ <p>The engine is organized into the following core modules:</p>
527
+ </div>
528
+ <table class="tableblock frame-all grid-all stretch">
529
+ <colgroup>
530
+ <col style="width: 25%;">
531
+ <col style="width: 75%;">
532
+ </colgroup>
533
+ <thead>
534
+ <tr>
535
+ <th class="tableblock halign-left valign-top">Module</th>
536
+ <th class="tableblock halign-left valign-top">Description</th>
537
+ </tr>
538
+ </thead>
539
+ <tbody>
540
+ <tr>
541
+ <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="reference/modules/Game.html">Game (Core)</a></p></td>
542
+ <td class="tableblock halign-left valign-top"><p class="tableblock">The central orchestrator. It manages the main loop (ticks and frames), and coordinates dynamic game loading and transitions via an instance-based switch handler.</p></td>
543
+ </tr>
544
+ <tr>
545
+ <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="reference/modules/GameGrid.html">GameGrid</a></p></td>
546
+ <td class="tableblock halign-left valign-top"><p class="tableblock">Manages the 2D grid data structure. Handles cell values, colors, row/column operations, and collision detection. Includes <code>GameHudGrid</code> for custom HUD content.</p></td>
547
+ </tr>
548
+ <tr>
549
+ <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="reference/modules/GameControl.html">GameControl</a></p></td>
550
+ <td class="tableblock halign-left valign-top"><p class="tableblock">The input system. Abstracts physical keys into virtual actions (UP, DOWN, ACTION) and provides an event subscription API.</p></td>
551
+ </tr>
552
+ <tr>
553
+ <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="reference/modules/GameRenderer.html">GameRenderer</a></p></td>
554
+ <td class="tableblock halign-left valign-top"><p class="tableblock">Handles visual representation. Draws the grid, cells, and UI elements to the canvas using P5.js.</p></td>
555
+ </tr>
556
+ <tr>
557
+ <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="reference/modules/GameState.html">GameState</a></p></td>
558
+ <td class="tableblock halign-left valign-top"><p class="tableblock">Tracks global game properties (playing, paused, score) and supports state persistence.</p></td>
559
+ </tr>
560
+ <tr>
561
+ <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="reference/modules/GameText.html">GameText</a></p></td>
562
+ <td class="tableblock halign-left valign-top"><p class="tableblock">Specialized renderer for drawing retro-style pixelated text on the HUD and main display.</p></td>
563
+ </tr>
564
+ <tr>
565
+ <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="reference/modules/GameTime.html">GameTime</a></p></td>
566
+ <td class="tableblock halign-left valign-top"><p class="tableblock">Controls game loop timing, separating logic updates (Ticks) from visual rendering (Frames).</p></td>
567
+ </tr>
568
+ <tr>
569
+ <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="reference/modules/GameSound.html">GameSound</a></p></td>
570
+ <td class="tableblock halign-left valign-top"><p class="tableblock">Manages audio playback using the Web Audio API, supporting simultaneous sounds and volume control.</p></td>
571
+ </tr>
572
+ <tr>
573
+ <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="reference/modules/GameScore.html">GameScore</a></p></td>
574
+ <td class="tableblock halign-left valign-top"><p class="tableblock">Tracks session score, level logic, and syncs high scores with <code>GameState</code>.</p></td>
575
+ </tr>
576
+ </tbody>
577
+ </table>
578
+ </div>
579
+ </div>
580
+ </div>
581
+ <div id="footer">
582
+ <div id="footer-text">
583
+ </div>
584
+ </div>
585
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.3/highlight.min.js"></script>
586
+ <script>
587
+ if (!hljs.initHighlighting.called) {
588
+ hljs.initHighlighting.called = true
589
+ ;[].slice.call(document.querySelectorAll('pre.highlight > code[data-lang]')).forEach(function (el) { hljs.highlightBlock(el) })
590
+ }
591
+ </script>
592
+ </body>
593
+ </html>