littlejsengine 1.5.2 → 1.6.4

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 (72) hide show
  1. package/README.md +155 -33
  2. package/{engine/index.d.ts → build/littlejs.d.ts} +14 -6
  3. package/{engine/engine.all.module.js → build/littlejs.esm.js} +110 -99
  4. package/build/littlejs.esm.min.js +1 -0
  5. package/{engine/engine.all.js → build/littlejs.js} +102 -97
  6. package/build/littlejs.min.js +1 -0
  7. package/{engine/engine.all.release.js → build/littlejs.release.js} +95 -95
  8. package/examples/breakout/game.js +5 -0
  9. package/examples/breakout/gameObjects.js +41 -48
  10. package/examples/breakout/index.html +5 -4
  11. package/examples/breakoutTutorial/README.md +514 -0
  12. package/examples/breakoutTutorial/game.js +181 -0
  13. package/examples/breakoutTutorial/images/1.png +0 -0
  14. package/examples/breakoutTutorial/images/10.png +0 -0
  15. package/examples/breakoutTutorial/images/11.png +0 -0
  16. package/examples/breakoutTutorial/images/2.png +0 -0
  17. package/examples/breakoutTutorial/images/3.png +0 -0
  18. package/examples/breakoutTutorial/images/4.png +0 -0
  19. package/examples/breakoutTutorial/images/5.png +0 -0
  20. package/examples/breakoutTutorial/images/6.png +0 -0
  21. package/examples/breakoutTutorial/images/7.png +0 -0
  22. package/examples/breakoutTutorial/images/8.png +0 -0
  23. package/examples/breakoutTutorial/images/9.png +0 -0
  24. package/examples/breakoutTutorial/index.html +10 -0
  25. package/examples/electron/build.bat +52 -0
  26. package/{electron → examples/electron}/electron.js +18 -21
  27. package/{game.js → examples/electron/game.js} +1 -1
  28. package/examples/electron/index.html +2 -0
  29. package/examples/electron/package.json +20 -0
  30. package/examples/empty/game.js +11 -1
  31. package/examples/empty/index.html +2 -2
  32. package/examples/module/game.js +1 -1
  33. package/examples/module/index.html +3 -2
  34. package/examples/particles/index.html +3 -2
  35. package/examples/platformer/gameLevel.js +1 -1
  36. package/examples/platformer/gamePlayer.js +1 -1
  37. package/examples/platformer/index.html +8 -7
  38. package/examples/puzzle/index.html +4 -3
  39. package/{build.bat → examples/starter/build.bat} +17 -17
  40. package/examples/starter/game.js +111 -0
  41. package/examples/starter/index.html +27 -0
  42. package/examples/starter/tiles.png +0 -0
  43. package/examples/stress/index.html +3 -2
  44. package/examples/typescript/game.js +89 -89
  45. package/examples/typescript/game.ts +11 -11
  46. package/examples/typescript/index.html +3 -2
  47. package/package.json +4 -4
  48. package/{engine → src}/engine.js +1 -2
  49. package/{engine → src}/engineAudio.js +11 -11
  50. package/src/engineBuild.bat +132 -0
  51. package/{engine → src}/engineDebug.js +8 -2
  52. package/{engine → src}/engineDraw.js +19 -15
  53. package/{engine → src}/engineExport.js +8 -2
  54. package/{engine → src}/engineInput.js +54 -58
  55. package/{engine → src}/engineMedals.js +1 -1
  56. package/{engine → src}/engineObject.js +4 -4
  57. package/{engine → src}/engineRelease.js +1 -0
  58. package/{engine → src}/engineUtilities.js +4 -4
  59. package/electron/electronBuild.bat +0 -32
  60. package/electron/electronSetup.bat +0 -2
  61. package/electron/package.json +0 -21
  62. package/engine/engine.all.min.js +0 -1
  63. package/engine/engine.all.module.min.js +0 -1
  64. package/engine/engineBuild.bat +0 -127
  65. package/index.html +0 -26
  66. /package/{tiles.png → examples/electron/tiles.png} +0 -0
  67. /package/{favicon.png → examples/favicon.png} +0 -0
  68. /package/{engine → src}/engineFont.png +0 -0
  69. /package/{engine → src}/engineParticles.js +0 -0
  70. /package/{engine → src}/engineSettings.js +0 -0
  71. /package/{engine → src}/engineTileLayer.js +0 -0
  72. /package/{engine → src}/engineWebGL.js +0 -0
@@ -0,0 +1,10 @@
1
+ <html><head>
2
+ <title>Little JS Breakout Tutorial</title>
3
+ <meta name=viewport content=width=device-width,height=device-height,initial-scale=1,maximum-scale=1>
4
+ <meta name=apple-mobile-web-app-capable content=yes>
5
+ <meta name=mobile-web-app-capable content=yes>
6
+ <link rel=icon type=image/png href=../favicon.png>
7
+ </head><body>
8
+
9
+ <script src=../../build/littlejs.js?126></script>
10
+ <script src=game.js?126></script>
@@ -0,0 +1,52 @@
1
+ rem Simple build script for LittleJS by Frank Force
2
+ rem Minfies and combines index.html and index.js and zips the result
3
+
4
+ set NAME=game
5
+ set BUILD_FOLDER=build
6
+ set BUILD_FILENAME=index.js
7
+
8
+ rem remove old files
9
+ rmdir /s /q %BUILD_FOLDER%
10
+ mkdir %BUILD_FOLDER%
11
+ pushd %BUILD_FOLDER%
12
+
13
+ rem copy engine release build
14
+ type ..\..\..\build\littlejs.release.js >> %BUILD_FILENAME%
15
+ echo. >> %BUILD_FILENAME%
16
+
17
+ rem add your game's files to include here
18
+ type ..\game.js >> %BUILD_FILENAME%
19
+ echo. >> %BUILD_FILENAME%
20
+
21
+ rem copy images to build folder
22
+ copy ..\tiles.png tiles.png
23
+
24
+ rem minify code with uglify
25
+ call npx uglifyjs -o %BUILD_FILENAME% --compress --mangle -- %BUILD_FILENAME%
26
+ if %ERRORLEVEL% NEQ 0 (
27
+ pause
28
+ exit /b %ERRORLEVEL%
29
+ )
30
+
31
+ rem build the html, you can add html header and footers here
32
+ rem type ..\header.html >> index.html
33
+ echo ^<body^>^<script^> >> index.html
34
+ type %BUILD_FILENAME% >> index.html
35
+ echo ^</script^> >> index.html
36
+
37
+ rem delete intermediate files
38
+ del %BUILD_FILENAME%
39
+
40
+ rem copy elecron files to build folder
41
+ copy ..\electron.js electron.js
42
+ copy ..\package.json package.json
43
+
44
+ popd
45
+
46
+ rem build with electron
47
+ call npx electron-packager ./%BUILD_FOLDER% --overwrite
48
+ if %ERRORLEVEL% NEQ 0 (
49
+ pause
50
+ exit /b %ERRORLEVEL%
51
+ )
52
+ pause
@@ -1,18 +1,13 @@
1
1
  // Modules to control application life and create native browser window
2
- const {app, BrowserWindow} = require('electron')
3
- const path = require('path')
2
+ const { app, BrowserWindow } = require('electron')
4
3
 
5
- function createWindow () {
4
+ const createWindow = () => {
6
5
  // Create the browser window.
7
6
  const mainWindow = new BrowserWindow({
8
- useContentSize: true,
9
- width: 1024,
10
- height: 576,
11
- webPreferences: {
12
- preload: path.join(__dirname, 'preload.js')
13
- }
7
+ width: 800,
8
+ height: 600
14
9
  })
15
-
10
+
16
11
  // hide menu
17
12
  mainWindow.setMenu(null);
18
13
  //mainWindow.setFullScreen(true);
@@ -27,20 +22,22 @@ function createWindow () {
27
22
  // This method will be called when Electron has finished
28
23
  // initialization and is ready to create browser windows.
29
24
  // Some APIs can only be used after this event occurs.
30
- app.whenReady().then(createWindow)
25
+ app.whenReady().then(() => {
26
+ createWindow()
31
27
 
32
- // Quit when all windows are closed.
33
- app.on('window-all-closed', function () {
34
- // On macOS it is common for applications and their menu bar
35
- // to stay active until the user quits explicitly with Cmd + Q
36
- if (process.platform !== 'darwin') app.quit()
28
+ app.on('activate', () => {
29
+ // On macOS it's common to re-create a window in the app when the
30
+ // dock icon is clicked and there are no other windows open.
31
+ if (BrowserWindow.getAllWindows().length === 0) createWindow()
32
+ })
37
33
  })
38
34
 
39
- app.on('activate', function () {
40
- // On macOS it's common to re-create a window in the app when the
41
- // dock icon is clicked and there are no other windows open.
42
- if (BrowserWindow.getAllWindows().length === 0) createWindow()
35
+ // Quit when all windows are closed, except on macOS. There, it's common
36
+ // for applications and their menu bar to stay active until the user quits
37
+ // explicitly with Cmd + Q.
38
+ app.on('window-all-closed', () => {
39
+ if (process.platform !== 'darwin') app.quit()
43
40
  })
44
41
 
45
42
  // In this file you can include the rest of your app's specific main process
46
- // code. You can also put them in separate files and require them here.
43
+ // code. You can also put them in separate files and require them here.
@@ -103,7 +103,7 @@ function gameRender()
103
103
  function gameRenderPost()
104
104
  {
105
105
  // draw to overlay canvas for hud rendering
106
- drawTextScreen('Hello World', vec2(mainCanvasSize.x/2, 80), 80);
106
+ drawTextScreen('LittleJS Engine Demo', vec2(mainCanvasSize.x/2, 80), 80);
107
107
  }
108
108
 
109
109
  ///////////////////////////////////////////////////////////////////////////////
@@ -0,0 +1,2 @@
1
+ <body><script>
2
+ eval(Function("[M='DYhuJzCBV~LKby?Vt_b^ejSdE[eOF]^xwJzztBUSE|iPNBKKb?dBsnnlAtsdW{Bah}DrNQBAvepYbgAd|MkbArM~O||rTzOp@j@plQJwXWvVhjJOIAP]qltDKs]}eKr_hNM[lCb@AimlGZse}EkgtrHOvPEpL_wCglz}RRMIaRQzRhG{}zBgw@o]PR]~GKdRJGuuTSzzixXpGA}gRynsIAu{Sw{F}R|LIG@CsRCM`JUJvCzAYYZu@oL[I|WDTw|soA_N|ancvowsba{YWMEFfRfNMYRp_TvI~Fx`ZQzun_?[FQ@j?nsDgS}HlS_G~]h^vAvy^dSsvmUzvoHPLSdEgeGgYV{KTFMcq?byagUHA{yNhjvosWF|JY}?fQEbD}OjGVwx^c}OMOl^bWOui^[Ivg[jsXiPsH`v}AUS`pXxUJz]hAOQhlYOCMUceMnrGhge|EkH{?WpWojSpLiJRRVcNwXKw{JXRZgzX]gQ@etO^dYcUGvirBooulMfYq@JovQKWTOHCIDd`K?junfya]tnwNmtrCnEB{FBvcPIR|p|]apt~LzVZ`uIsSeaTtTVKi[|LYGO[ML_ulpHJ?QteSYjISIHNzI~mePARzyvRJcPtslrQgXO`fAyNNzFJ{abI]jpXTnT{YFRvrJAZnOzUaRuTX?uAkmmeJpZJmvyULO@`p@R}[t~qOlHB_TqPslYp|R^ftUiccRghndwglFSLpBAa[g}cKvx|HibXgWlIGXsGIHCa_f[tS?]eiZq^dtAhlWJffyPW]n|D[zRUFIAdi_iVHNQfkSn@QdEqqhUEgzE{pCpfnhacZJWV[MOjtdQq_ZMcC@pwJwmnFt^HK^tEOUeu{nl[wvQqf{SE`UhYtcDsdLALAbt`qDfmeZ`Gyj_iWv_[?}SPzvE[AtFJ^_X?pq|SjuuYFSkniQYdhaUmNmvDtHn[DTt{TIE}NtkDvi~?bd~RAu|fK^?lOvUUv]AWT?Ui]^_Z{kytzlQ@rhR`_OTEnDFk[bDtj|uyttWJ_VkirTg]WBlS{[om@LudgyTdJ^MNdmXo^lRP`e`kKtZVD|YGFqjGCYQH`EpErSwlhtYDgRUwujfAXWXJI|NDwQ|OApShIKEJJeOcBUbchxxQ^}gcH?gbfNYwk~{|]LScUWE`Gzv{hx^FyioJP[^_CMUeICIIdroIVKkR}xTKYDLqUzfl{XVao`@zbtAlV{?mOXelBkgKeQuwqPWbf^PM]ahX]{IFKYF@b_VE_vFs[ct~l?CA_}mZV^aoMAdYCOU`PDjYFEwqxxUHWzpnY@?H~GagutCltWqq{zsWds^jkN{`z{Pp}pZCnyfV^tLhLE|ydFFDytCUAIghmjfWqbH?ma]_gRnYJsboB{nQSoIVYVrqHLO`mzC{QkZojEUA`FLfOKzM_mQommrT?yezZeYPodczzc_aQuQrBSNeQ@Kitt^QKmf@]KKHjygOxxYH?B^UgPp]zXK[xffIt`jHIFw?zfy~|m`KpIyJ{{nwW@TqacRjViIfW{UKT@mYNZWOTUeckbaYMnJ~h|}y_?a{nnE_s?GV_tWBqSPr?gqq@wfIZWLCA|CAN_MvkhvcnQhKZsBrmU^w[D|YNf}_nZJwNXM{Dw?PDY~rusf_Nrm{NyzSY}qt|y]mPgPRl?SliU@CxtCFf@ZNP`gg|g@FsI^mUayJjOK~doq~|GuDt`PwKMWyb}|~iklbESGhcS?a~zT_a]yTKpMi?Llrs@bQ_L|xh?wUOpuXkZoSzWDvwmyg[ggMnEAAr_w?Fctw|EHql|OGtTRN{XBWxdvVsiEwZkGFD|{WspkNjMSV[nxYmppwBVb]tlZReEPHhIDZfHgEZemYtiXft_}_sOEnA~U~`awBrmQ`W[[jaOu@Fp_dtyZc]|BR{[jSOy}SA]?sfaRz[jwiMufnOLOBKalL`JiYH]YUQMkwJuqvd[lPcZt[Ek?r`TkRDTXBszW}QszISPMPzj]l}ALBP?coK[M}QMu|wHvPrMNPA^vCUGbGeCBhF|SgQeVptFfDMWrpc@Taj~WpCNPzwvBSSY`ccans??UzK^adxVBOtiNdoZmqaJ]T^RkMfPuxlyn|YUcdf[AQWqOVGUTUSz_CROMCRtM^WCCCcFo}o@bH[J{l?wUM[soFzKgJRpv[FCLYRXOd|bdqfd?AAwYCSeZkbWj~SoXDi`xRUyQWQX_j@GuxZkjxN^RZgfd~~|N`gBA]kJ^jLTZxlNV]N`_urbSf|Yt?prXcvhiS?hfbamVv{LPqhim{]bCM}OA}^DYjrDsrFIsSDvhCKLu^]`vKo{tWV_FdyqpUPIKgN`Qa[GaKuKvF?kcEhJvS[ypCruGUVHmk^xG_Q@HXMmpiaKvf?UjJ{icwDQrrq{UYw_DmVFzhHqzUUi?o_~VRU_HxKdUm|y`dvA^{Ai`tnSdO@YsBWAIBflM?UvLR]vTf`TcMoc`fVGNWIkTJsfMkDMzHIJcuC^ASrCabcl[?QfonyEFyogsunyRacV{CgFm[hynYFecGgAdftoVsZJNdPCRDkk[UUMWq_Pox`Xk{HeeROyfq`?rCg?JIrtnO@Ns{Tm{@r|}gExLpF|JgzZV~eliS?zT?y~CxIIZ?[_SRbJcO@_kdVJOWwZNAUFEVBBgxK_xhkGZa_JxymZlCAaygyaf?dIo]m}Wgpf~K_]bAQgOwnJ{k{XmHGGyePZsjd{?OvUCG_zrjAo{Uo_QyCJzWJ]wf|_FIYQxgrdqjv~lcItCWI}sAyqPX]RlX?FJjKUBJKccMPWcgp[`YALWnUJpmyp`oqB~IP@zOZZpz`b_xMG}dCNuxsaRgsqIv?cGPWEFWeBIFPQ@l}OVPbwvrGvkPBZ?jRyrh^i{gO@?wqvzGHzFnAPw}mkpzvJWrNQfLof]WL[}?nXSz_ADPjhQcG_aGS[|@DYJqMX?O^NqUQ^Bi@d~}`fhleXD?L~J|NzlkQoJCBMWvwgzMhAXqxIbIgNf@?vroNXhzJ?@oUShEqi}LAyTp|cYKyjf|Vs[wbGDfkegITHOozosxloZdxlFmE_?pjFMZMrR]DbjdzXPzNYT}@rPKDwY^_WWgNRYtoIETZhvzXP[wa|tWKTwF^KogSPW{o?[N}AyT`GtdzSErko?DtjzKBJdWXugT~s`rW~|TjTCTgCeD|Fu_YsR]VXmUOxBVVY|GMNC`BhQltZtz`YsG?k_DXUfSGKMSYlhiabhMLOyYJfUlR_|RRzFmb@FQxZO`wlGQP^FxEE`?l~n~W`DNYmbnz_pnZZaDG|_YeeF[wqjSVu{^BMQg}wpp{J_qyLlzMrTY|HDTN`QzoQuHeaktwqmPOg[Z[cEzjmQyF][qtCQ]NPJk~jZkDRDej]yk^tLJmRJZsEBh{Sa]Md^D|EI~yCSNMqAjn?BMwuXNe|KnjSXrmPThgj_hc^B_SficQw|T@SSgzBygIwDtvEqDRlTB}hA@mZUW]g`dfbtEsR?rWqWkVp``InYlyoerOtU?okUZV?jK}CPWw?Onq?^IezHJTqBASonkuD{_GzqZ[aSMZPhvBnpQYII~VT}JPxgQUZShecdMcDNYjemVgIF|~dnM[{@~~QDAcCeK_QLSx|BFIC`esdZmo??xI]~p|uRcQY_Q}LlzWioticXqY?pNOWNhOW_q{sm[?NLoivJcl~qDRwFM_dTK[j@^DF[bFY`sEVhUq[miWk[xV?RM?KVNSG^f_qnvRxN?zMwCaxwZNvw@ohtzk^gDC`Z_]zUHnOFLr~ZhGFYIYyWOl?IbAKVJcKtj@~ToUxGCDDZIx?nd?iOV^uh{dsRWtva?faEhvImhRbneQWoSCPFu}[Hb]XrcDOqkVbkyIazdpDcAaCxYW]jmcQhOsE|b[}CdczX^J}yKGjtAJAWsgGSV~ntNxtmYJEhbh{u[HKv_kPDhZt?oGT~V}dLsPWWCpT|qtGix|mfU`rFh`ir{bTgskDf]FZ}NZXJiAVUNaiIwkuskx~}u@djezJXzq?LBA^_dCIW@XW|t`bouxD|ACJvpChHVp[|wD]FpB_~~lV_Pz[|_s[ku^wAzh[{qm|W~K@OBK@vlDG|Y|RelcMQKvtmmdVGQ}OCFexbHzJR}Y}akNvONeOxcZ@JhVUC{dcXndDvsG[ytriKIdRIwVJgQ]wX?Cg~aTXtDcvVM^Z``tLyH~Ez~BRKDBplY`tnvS_w|RmGBQ[Yh_Q[ftvHMPpFoUR|cAGAjKj^[Ht@cD}ruQOpnTQhpYC`@yKdJPaSbIRv}VfCbYDE@BUuqaM?AFYo_ZGM]{ndLiLzrQsYWIUrisBQBBBOf_ImzH@|}xU}yC~ry`mbSlHgnMDKqFIRFqKZ?CXUToMcveLQaQ~]|OPC[[tfFvu{V^h]s[G{l?O`Y}kBnJk}XPy`ldz^Ktur?CEWVfWkgLMzS`usxxfDEuN`UHbfikOU~YG]lDfAlv]Vctn`KxS~v|ALhjCSZEHC}NwYuRIyjgYQUtp]lMAGyQNqFLfyMiHnK`SyMdXOofrwQg_VMKJgP@QtWto@v]qAGxbJDh_MVJJZRASfi@GjM]TwzgaM^zyLke~eYnHcq_ZBr`RKoeq~pauJETAgraal?EdOgqRfcjcpBExanDBdw[YYj]p@nRyCcBFx_STvj~nMeXGyEslPfCQJm_acS|}OvEeYanDQSEVzFbVIWvNnIxjPT_NXi@y]IkSGiFmu^lq`pKB_UpFoSmKkufT[{^i?rccrmoGMVtYjcOZolZdgUwKI^voQfjNd}LxukpVjx~VqN|nyLUBY^qAqn`^?phzGoiRhx_c?btr^AFByUK]wNtGGrkfsXpjjLUCe?O}iCqbnwBNXjrrVFPgKtBKMUnpaYdj@acAua[PeU]n_U?tpDMoepGZhPcuB|IynrfSCKNkzftCqZ?ti~jKOHBRM}jWza^cVFRXnzK?tL_TFmqSsqMfIAPINqLDqQy}YZGuhyzyb|OLj~vfgRfEfv?usSOLsF`[uUcJY_gnaKF?dXNvDEFQWqDbSBpi~ZCQEUy_hd@Owm^YKt_BIXv@NDk[jxRMWICW~GD[`sTQLGv`gPyUbmDdDO}OdbKvwzLoDKavDJRgQwnHIMe?u|xtBo?eqqSPMgwfzyatUiSnBnEuToTwb]cbrRQQ^uAIPswLp|hKaPWk^`MKhE^auir{sJNzqptiGN@Iz@~X`O`JuL?efbeF_k][dvHESTkxn^HnXUsxPbI?lE|EDbKmCRL~NprItUGvq~q{qBp]njD[yctdo^JxjZFSrgHwDouGkqHxgg}mj{noEHzfmb~JSVzIoyAlzwtmQbL~OdZWRZ`mpUDKagmcvNmne[jP|nxCJqzUgLXJBmGG~?a}uDTGbIqsC@u]VfgPVgbg[xto`zeQ_nXRbwY}K~|n`yKeSBFswLA?oCOdiwmc?YwcVGvitUWIjVSawT~Yh`NXx~Jr?HRf}LqVExCisFu|@KvWGETo]?[Xviep^tXQlsS|xschkIzdVzNdgf?ZcwsXX]RanjaebtW[Ujl|^BOlkwK`CTOkvyC?N@EnuWVN]X?oUwlhJVyZAVLmLW]P_vrZoZ}O]vFrWBXwz{lU]XVwrPx]khjwUuv}xUAfaVgfEwv[JgiUpxIIfr}??wIhnnNvMtbmq[hDkfgfTaInXGW[WW?@nnaDVLbGRvFXDSZHcjoMrwbZ`BQCegnD}NJjtNR`[AfJjVAfwrWLnVftTcVYUNCFb[n}[yyEEFSHNllFBh@c^^t?bQDld}OlyIxKwTv[BnLENhKGrHITL^|waFPlQsa]soPPFxON}UKWy^yvyKe]WuqWb]xaGAbPL@tGyLknI_AfSAj^YD?tlORYT_Go`AdJXhJkgiIAhIzV`^ZsyCagoORq`yviJcbAJKuuiE}c{WeoI_mjcjLQtfwgGIYzYGsTE@i@IrvgUj[U[DzmS|bH?DDeDldazEsXBLlqf[uUeYPtq`tLUvkIs~a`HiXFac~WV@t[[eAnLWcpvASBOYiRLCdyCLwpBQXwXGJorQcyNTQkBQQ][rYy~p^RCj~ELPkV`aka}aNSLpyDydUGrC@zG?wSlIuvQjaZH}~tIgYYvrfXIaMHvMg}@~xgr[NKsgUpGcGBwVcRmjw@@NFaGY[|WyQkF_n^~rGpcDr?fqBEq~ZoagW[wCMirZB[l}~hSX^XzCyabfiLXPkbDplwGdIzJPNPQb@BtN^Wmh[?]dMeCkwa@VQSeQCkEQwKBpuZ_ClD}E_sEr?B`_rupxp?ckRsn~Cfoxji^Tucc@}nKCFrW@gHe?Cxd@}SlS@iX^aTzMY_CK@o|nr}{y@qXsgRJ`ItgUP?yvnaIxTr{AfplV}cvEVUeUFPtFD?g_imZ^tw]vHcFclKsqvOYdgJl@hlOrNN|zniXkJMqiSvtnn~AUyuOheTwX_tLz|_cfikR{IEyRw~OuCf[]IAT[PPKIOnc|IAsec^cFwcoeIHFFUQAyRIUAEDzngxosbFd@NEJzFGQCGwWKJNmBwZ_F}OA}MKzIE@LAfAXcp}fNBNCTpGgmV[BaoDIvOd}h~@^N@WD?w|s[i[B@Pv_ZMCzk^qBbNuVzjYWscbJfQVPn|mCKrrazm]QAVS?mfw^vGf]b@N?xA@~b{fily@]f_F@FW|DdLsFng?rdE`PftgWBH^rYn@f`zAZanDdBXkAplT}mpcokSIVfmHbvKNmYblbBu^OYJQqKFHgRwuYfOnvvaSuXBUWS?^Bzkto^gbv?YlP@lnWGEayDQsaqu_fm{WcoCleS@axo~[FqMaUfIikX~vssKAzyevpoHmLGKFfus|tfroqyXJMJ|{`MNrg}Rf`T]weSQIPnD~L?mRfT^ciedQ~BK]?`OcBE~B@j]`D?OF]GPfIwnlX|jgopQQNgqMZkqAjz}ZYDnsBPlyYigZEy[Gfdi@{afvogVO}du{f}j]Eto@si]yf?dVr[yaSIXBrxWiSRxa_BG_pADKsF]|`mLGUHdE_Z}moOXKMbwpzi[XfYTQ_QrdN[pyowYJue|{xLgVdI}{?njX`^MwWV@LWAanGO|u`V?`Da{JAT?HvoL|sDTeeZxSf@hIqwRLrlQGONq?lOCeoAIF?I?AOdg`MxyfyKyyXEjsv[r^Uq?Wj~CoRvTjjxausxHB`CwauprXOle`IpYdsOg]F?iDz]hTSp[_FhmUkRGy]f^dS?fJYFYYgaYSi_DUbNWMSYJfdheVFdw[I}WjP_GMD^LMn~pGQytBn~Qe}aT^VeM_E{M`mNA^{orkcdMy?DToGNLtF[oPbBCd|BmXn|ynz@noy~b}|mGEOQ[f_Dx`JxhL]?DZuvdEpd[f]z|b{xCkFirFxdK|ZAOofbKYngwAEKeaPsFEg?Q`vgkb}`rmuz^f`hvVpOjtjqtcXmhq^W@uRPNnqcmVhp`HJ@WuUIOmpc?`CE??ewy}gAEcMUjY^MqrtQrfoQhqbx]lrHn`cAG|cI`rHF?_?g]HXG][~BcjDigTFkgkW[geovnUFARvz[i?]EV{rIAJ}Rna@_L[vdrd{QlbHs[FlJKpRXlyPp`zeNYoT_am]YOkJiWZBBhb~tvANUcsy|mmj]X|cUdkwIW|vGFUselsg?QFjk?lI[XUr|je@~`NWwJhFHG`ek}TX?UcezDgU]TcMdRy{rq}r[||oBIAXjFtKx_?rXhiVN|dwuVFbfVMsBzfpq|Z|bKRifQ_Bp@mY_]dt{lMB`vDGs~aBKNS@DQ{trAl^^nO_BSb{nZ]AuCZGN@cDPYL{ZJpPvR[PUgoLncXbMpgucJjgETBi[hhmpzbw@TjvZOP]EhFcH{g]HWOmSOBkEjXCkvO`gZSL?NW}PBGqaObGE]Qw[UZtEv~xLk@^~oSXWBaOmjnNQYh^H~KQbhox?X{uNa}aJJf}Qc~`}_MtvjXcNr@?VafbhkRFJqCSFe``I{yqFMjmUVB^fau~}ieSUcEOe`l?VWThanHwXPU`fGHFruFQm`h~`{|GVHv~_Wbz_v]`_TLuGYp_RZvFtTn@@PUTSMWXRNnoEaYKNT{sqQIHt_UUvA|ziPqvbQi~t@s]QmrQaYxpIFHqdYxsRSrUb^GhDk`@wYE^JFABqmjKtkWwWkWfMM}Yj~bvgd`WQYefZg}YqJ'",...']charCodeAtUinyxp',"for(;e<13590;c[e++]=x-128)for(x=1;x<128;n=p.map((i,y)=>(t=r[i]*2+1,t=Math.log(t/(h-t)),A-=a[y]*t,t/750)),A=~-h/(1+Math.exp(A))|1,U=o%h<A,o=o%h+(U?A:h-A)*(o>>13)-!U*A,p.map((i,y)=>(t=r[i]+=(U*h/2-r[i]<<17)/((C[i]+=C[i]<5)+.1)>>17,a[y]+=n[y]*(U-A/h))),x=x*2+U)for(p='010202103203210431053105410642065206541'.split(A=0).map((i,y)=>(t=0,[...i].map((i,y)=>(t=t*997+(c[e-i]|0)|0)),h*512-1&t*997+x)*12+y);o<h*512;o=o*64|M.charCodeAt(d++)&63);for(C=String.fromCharCode(...c);r=/[\0-]/.exec(C);)with(C.split(r))C=join(shift());return C")([],[],1<<13,[0,0,0,0,0,0,0,0,0,0,0,0],new Uint16Array(51e6).fill(1<<11),new Uint8Array(51e6),0,0,0))</script>
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "LittleJSGame",
3
+ "version": "1.0.0",
4
+ "description": "A minimal Electron application",
5
+ "main": "electron.js",
6
+ "scripts": {},
7
+ "repository": "https://github.com/electron/electron-quick-start",
8
+ "keywords": [
9
+ "Electron",
10
+ "LittleJS",
11
+ "Game"
12
+ ],
13
+ "author": "GitHub",
14
+ "license": "CC0-1.0",
15
+ "devDependencies": {
16
+ "electron": "~25.2.0",
17
+ "electron-packager": "~17.1.1"
18
+ },
19
+ "dependencies": {}
20
+ }
@@ -7,27 +7,37 @@
7
7
  ///////////////////////////////////////////////////////////////////////////////
8
8
  function gameInit()
9
9
  {
10
+ // called once after the engine starts up
11
+ // setup the game
10
12
  }
11
13
 
12
14
  ///////////////////////////////////////////////////////////////////////////////
13
15
  function gameUpdate()
14
16
  {
17
+ // called every frame at 60 frames per second
18
+ // handle input and update the game state
15
19
  }
16
20
 
17
21
  ///////////////////////////////////////////////////////////////////////////////
18
22
  function gameUpdatePost()
19
23
  {
24
+ // called after physics and objects are updated
25
+ // setup camera and prepare for render
20
26
  }
21
27
 
22
28
  ///////////////////////////////////////////////////////////////////////////////
23
29
  function gameRender()
24
30
  {
31
+ // called before objects are rendered
32
+ // draw any background effects that appear behind objects
25
33
  }
26
34
 
27
35
  ///////////////////////////////////////////////////////////////////////////////
28
36
  function gameRenderPost()
29
37
  {
30
- drawTextScreen('LittleJS Empty Project', mainCanvasSize.scale(.5), 80);
38
+ // called after objects are rendered
39
+ // draw effects or hud that appear above all objects
40
+ drawTextScreen('Hello World!', mainCanvasSize.scale(.5), 80);
31
41
  }
32
42
 
33
43
  ///////////////////////////////////////////////////////////////////////////////
@@ -1,6 +1,6 @@
1
1
  <html><head>
2
- <link rel=icon type=image/png href=../../favicon.png>
2
+ <title>Little JS Hello World Demo</title>
3
3
  </head><body>
4
4
 
5
- <script src=../../engine/engine.all.js></script>
5
+ <script src=../../build/littlejs.js></script>
6
6
  <script src=game.js></script>
@@ -5,7 +5,7 @@
5
5
  'use strict';
6
6
 
7
7
  // import module
8
- import * as LittleJS from '../../engine/engine.all.module.js';
8
+ import * as LittleJS from '../../build/littlejs.esm.js';
9
9
  const {Vector2, Color, Timer, vec2} = LittleJS;
10
10
 
11
11
  // sound effects
@@ -1,9 +1,10 @@
1
1
  <html><head>
2
+ <title>Little JS Module Demo</title>
2
3
  <meta name=viewport content=width=device-width,height=device-height,initial-scale=1,maximum-scale=1>
3
4
  <meta name=apple-mobile-web-app-capable content=yes>
4
5
  <meta name=mobile-web-app-capable content=yes>
5
- <link rel=icon type=image/png href=../../favicon.png>
6
+ <link rel=icon type=image/png href=../favicon.png>
6
7
  </head><body>
7
8
 
8
9
  <!-- Add your game scripts here -->
9
- <script src=game.js?125 type=module></script>
10
+ <script src=game.js?126 type=module></script>
@@ -1,8 +1,9 @@
1
1
  <html><head>
2
+ <title>Little JS Particle System Designer</title>
2
3
  <meta name=viewport content=width=device-width,height=device-height,initial-scale=1,maximum-scale=1>
3
4
  <meta name=apple-mobile-web-app-capable content=yes>
4
5
  <meta name=mobile-web-app-capable content=yes>
5
- <link rel=icon type=image/png href=favicon.png>
6
+ <link rel=icon type=image/png href=../favicon.png>
6
7
  <style>
7
8
  input
8
9
  {
@@ -15,7 +16,7 @@ button
15
16
  </style>
16
17
  </head><body>
17
18
 
18
- <script src=../../engine/engine.all.js?125></script>
19
+ <script src=../../build/littlejs.js?126></script>
19
20
  <script>
20
21
 
21
22
  'use strict';
@@ -192,7 +192,7 @@ function makeTileLayers()
192
192
 
193
193
  function buildLevel()
194
194
  {
195
- levelSize = vec2(256);
195
+ levelSize = vec2(128);
196
196
  levelColor = randColor(new Color(.2,.2,.2), new Color(.8,.8,.8));
197
197
  levelGroundColor = levelColor.mutate().add(new Color(.4,.4,.4)).clamp();
198
198
 
@@ -298,7 +298,7 @@ class Player extends Character
298
298
  {
299
299
  // player controls
300
300
  this.holdingJump = keyIsDown(38) || gamepadIsDown(0);
301
- this.holdingShoot = mouseIsDown(0) || keyIsDown(90) || gamepadIsDown(2);
301
+ this.holdingShoot = !isUsingGamepad && mouseIsDown(0) || keyIsDown(90) || gamepadIsDown(2);
302
302
  this.pressingThrow = mouseIsDown(1) || keyIsDown(67) || gamepadIsDown(1);
303
303
  this.pressedDodge = mouseIsDown(2) || keyIsDown(88) || gamepadIsDown(3);
304
304
 
@@ -1,13 +1,14 @@
1
1
  <html><head>
2
+ <title>Little JS Platforming Game Demo</title>
2
3
  <meta name=viewport content=width=device-width,height=device-height,initial-scale=1,maximum-scale=1>
3
4
  <meta name=apple-mobile-web-app-capable content=yes>
4
5
  <meta name=mobile-web-app-capable content=yes>
5
- <link rel=icon type=image/png href=../../favicon.png>
6
+ <link rel=icon type=image/png href=../favicon.png>
6
7
  </head><body>
7
8
 
8
- <script src=../../engine/engine.all.js?125></script>
9
- <script src=gameObjects.js?125></script>
10
- <script src=gamePlayer.js?125></script>
11
- <script src=gameEffects.js?125></script>
12
- <script src=gameLevel.js?125></script>
13
- <script src=game.js?125></script>
9
+ <script src=../../build/littlejs.js?126></script>
10
+ <script src=gameObjects.js?126></script>
11
+ <script src=gamePlayer.js?126></script>
12
+ <script src=gameEffects.js?126></script>
13
+ <script src=gameLevel.js?126></script>
14
+ <script src=game.js?126></script>
@@ -1,9 +1,10 @@
1
1
  <html><head>
2
+ <title>Little Puzzle Game Demo</title>
2
3
  <meta name=viewport content=width=device-width,height=device-height,initial-scale=1,maximum-scale=1>
3
4
  <meta name=apple-mobile-web-app-capable content=yes>
4
5
  <meta name=mobile-web-app-capable content=yes>
5
- <link rel=icon type=image/png href=../../favicon.png>
6
+ <link rel=icon type=image/png href=../favicon.png>
6
7
  </head><body>
7
8
 
8
- <script src=../../engine/engine.all.js?125></script>
9
- <script src=game.js?125></script>
9
+ <script src=../../build/littlejs.js?126></script>
10
+ <script src=game.js?126></script>
@@ -1,6 +1,5 @@
1
1
  rem Simple build script for LittleJS by Frank Force
2
2
  rem Minfies and combines index.html and index.js and zips the result
3
- rem Run buildSetup.bat to install required dependencies.
4
3
 
5
4
  set NAME=game
6
5
  set BUILD_FOLDER=build
@@ -9,22 +8,24 @@ set BUILD_FILENAME=index.js
9
8
  rem install dev packages
10
9
  rem call npm install
11
10
 
12
- rem rebuild engine first
13
- cd engine
14
- call engineBuild.bat
15
- if %ERRORLEVEL% NEQ 0 (
16
- exit /b %ERRORLEVEL%
17
- )
18
- cd ..
19
-
20
11
  rem remove old files
21
12
  del %NAME%.zip
22
13
  rmdir /s /q %BUILD_FOLDER%
23
14
 
24
15
  rem copy engine release build
25
16
  mkdir %BUILD_FOLDER%
26
- cd %BUILD_FOLDER%
27
- type ..\engine\engine.all.release.js >> %BUILD_FILENAME%
17
+ pushd %BUILD_FOLDER%
18
+
19
+ rem rebuild engine first
20
+ pushd ..\..\..\src
21
+ call engineBuild.bat
22
+ if %ERRORLEVEL% NEQ 0 (
23
+ pause
24
+ exit /b %ERRORLEVEL%
25
+ )
26
+ popd
27
+
28
+ type ..\..\..\build\littlejs.release.js >> %BUILD_FILENAME%
28
29
  echo. >> %BUILD_FILENAME%
29
30
 
30
31
  rem add your game's files to include here
@@ -57,22 +58,21 @@ if %ERRORLEVEL% NEQ 0 (
57
58
  exit /b %ERRORLEVEL%
58
59
  )
59
60
 
60
- rem build the html, you can add html header and footers here
61
+ rem build the html, you can add an html header and footer here
61
62
  rem type ..\header.html >> index.html
62
- echo ^<body^>^<script^> >> index.html
63
+ echo ^<script^> >> index.html
63
64
  type %BUILD_FILENAME% >> index.html
64
65
  echo ^</script^> >> index.html
66
+ rem type ..\footer.html >> index.html
65
67
 
66
68
  rem delete intermediate files
67
69
  del %BUILD_FILENAME%
68
70
 
69
71
  rem zip the result, ect is recommended
70
- call ..\node_modules\ect-bin\vendor\win32\ect.exe -9 -strip -zip ..\%NAME%.zip index.html tiles.png
72
+ call ..\..\..\node_modules\ect-bin\vendor\win32\ect.exe -9 -strip -zip ..\%NAME%.zip index.html tiles.png
71
73
  if %ERRORLEVEL% NEQ 0 (
72
74
  pause
73
75
  exit /b %ERRORLEVEL%
74
76
  )
75
77
 
76
- cd ..
77
-
78
- rem pause to see result
78
+ popd
@@ -0,0 +1,111 @@
1
+ /*
2
+ LittleJS Hello World Starter Game
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ // sound effects
8
+ const sound_click = new Sound([1,.5]);
9
+
10
+ // medals
11
+ const medal_example = new Medal(0, 'Example Medal', 'Welcome to LittleJS!');
12
+ medalsInit('Hello World');
13
+
14
+ // game variables
15
+ let particleEmitter;
16
+
17
+ ///////////////////////////////////////////////////////////////////////////////
18
+ function gameInit()
19
+ {
20
+ // create tile collision and visible tile layer
21
+ initTileCollision(vec2(32, 16));
22
+ const pos = vec2();
23
+ const tileLayer = new TileLayer(pos, tileCollisionSize);
24
+
25
+ // get level data from the tiles image
26
+ const imageLevelDataRow = 1;
27
+ mainContext.drawImage(tileImage, 0, 0);
28
+ for (pos.x = tileCollisionSize.x; pos.x--;)
29
+ for (pos.y = tileCollisionSize.y; pos.y--;)
30
+ {
31
+ const imageData = mainContext.getImageData(pos.x, 16*(imageLevelDataRow+1)-pos.y-1, 1, 1).data;
32
+ if (imageData[0])
33
+ {
34
+ const tileIndex = 1;
35
+ const direction = randInt(4)
36
+ const mirror = randInt(2);
37
+ const color = randColor();
38
+ const data = new TileLayerData(tileIndex, direction, mirror, color);
39
+ tileLayer.setData(pos, data);
40
+ setTileCollisionData(pos, 1);
41
+ }
42
+ }
43
+ tileLayer.redraw();
44
+
45
+ // move camera to center of collision
46
+ cameraPos = tileCollisionSize.scale(.5);
47
+
48
+ // enable gravity
49
+ gravity = -.01;
50
+
51
+ // create particle emitter
52
+ particleEmitter = new ParticleEmitter(
53
+ vec2(16), 0, // emitPos, emitAngle
54
+ 1, 0, 500, PI, // emitSize, emitTime, emitRate, emiteCone
55
+ 0, vec2(16), // tileIndex, tileSize
56
+ new Color(1,1,1), new Color(0,0,0), // colorStartA, colorStartB
57
+ new Color(1,1,1,0), new Color(0,0,0,0), // colorEndA, colorEndB
58
+ 2, .2, .2, .1, .05, // time, sizeStart, sizeEnd, speed, angleSpeed
59
+ .99, 1, 1, PI, // damping, angleDamping, gravityScale, cone
60
+ .05, .5, 1, 1 // fadeRate, randomness, collide, additive
61
+ );
62
+ particleEmitter.elasticity = .3; // bounce when it collides
63
+ particleEmitter.trailScale = 2; // stretch in direction of motion
64
+ }
65
+
66
+ ///////////////////////////////////////////////////////////////////////////////
67
+ function gameUpdate()
68
+ {
69
+ if (mouseWasPressed(0))
70
+ {
71
+ // play sound when mouse is pressed
72
+ sound_click.play(mousePos);
73
+
74
+ // change particle color and set to fade out
75
+ particleEmitter.colorStartA = new Color;
76
+ particleEmitter.colorStartB = randColor();
77
+ particleEmitter.colorEndA = particleEmitter.colorStartA.scale(1,0);
78
+ particleEmitter.colorEndB = particleEmitter.colorStartB.scale(1,0);
79
+
80
+ // unlock medals
81
+ medal_example.unlock();
82
+ }
83
+
84
+ // move particles to mouse location if on screen
85
+ if (mousePosScreen.x)
86
+ particleEmitter.pos = mousePos;
87
+ }
88
+
89
+ ///////////////////////////////////////////////////////////////////////////////
90
+ function gameUpdatePost()
91
+ {
92
+
93
+ }
94
+
95
+ ///////////////////////////////////////////////////////////////////////////////
96
+ function gameRender()
97
+ {
98
+ // draw a grey square in the background without using webgl
99
+ drawRect(cameraPos, tileCollisionSize.add(vec2(5)), new Color(.2,.2,.2), 0, 0);
100
+ }
101
+
102
+ ///////////////////////////////////////////////////////////////////////////////
103
+ function gameRenderPost()
104
+ {
105
+ // draw to overlay canvas for hud rendering
106
+ drawTextScreen('LittleJS Engine Demo', vec2(mainCanvasSize.x/2, 80), 80);
107
+ }
108
+
109
+ ///////////////////////////////////////////////////////////////////////////////
110
+ // Startup LittleJS Engine
111
+ engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, gameRenderPost, 'tiles.png');
@@ -0,0 +1,27 @@
1
+ <html><head>
2
+ <title>Little JS Starter Project</title>
3
+ <meta name=viewport content=width=device-width,height=device-height,initial-scale=1,maximum-scale=1>
4
+ <meta name=apple-mobile-web-app-capable content=yes>
5
+ <meta name=mobile-web-app-capable content=yes>
6
+ <link rel=icon type=image/png href=../favicon.png>
7
+ </head><body>
8
+
9
+ <!-- LittleJS engine scripts -->
10
+ <script src=../../src/engineDebug.js?126></script>
11
+ <script src=../../src/engineUtilities.js?126></script>
12
+ <script src=../../src/engineSettings.js?126></script>
13
+ <script src=../../src/engineObject.js?126></script>
14
+ <script src=../../src/engineDraw.js?126></script>
15
+ <script src=../../src/engineInput.js?126></script>
16
+ <script src=../../src/engineAudio.js?126></script>
17
+ <script src=../../src/engineTileLayer.js?126></script>
18
+ <script src=../../src/engineParticles.js?126></script>
19
+ <script src=../../src/engineMedals.js?126></script>
20
+ <script src=../../src/engineWebGL.js?126></script>
21
+ <script src=../../src/engine.js?126></script>
22
+
23
+ <!-- You can also include all engine scripts like this... -->
24
+ <!-- <script src=engine/engine.all.js></script> -->
25
+
26
+ <!-- Add your game scripts here -->
27
+ <script src=game.js?126></script>
Binary file
@@ -1,11 +1,12 @@
1
1
  <html><head>
2
+ <title>Little JS Stress Test</title>
2
3
  <meta name=viewport content=width=device-width,height=device-height,initial-scale=1,maximum-scale=1>
3
4
  <meta name=apple-mobile-web-app-capable content=yes>
4
5
  <meta name=mobile-web-app-capable content=yes>
5
- <link rel=icon type=image/png href=../../favicon.png>
6
+ <link rel=icon type=image/png href=../favicon.png>
6
7
  </head><body>
7
8
 
8
- <script src=../../engine/engine.all.min.js?125></script>
9
+ <script src=../../build/littlejs.min.js?126></script>
9
10
  <script>
10
11
 
11
12
  /*