From 8e0c66565c8ab604b4c5e8bfe802d74905c6193c Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Thu, 8 Jul 2021 00:45:43 +0300 Subject: [PATCH] =?UTF-8?q?=D1=83=D0=B1=D0=BE=D1=80=D0=BE=D1=87=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + docs/README.md | 9 +- docs/_sidebar.md | 1 + docs/index.html | 13 +- docs/logo.png | Bin 0 -> 9798 bytes js/areas.js | 2 +- {app => js}/config.json | 0 js/engine.js | 14 ++- {app => js}/gameData.json | 0 js/index.bak.js | 242 -------------------------------------- js/index.js | 4 +- package.json | 2 + 12 files changed, 36 insertions(+), 252 deletions(-) create mode 100644 docs/_sidebar.md create mode 100644 docs/logo.png rename {app => js}/config.json (100%) rename {app => js}/gameData.json (100%) delete mode 100644 js/index.bak.js diff --git a/.gitignore b/.gitignore index 504afef..a450e56 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules/ package-lock.json +docs/DOCS.md diff --git a/docs/README.md b/docs/README.md index da2056b..9d5853a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,3 +1,8 @@ -# Headline +# quizEngine [In Development] [В разработке] +![Logo](logo.png) -> An awesome project. +Движок для викторин + +**Contact:** +- [Discord](https://discord.gg/pqsu6FsHSe) room `#quiz-engine` +- [Telegram](https://t.me/slexbc) diff --git a/docs/_sidebar.md b/docs/_sidebar.md new file mode 100644 index 0000000..c97195c --- /dev/null +++ b/docs/_sidebar.md @@ -0,0 +1 @@ +- [Documentation](DOCS.md) diff --git a/docs/index.html b/docs/index.html index 04dd4a7..b11a040 100644 --- a/docs/index.html +++ b/docs/index.html @@ -12,8 +12,17 @@
diff --git a/docs/logo.png b/docs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cc145054246b8e056a94590484783edbb1d44129 GIT binary patch literal 9798 zcmX9^cRZW#*H(OuYAITq+I!EoRvV)f6*Vf<7OPgNy{h(JvDGe0P*HoC~s6njh zWHN&q{nBi-pPlx^P2>@d1DE^+^)+JC=7W7iu|gsUp>GwwHa~U;)w1Y?YL9lW#1P%f zDq|Cx3B}g|3X4Iu%@wabzLY=ni04EzAjA)%hyQ$}U$^~pY{EW{sJ0zGHC25F#XPFR z1%lA-i1J~5USlo26Y|ls7Z9sQpVH()@zN_1ko$A>e?V-y(CZ_5QMg1PKkH62wdNM zL!bLb5|bv_uv;E0xBH(#LrNuO;kPil^%1#69lgK~O`kgjzG9<>{}sUFz>^%hG#pt^ zlpaemNRY0IfgmCUtzYcmZ%QuifR4|V$AeVoE*?>d_HB9okYXZ?9T?3T<|w~@1VL2; zFLDKrk4L@V-lR`4a6Enn{P>d{mR09?y_UB{VI1l&^-@57nB`&pYhI4(>vz4qfogLX z)Z(i#kw|i?a^edU@`^Y^7}+BZ*nd&wkGWt%+zdBi@cqXoQWYzQ1`QoTF)*=G>|m%b zOB&zo1G5~&za;CU(mZ-ViV=J^DAsZWiij~$l2oWz z+^9TU9FIEtH^G#dCRX;UF(sE`c(dq> zR<8?zbga9B5AQ4A9@RrsKO4-21Ew;TPwhm- z@v6*}vm$pJ%i1DAN|&O7Zd1lI?;ON3U0jaI<{~00rE5N-GTz&rckpK|ah9|EXzq4Q z{*PiH>sk>ajA2(tXeViJFzDZKj~Xfz`1W7CMyQL+D?>FN$=sx&Jkx2C4`W@Zkui}0 zg|g8j-JuBi%tNGb?aZ~{_yj1HLpY5~*K_)UyrzaIFt+hkZ3#_${UJV2AAeS$L;*Z> z+G4PXUbh5GQs6kYf##NX#_cB(&7QrK-S@6~mbujscUCrb`{#Mf6;gY4SB)0Wr0oe^ z+!~R)EeO}*TqapD1J6w_N@VM#Oug1KcHOqICH@YVl_A1k^DJ>F&p$79|dA zEm0skVLm+m*OGST*&km{8dfTeyRcB&LmtNQakiuEMZBGe!uvD}_lu&}^x^f3p|Gdb zSaC}ikC}V-Q^0|ajVx(#^m)eD_d)1*NjtUdrJ-E!=^oK&W~3WE?SP&LYq@iT%rxh# z$2#b-9J!Mqc>Q)TDIJII)vl*`cH9$hnF8#86|9YJ`@7NP z=?W=jC(NeVE9@15s=RqA(rE6I*FsFCWdPhlN>OoE5)LH%dU=~)7fGg z2mtfM-aiIhQu=dnW;*9yg3_Ts4_{wiQbcW3pDo&>$#IM+3nofh=zAkF+Ss;ZpEB7G zL&cYV%>>0QinXk{D`RReQnHM$lcl9g*)+=(csQ!h-dPYl&wYCm073aMwC2POW$I*V zf2esJeY;>JtV5Z%0TbXDPRt+yrS((kZ|ao#fpY`x6dOo)lVu`|B9QIbiTmqMV*Vt5 z+sCh=XmbpI%w2Htn~5hpFe0PzSbzk&YQHBgEv@w8@qu6>0GS#ESUymu$&WuajbmD6 z*S{0R)t}g;o2v0Hs)g5F7THZIhQx*0{f6<)uJntvxsDK+;dvPgCxoH<`0%N-3AQ(+f`1R&$IyzXAgv&;w-VUy5q80A5x}2z{%Fx% zLk^dlj&Ewo-or9VWz^SGc?lgZm;6VBm}h#$&^pX#r!Oge#@P~$w0(dqvfsn!X`CDq z^T?$5<8*A;-0^7l9DlFwxUh&P+U|GH^M_Kwljejk8JcUp!3nCd4n05WQu_y1(>lz` zGZF{)N48%5=6C2R86#(UkA2}T`nex(R@4TcSzhOC##d*B)O^3)0O#>u{-5c;?mFk~ z#a+y8$u1vegzeil#m108St=f1KS4Xk^O#llts%%KK88|aW7urS;kAE?7b2t5%n5s? z*jgLgD5($c4=&0;G~e0%?cD+3gFkZZIiY+~Mxu0V*7NTo;mvtzEJ zc*Riy)u!+Ezuuw1gRCYPefj%pl#ZL$dv7l78B^7EIIEvxk=ew$9zU*R5 zWuz8;@v550Q^Oe+1X6k(C{15J;PDDCQb6PM4UhB3Ck>XaqFI}}zscaV1#Iw#f=TXb z%zT)&tX@@>2bVnb{(j;rn}tuQtSjY_t2)0#cVa*!*7hCQ<+-E}nK(-rHwF^01h=nO zD*e_DSJ7eaLe}hCWNiz6DL>w z*-p0>H1c`iJne@?1H6VuoAEKMNGgw~;-XOR@+P6GvPZU+tSw0rTbJ-n#?rDu)!n{-_kw#*DbAnc?W`3jVsP0?teQ(VIM|!>|S|=nggGWP2X7qa_2t< z_+9esgkPm7mguggI)&60r(nT`4?Ew8KOt{&qPwf#&ofEHFpScXSb2MzytBDUceK&5 zdSx4uO+)8x|B}PsX%hP{QqP_BbGn!GSDR8Tj1CALQ~C~%x;!Wm8__>TXF9j=>A8#V zWqF7W5QE1ruQJ{w;wsw*{$pwN>``2vaWT-*jh@uUWgJ?QEnOo@Oa^d=jxxX8jkiW< z7;>G5Hy=s_U!h*eHI`GM)i?SDw99dJD8AiY<=Z&6wznkuDZ%Ifo}y$qce2HQ z$=EFR6kSzZGJLbL-0=JczrfK2alIEVM^Mdt%u~IDr))aMCTP2(37j%ue`&Qw=>prU?)tjBy~}U6y9aL~u1@=5WuwE9>)Xa~T3Ob)qp|Gd zJ;+Y+&uFcCcuIdM!3D*3Q)GZWA{H1n{;Q4+qXtOS^bSD2OzEiDNB7_ z2(`bL@W_BvUWW7~#+E(^ZImFJ=KWzF7i{7<;ORd1W27@cfM4{cn?~|u)chamJ51#} zeLLzg9b>bPkfr`uyx5z<4yLvd#W#{f9@-LJI$}dsS;Oc%m-5xQcvcDt~|=q;`I}w-&Z`X+AC<+)x75`X;aw99lGdPu2TQk_@#`X z=w4UL{U>@;Uw-JKTz~h>`tmqy?Nvy#r7QV$(90{)eb*W9sp(?@ko|?Xw_APol1#Qk zO~*4%_&@d=EPvc$)W@|4sur*+GJxE6}f zC!=Zd?$_7+l%L%^nxX92qhJ|rROdC$24qPv?CI$Smon-!(m6Kb?c2iFol_k$mdkNt zVwg=j)9sA#Gc~r#n!CsGUE#PV@joU|^9}VSu&K zwuvH)YeyZz7+SjO=v{3-ifMnrNiS0-`qvt5uDiI=dJe~qkOV6yGsYU6F4 zMXqaMC$ov3Z6KxSZPNPo)+>)Uu;*A-Cjb?I1LVtos@=z|(K>BL{i?C@n$Q`s-<;%NqMqH_(20MfD_a`+dI5>D|RcX)Sa64~$jA zj2BZvvqRtaiYBRREA8e4cy51kiObCvKXMcqq5Kc zQDjlikZzFw+C%;+`O)NCc0^pbv-gp7c1*s?-0a>~u8pP|tEU}E_!lz7X=5vHS>6l} zfd7)PeQE|T9$T!PW`AmI7B@}c1p85wHPSL#BaeGP?0#<6;kgeMOiN( ztv|iZDvI{{U%}&vqfjevA6u(8plB7>@vgJw*B^OR{CK0y+6_{r&76~%ItY^c16Kd! z^8TZ7Jv;wkt)C}AiA;;cjViY5M<^>Kw%02xiSTDJ9^4Z=`_5Gm94KD1W~ymyoGD$E zrxw^eLAGn}3I9`^L5g!S4*9#jEWoLP$yT}ENWO9+rT^JX6*RM&E=NB#w4TvcLHbkS z!)&n__4Fob@rn(k9Ka8_fW3BEz$B9c?bW+kE)Y6UM=|587*@2IO8isl)Rf@@B*bSC z-I6uJwdZRoNhB!ZtYN2uT(aU#4 zqyagt^N%ua3Z}c`^-^}$@^@v(G$2$GTCMA3_bPf?Z9o6BXL0kBBaGZ|48Oop`Xa`b8_v3tWif9PUIcOIt)h#UxndeN#TQ^lo-)sKhBb z$JB!fJ04_9b-_rW^1vNy2(3QZ>@r*vd>T2k>6D)26ZGU|lB!vLp8Yl0sW794BaY}( zpH>vu#84a_F~zxtze?^-yMdW&?vFWby<_n;2jFb^epwN#+&_Qmcu~y%=Rm5uS7t}6 zcE;Xl^-=hkaj?f}Z$1~7w1Nlxsoar@Yk;lc#v^qVXkZlBRA`HsdY)+h zEi(g6X(xfRdE62@PKtCWI?o_qCYoNBAp&}ZaEx0jQm%h-RoL*tCq?I__0QyH^b%qJ`1-!=`r_eWxqz@rRw66bc>? zK!H?TzH$Ody#9FHC+hdMT%13KZ4?|i-~MUjRG(Ltof5h5@H|-~hMFu~KyaVp{o_+T zP2oNBh*FK|LOMMBfc+P)SGXe=fS28SPtHYiui+qn!~99R7CVEP;K9qAGXoRQY!Hwu znp%gh8wL5`aQpWHVWl$IjVSir?zB+dO3v(-wDZ5}tW3`w@Ph(dUVqGkr&%LSY0irP z6cz-7R zmrQ~R61aF}t$sDa0lH)EqAw~$+dZ{T4?0;2y0H*akk3ay^}h`hd_>k4-IIuBpnUb$q^Kn7KfhkH=yd%noq;9GsRzi=5|vC- z!?1d=rCH;}A5j(vhXTj6c~q&&xA29DkTUy1XqdZ@e8e?G$@je zkQ$x>^fP-9&fCznkeM+)%P?p{L@s5Y{(eedH{B$Y^UM6x6$waEDOrQyD_oPa>Bi4K zE9NfUO1yo1=IvKFAmv3?|E(0`yrl+}o$^I2f$V&3>Y)5|%3Vwc?N`Y7mo0eU1HcnY zvGH&~OVqU!z1-H$W0GNtvo)rnOcrhG4Ds@Q`vys_V!037=rA(-f_NdymX0~*2s~1z zGQ&)GgzvjjC1a@Kf-;Iy1J#iqcjWWH?QcH%9>K3SO<)TaCXMbE1Pfg7PKG zIOG{&>~@hs-Id7liW3e^(aXyhaVRu56L2=pnUijHkD>*5M%bexUDb`5C(|M&AWk>GKmjhXa1e+>xz#E>oPdyAV(-!u*|vu0svjX?jEZB!->% zcGY~j2GxG|ER_F^$|;<>FIvKD9P{#ep?2IK`!|N`NJas!qa#_v&f7y2)1eQ5QeXLW6lNX!`SxDs5IsQs|g@?kkfv9l4v=A>NBOgubbO zG5>`Q?`e#{b(kHtn=?*&?t5qF#lwe4@}u4nrpV5zNn$|KAo^JL)=c#-yY0wSMzdEy z=%uo#uI`;K+%_XE9f*JDp58AqXhTF{*~#foyG<2{6~$4BcL8?IoG^HSj$K_C*0z*k zrWU-f%cgtv$;xvxEDuhjjqb9(Vk_9MY)`&$F3^QOE0<;Jh8OnTX|g6@)4*itJRFvj z>B=TAq4x?%W+5&?d>t$0(mi2S?|MD*%g5hDA4LB-BIL+s9|Zy2j_dDV$>BaL^&ZXfYfjb?S3E+XpAbEK508{iNitA$AShl?D3?+7BWH2y-ILz$ zOBs(FidjSbUIh~~#$UYDy9~Qn9{8lI^H8Orb$YXBdYBwfJ=uEbOrSt63((h|?yar0 zq(k_%T!w7pv9|mG#VXn}uN)T>TMWrmi7VTD&~jxLmPJ7MJD{3RD)YM(ODf;ZrFxuM zGUq^nk2NS|n~0f*CmrK5yA@`3Pd&A;B#MGR#QUSxS1zxN+Ic2`ELxg**iAPp@67M- z{Fy+3MhK!ER&sptRuCGbP_A#-{>2VR#7z9&_syORdc{JszL33;?X!q~e@ z?gQwY6)$?dXJZ+5hd2&Nerws6GU44e6~s|w$&|DopOsWsc99ne@O{{4M^TH_3^H~G zIl^poOxTuPmDd<#vtjmR6)*9VnD}Y}b$P^_ zbJx4jjGWz{pWB4^o}M$oHSvy3ELvMDNK?q(Dg=6+d>A0W1} z>(u*DVa65%-fo+{ve(O{i^-jbd8cuiYCQO&i@ zMa)qcQN7j^1!vmGC9DHx3V`=1G-r;Hw89IhM4nYLE>F1)A z->Etl^vD3&4;0p4X$P;d2Sj@>pbvK667G@jcFlC}WHhwU4?Dwu4jUN!O;a&_r##o|(ja`Yyd;(CZDVzRZO6HdQ z{_3W^-!wOTT0%Wfh@skFFEl&*RGEC$N-oB4yIMr@c%16V;_H4Q9Q*=x*D8*V;e>;e zXB`v+XPDaOOHVQxL=r8qMCjNz%RW`6Ob1gpjZ9hVvY`k3gJ%7GHsB2pNY&Ub*Z+<^ zdHiWw8P3OY7+<=Zh=l_-EVtU5{*!+Y>Yo5EF}|^smL}-xHy8|J?K$K6rs#B6%9Im! z{PpJ`dOC+lUQ<#5Xq>LOcM*NMT~M{0lC_Q#V>YLb2GHydW9Z;if76HQwH=&zU<4lS zQ{`olh(fyaG{@d>`Qxc2bD9)wEpqD78bB8MR5_#jnm}#oJiTXJfL~%BOQoHUdVdV` zKK!E5~0|I9&rDj-~z?b0=AqAcd-HS2{~f_G(*=OGsJh2@@knmOjw0-qnWKdJxPO3;Bj<9?!ni-)%pSzMf+&OZgT! z8+mmQWI)FOEFcu2)Wbq}+iks|3`^6d_ffc^m#q8l`fjcDO<38*sN@C-qsHG~kulJ? z{Q2CU8lLov+~<$G(4czaRo5yQl$Q@`e1)rP>(sLme5${ z6sD~|NOj^kVa6mq4=rU7(B>v5 zgE9Ym?ADKgSqUoGE!zeqL`2k=92pdl zp>7b=<2DE2y&~a6p-RHoCRJ1ipRPi6M|=&lE=;aV9JS5Fugh$->4jCQl>A>RJZ#_z z0VXEIq0pWM=|?09lt?O*pP4a1Dz(+B9A*|#ev<&-S`FP|^P93WSFHxq!1x5x`TT-^qpDqJ z6s|?nsI49u1wQ>yW5&l|tj+6!AlOmR2+Ee^&8jgi=+h-n4e-)4)1$Y~GK%~Vec4a@ z2q|$H<1wi-h4IPyqfq1x`juFc?DYr8P;`J~T5fF+H7MI)QQdXCP`78ea7|lY` zpzshdb5nb|>vUhUGh@GLb32E<7+5DAE$q zc}Sd@D|)1M6SSd>X(2(q1zO6S@3HD2G$+uG2+>Uc(2m-%z8z7jKEs~n^EMe~zP)fk zAGW0rFtlXZVSy2)pi=P3-O=ec5Y%GYx4=(j&Dte!gHc0`Ir&kJ{Y>Ruc353Me+3)= z;e*u2oUk_f4uYTS50KZ-B|Q^BJ~k)*yHI57SWt?)JZ%d871^elgh1Qz%^lH>gz^t3 Tilo4N7@oSyYvn4C`RD%winevI literal 0 HcmV?d00001 diff --git a/js/areas.js b/js/areas.js index 08248d6..042f2c6 100644 --- a/js/areas.js +++ b/js/areas.js @@ -1,4 +1,4 @@ -import config from '../app/config.json'; +import config from './config.json'; import * as Draw from './draw.js' diff --git a/app/config.json b/js/config.json similarity index 100% rename from app/config.json rename to js/config.json diff --git a/js/engine.js b/js/engine.js index f81653f..07572f1 100644 --- a/js/engine.js +++ b/js/engine.js @@ -1,4 +1,4 @@ -import config from '../app/config.json'; +import config from './config.json'; export function imagePreloader(images, callback) { let counter = 0; @@ -16,12 +16,20 @@ export function imagePreloader(images, callback) { } export function shuffle(array) { + // ф + for (let i = array.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [array[i], array[j]] = [array[j], array[i]]; } } +// +/** + * Функция возвращает ориентацию игры в зависимости от размера canvas + * @param {Object} canvas canvas object + * @return {Bool} landscape_orientation + */ export function setOrientation(canvas) { let landscape_orientation = null; @@ -30,8 +38,8 @@ export function setOrientation(canvas) { if (config.debug) console.log(landscape_orientation ? - 'Canvas orientation set to landscape' : - 'Canvas orientation set to portrait'); + 'Set game orientation to landscape' : + 'Set game orientation to portrait'); return landscape_orientation; } diff --git a/app/gameData.json b/js/gameData.json similarity index 100% rename from app/gameData.json rename to js/gameData.json diff --git a/js/index.bak.js b/js/index.bak.js deleted file mode 100644 index e94410d..0000000 --- a/js/index.bak.js +++ /dev/null @@ -1,242 +0,0 @@ -'use strict'; - -import config from '../config.json'; // game configuration -import gameData from '../gameData.json'; // game data - -import { getMousePos, isInside } from './buttons.js'; -import { clearContext, getCenterH, getCenterV } from './draw.js'; -import { clickAnswer, shuffleQuestAnswer } from './game.js'; - -// Engine variables ------------------------------------- -let DEBUG = true; -let canvas = null; // canvas id -let context = null; // context id -let cW = null; // canvas with -let cH = null; // canvas height -let orientation = null; // screen orientation -let button = null; // buttons array -let area = null; // game areas (buttons, images, etc.) -let game = null; - -// Init ------------------------------------------------- -window.onload = function() { - // init canvas id and sizes - canvas = document.getElementById('game'); - context = canvas.getContext('2d'); - cW = canvas.width; - cH = canvas.height; - - // set screen orientation by carculate canvas width&height - if (cW >= cH) { orientation = true; } - else { orientation = false; } - - if (DEBUG) { - console.log(`Loaded ${gameData.length} quests.`); - } - - game = { - // TODO: change quest by script - questIndex: 0, - quest: null, - questImage: null, - totalRightAnswers: 0, // количество правильных ответов - scene: null, - }; - shuffleQuestAnswer(gameData); // shuffle quest - game.quest = gameData[game.questIndex]; - shuffleQuestAnswer(gameData[game.questIndex].answer); // shuffle first quest answers - - // присваем всем квестам статус не выполнен - gameData.forEach(element => element.status = null); - - if (!orientation) { - area = { - answerButtons: { x: 10, y: cH - 340, w: cW - 20, h: 250 }, - questionLabel: { x: 10, y: cH - 340 - 80, w: cW - 20, h: 70 }, - uiButtons: { x: 10, y: cH - 80, w: cW - 20, h: 70 }, - questProgress: { x: 10, y: 10, w: cW - 20, h: 20 }, - } - area.image = { x: 10, y: area.questProgress.y + area.questProgress.h + 10, - w: cW - 20, h: area.questionLabel.y - area.questProgress.y - (area.questProgress.h * 2) }; - } - // TODO: add areas for landscape mode - - button = { - info: { x: 10, y: cH - 80, w: 70, h: 70 }, - sfx: { x: cW - 80, y: cH - 80, w: 70, h: 70 }, - // TODO: change data: to null - answerButtons: [ - { x: getCenterH(cW, cW / 1.5), y: 0, w: cW / 1.5, h: 50, data: null }, - { x: getCenterH(cW, cW / 1.5), y: 0, w: cW / 1.5, h: 50, data: null }, - { x: getCenterH(cW, cW / 1.5), y: 0, w: cW / 1.5, h: 50, data: null }, - { x: getCenterH(cW, cW / 1.5), y: 0, w: cW / 1.5, h: 50, data: null }, - ], - } - - button.answerButtons.forEach(function callback(value, index, array) { - if (index == 0) - array[index].y = area.answerButtons.y; - else - array[index].y = array[index - 1].y + value.h + 15; - }); - - canvas.addEventListener('click', function(evt) { - let mousePos = getMousePos(canvas, evt); - - // click info button - if (isInside(mousePos, button.info)) { - console.log("info"); - } - - // click sfx button - if (isInside(mousePos, button.sfx)) { - console.log("sfx"); - } - - // click by first answer button - if (isInside(mousePos, button.answerButtons[0])) { - clickAnswer(gameData, game, button.answerButtons[0].data); - } - - // click by second answer button - if (isInside(mousePos, button.answerButtons[1])) { - clickAnswer(gameData, game, button.answerButtons[1].data); - } - - // click by third answer button - if (isInside(mousePos, button.answerButtons[2])) { - clickAnswer(gameData, game, button.answerButtons[2].data); - } - - // click by four answer button - if (isInside(mousePos, button.answerButtons[3])) { - clickAnswer(gameData, game, button.answerButtons[3].data); - } - }, false); - - window.requestAnimationFrame(gameLoop); -}; - - -// GameLoop --------------------------------------------- -function gameLoop(timeStamp) { - update(); - draw(); - - window.requestAnimationFrame(gameLoop); -} - -// Game update func ------------------------------------- -function update() { - // Update answer buttons label - button.answerButtons.forEach(function callback(value, index) { - value.data = game.quest.answer[index]; - }); -} - -// Draw to canvas func ---------------------------------- -function draw() { - clearContext(canvas, config); // flush?! canvas - - // draw question label - context.font = "32px Ubuntu"; - context.textAlign = "center"; - context.fillStyle = "white"; - context.fillText(game.quest.question, cW / 2, area.questionLabel.y + 30); - - // draw answer buttons - context.fillStyle = "purple"; - context.strokeStyle = "navy"; - context.lineWidth = 2; - - for (let i = 0; i <= button.answerButtons.length - 1; i++) { - context.fillRect(button.answerButtons[i].x, button.answerButtons[i].y, - button.answerButtons[i].w, button.answerButtons[i].h); - context.strokeRect(button.answerButtons[i].x, button.answerButtons[i].y, - button.answerButtons[i].w, button.answerButtons[i].h); - } - - // draw answer button label - context.font = "32px Ubuntu"; - context.textAlign = "center"; - context.fillStyle = "white"; - - button.answerButtons.forEach(function callback(value) { - context.fillText(value.data, cW / 2, value.y + 35); - }); - - // draw image - game.questImage = new Image(); - game.questImage.src = 'assets/images/' + game.quest.image; - - // carculate image ratio by area.image size - if (game.questImage.width >= game.questImage.height) { - if (game.questImage.height > area.image.h) { - let ratio = game.questImage.width / area.image.w; - let newImageW = area.image.w / ratio; - let newImageH = area.image.h; - - context.drawImage(game.questImage, getCenterH(cW, newImageW), area.image.y, - newImageW, newImageH); - } - else { - // TODO: draw image center - // TODO: add option to sizeUp images to engine config - } - } - else { - let ratio = game.questImage.height / area.image.h; - let newImageW = area.image.w / ratio; - - context.drawImage(game.questImage, getCenterH(cW, newImageW), area.image.y, - newImageW, area.image.h); - } - - // draw progress bar - let sizeProgressItem = area.questProgress.w / gameData.length; - - context.strokeStyle = "black"; - - for (let i = 0; i < gameData.length; i++) { - // change progress item color by status answer - switch (gameData[i].status) { - case null: - context.fillStyle = "gray"; - break; - case true: - context.fillStyle = "green"; - break; - case false: - context.fillStyle = "red"; - break; - } - - context.fillRect(10 + (i * sizeProgressItem), 10, sizeProgressItem, 20); - context.strokeRect(10 + (i * sizeProgressItem), 10, sizeProgressItem, 20); - } - - // UI ------------------------------------------ - // TODO: переписать это всё г* - context.fillStyle = "red"; - context.strokeStyle = "navy"; - context.lineWidth = 2; - context.fillRect(button.info.x, button.info.y, button.info.w, button.info.h); // info button - context.strokeRect(button.info.x, button.info.y, button.info.w, button.info.h); // info button - context.fillRect(button.sfx.x, button.sfx.y, button.sfx.w, button.sfx.h); // sfx button - context.strokeRect(button.sfx.x, button.sfx.y, button.sfx.w, button.sfx.h); // sfx button - - // draw game areas - if (DEBUG) { - context.strokeStyle = "red"; - context.lineWidth = 2; - - // answer buttons area - if (orientation) - // TODO: draw answer buttons area by landscape - console.log('TODO: draw answer buttons area by landscape'); - else - for (const [key, value] of Object.entries(area)) { - context.strokeRect(value.x, value.y, value.w, value.h); - } - } -} diff --git a/js/index.js b/js/index.js index db173f9..f7a5c9a 100644 --- a/js/index.js +++ b/js/index.js @@ -1,8 +1,8 @@ 'use strict'; // Import game configs and questsData ------------------- -import config from '../app/config.json'; // game configuration -import gameData from '../app/gameData.json'; // game data +import config from './config.json'; // game configuration +import gameData from './gameData.json'; // game data // Import engine libs ----------------------------------- import * as Engine from './engine.js'; diff --git a/package.json b/package.json index d5a0ca5..82231a4 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "scripts": { "start": "webpack serve", "build": "webpack --mode=production", + "docs": "documentation build ./js -f md --markdown-toc=false -o docs/DOCS.md", "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { @@ -21,6 +22,7 @@ "homepage": "https://github.com/emilecok/quizEngine#readme", "devDependencies": { "docsify-cli": "^4.4.3", + "documentation": "^13.2.5", "webpack": "^5.42.0", "webpack-cli": "^4.7.2", "webpack-dev-server": "^3.11.2"