From 3c46f48ed8fa1ae39f39a42bcb02e58de02072b5 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Mon, 15 Aug 2022 02:58:54 +0300 Subject: [PATCH] add 4 tutorial --- .editorconfig | 54 +++++++++++++++++- scr/01/app.js | 39 +++++++++++++ scr/01/index.html | 10 ++++ scr/02/app.js | 46 +++++++++++++++ scr/02/index.html | 11 ++++ scr/03/app.js | 27 +++++++++ scr/03/index.html | 11 ++++ scr/04/app.js | 50 ++++++++++++++++ scr/04/index.html | 11 ++++ scr/05/app.js | 50 ++++++++++++++++ scr/05/index.html | 11 ++++ .../Animation Strips/Coin Animation Strip.png | Bin 0 -> 518 bytes .../Coin Collect Particle Strip.png | Bin 0 -> 515 bytes scr/assets/aa/Background.png | Bin 0 -> 4579 bytes scr/assets/aa/Tilesets/Decoration Tiles.png | Bin 0 -> 1501 bytes scr/assets/aa/Tilesets/Game Objects Tiles.png | Bin 0 -> 1652 bytes scr/assets/aa/Tilesets/Ground Tiles.png | Bin 0 -> 5054 bytes scr/assets/chest.png | Bin 0 -> 381 bytes 18 files changed, 319 insertions(+), 1 deletion(-) create mode 100644 scr/01/app.js create mode 100644 scr/01/index.html create mode 100644 scr/02/app.js create mode 100644 scr/02/index.html create mode 100644 scr/03/app.js create mode 100644 scr/03/index.html create mode 100644 scr/04/app.js create mode 100644 scr/04/index.html create mode 100644 scr/05/app.js create mode 100644 scr/05/index.html create mode 100644 scr/assets/aa/Animation Strips/Coin Animation Strip.png create mode 100644 scr/assets/aa/Animation Strips/Coin Collect Particle Strip.png create mode 100644 scr/assets/aa/Background.png create mode 100644 scr/assets/aa/Tilesets/Decoration Tiles.png create mode 100644 scr/assets/aa/Tilesets/Game Objects Tiles.png create mode 100644 scr/assets/aa/Tilesets/Ground Tiles.png create mode 100644 scr/assets/chest.png diff --git a/.editorconfig b/.editorconfig index e5abd51..7675716 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,5 +1,7 @@ +# EditorConfig is awesome: https://EditorConfig.org root = true +# for all projects [*] indent_style = space indent_size = 4 @@ -8,12 +10,62 @@ charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true +# Python +[*.py] +indent_style = space +indent_size = 4 + +# PHP +[*.php] +indent_style = space +indent_size = 4 + +# Crystal +[*.cr] +indent_style = space +indent_size = 2 + +# C +[{*.c,*.h}] +indent_style = space +indent_size = 4 + +# Web Sites [{*.html,*.css,*.json}] indent_style = tab indent_size = 4 +[humans.txt] +indent_style = tab +indent_size = 2 + +# Markdown +[*.md] +trim_trailing_whitespace = false + +# Other +[Makefile] +indent_style = tab +indent_size = 4 + +[.gitconfig] +indent_style = tab +indent_size = 4 + +# JavaScript [*.js] indent_style = space indent_size = 2 -[] +[package.json] +indent_style = space +indent_size = 2 + +## for this repo +[~/SSH/config] +indent_style = tab +indent_size = 4 + +[~/SublimeText/*.sublime-*] +indent_style = tab +indent_size = 4 diff --git a/scr/01/app.js b/scr/01/app.js new file mode 100644 index 0000000..e61e043 --- /dev/null +++ b/scr/01/app.js @@ -0,0 +1,39 @@ +// Создаём приложение app... +let app = new PIXI.Application({ width: 400, height: 400 }); +document.body.appendChild(app.view); // и добавляем его на страницу + +// Отключаем сглаживание +PIXI.settings.SCALE_MODE = PIXI.SCALE_MODES.NEAREST; + +// Добавляем фон +app.renderer.backgroundColor = 0x779911; +console.log(app.renderer.options); + +// Создаём спрайт и добавляем его на сцену +let sprite = PIXI.Sprite.from('/assets/chest.png'); +// Установим точку привязки спрайта по центру +sprite.anchor.set(0.5); + +// Увеличим размер спрайта вдвое +sprite.width *= 5; +sprite.height *= 5; + +// Разместим спрайт по центру +sprite.y = app.screen.height / 2; +sprite.x = app.screen.width / 2; +app.stage.addChild(sprite); + +sprite.interactive = true; +sprite.cursor = 'wait'; +sprite.on('click', (event) => { + alert('bye!'); + sprite.destroy(); + console.log(sprite); +}); + +// Добавляем ticker для перемещения спрайта туда-сюда +app.ticker.add((delta) => { + if (sprite._destroyed != true) { + sprite.rotation += 0.05 * delta; + } +}); diff --git a/scr/01/index.html b/scr/01/index.html new file mode 100644 index 0000000..dc3f81e --- /dev/null +++ b/scr/01/index.html @@ -0,0 +1,10 @@ + + + + PixiJS + + + + + + diff --git a/scr/02/app.js b/scr/02/app.js new file mode 100644 index 0000000..89097ba --- /dev/null +++ b/scr/02/app.js @@ -0,0 +1,46 @@ +let app = new PIXI.Application({ width: 400, height: 400, backgroundColor: 0x339955 }); +document.body.appendChild(app.view); + +const basicText = new PIXI.Text('Просто обычный текст'); +basicText.anchor.set(0.5); +basicText.x = app.screen.width / 2; +basicText.y = 60; + +const style = new PIXI.TextStyle({ + fontFamily: 'serif', + fontSize: 36, + fontStyle: 'italic', + fontWeight: 'bold', + fill: ['#ffffff', '#00ff99'], // gradient + stroke: '#4a1850', + strokeThickness: 5, + dropShadow: true, + dropShadowColor: '#000000', + dropShadowBlur: 4, + dropShadowAngle: Math.PI / 6, + dropShadowDistance: 6, + wordWrap: true, + wordWrapWidth: 400, + lineJoin: 'round', +}); + +const richText = new PIXI.Text('Текст со всякими стилями', style); +richText.anchor.set(0.5, 0); +richText.x = app.screen.width / 2; +richText.y = 100; + +const basicTextCounter = new PIXI.Text('0'); +basicTextCounter.style.fontSize = 50; +basicTextCounter.anchor.set(0.5); +basicTextCounter.x = app.screen.width / 2; +basicTextCounter.y = 275; + +basicTextCounter.interactive = true; +basicTextCounter.cursor = 'pointer'; +basicTextCounter.on('click', (event) => { + basicTextCounter.text = parseInt(basicTextCounter.text) + 1; +}); + +app.stage.addChild(basicText); +app.stage.addChild(richText); +app.stage.addChild(basicTextCounter); diff --git a/scr/02/index.html b/scr/02/index.html new file mode 100644 index 0000000..1dcdad9 --- /dev/null +++ b/scr/02/index.html @@ -0,0 +1,11 @@ + + + + + PixiJS - Текст + + + + + + diff --git a/scr/03/app.js b/scr/03/app.js new file mode 100644 index 0000000..29b0509 --- /dev/null +++ b/scr/03/app.js @@ -0,0 +1,27 @@ +let app = new PIXI.Application({ width: 400, height: 400, backgroundColor: 0x424242 }); +document.body.appendChild(app.view); + +const graphics = new PIXI.Graphics(); + +// Прямоугольник +graphics.beginFill(0xDE3249); +graphics.drawRect(50, 50, 100, 100); +graphics.endFill(); + +// lineStyle(0) необходим, чтобы нарисовать круг без внешней обводки +graphics.lineStyle(0); +graphics.beginFill(0xDE3249, 1); +graphics.drawCircle(100, 250, 50); +graphics.endFill(); + +// А так мы нарисуем круг без заливки. Кольцо +graphics.lineStyle(2, 0xFEEB77, 1); +graphics.beginFill(0, .5); +graphics.drawCircle(250, 250, 50); +graphics.endFill(); + +graphics.interactive = true; +graphics.buttonMode = true; +graphics.on('click', (event) => { console.log('Click on shape'); }); + +app.stage.addChild(graphics); diff --git a/scr/03/index.html b/scr/03/index.html new file mode 100644 index 0000000..27f70d0 --- /dev/null +++ b/scr/03/index.html @@ -0,0 +1,11 @@ + + + + + PixiJS - Фигуры + + + + + + diff --git a/scr/04/app.js b/scr/04/app.js new file mode 100644 index 0000000..0553b7d --- /dev/null +++ b/scr/04/app.js @@ -0,0 +1,50 @@ +let app = new PIXI.Application({ width: 400, height: 400, backgroundColor: 0x2a2a3a }); +document.body.appendChild(app.view); + +let cirleVisible = true; + +const shapeCircle = new PIXI.Graphics(); +const shapeRect = new PIXI.Graphics(); + +shapeCircle.lineStyle(4, 0x101024, 1); +shapeCircle.beginFill(0xec8a4b, 1); +shapeCircle.drawCircle(app.screen.width / 2, app.screen.height / 2, 50); +shapeCircle.endFill(); + +shapeRect.lineStyle(2, 0x101024, 1); +shapeRect.beginFill(0xDE3249); +shapeRect.drawRect(app.screen.width / 2 - 100, app.screen.height - 100, 200, 50); +shapeRect.endFill(); + +shapeRect.interactive = true; +shapeRect.cursor = 'pointer'; +shapeRect.on('mouseover', (event) => { + basicText.style.fill = 0xffffff; +}); +shapeRect.on('mouseout', (event) => { + basicText.style.fill = 0; +}); +shapeRect.on('click', (event) => { + cirleVisible = cirleVisible ? false : true; + // shapeCircle.visible = shapeCircle.visible ? false : true; +}); + +const basicText = new PIXI.Text('On / Off'); +basicText.anchor.set(0.5); +basicText.x = app.screen.width / 2; +basicText.y = app.screen.height - 75; + +app.ticker.add((delta) => { + if (cirleVisible) { + if (shapeCircle.alpha < 1) { + shapeCircle.visible = true; + shapeCircle.alpha += 0.05; + } + } + else { + if (shapeCircle.alpha > 0) shapeCircle.alpha -= 0.05; + else shapeCircle.visible = false; + } +}); + +app.stage.addChild(shapeCircle, shapeRect, basicText); diff --git a/scr/04/index.html b/scr/04/index.html new file mode 100644 index 0000000..caeddd8 --- /dev/null +++ b/scr/04/index.html @@ -0,0 +1,11 @@ + + + + + PixiJS - Видимые и невидимые объекты + + + + + + diff --git a/scr/05/app.js b/scr/05/app.js new file mode 100644 index 0000000..0553b7d --- /dev/null +++ b/scr/05/app.js @@ -0,0 +1,50 @@ +let app = new PIXI.Application({ width: 400, height: 400, backgroundColor: 0x2a2a3a }); +document.body.appendChild(app.view); + +let cirleVisible = true; + +const shapeCircle = new PIXI.Graphics(); +const shapeRect = new PIXI.Graphics(); + +shapeCircle.lineStyle(4, 0x101024, 1); +shapeCircle.beginFill(0xec8a4b, 1); +shapeCircle.drawCircle(app.screen.width / 2, app.screen.height / 2, 50); +shapeCircle.endFill(); + +shapeRect.lineStyle(2, 0x101024, 1); +shapeRect.beginFill(0xDE3249); +shapeRect.drawRect(app.screen.width / 2 - 100, app.screen.height - 100, 200, 50); +shapeRect.endFill(); + +shapeRect.interactive = true; +shapeRect.cursor = 'pointer'; +shapeRect.on('mouseover', (event) => { + basicText.style.fill = 0xffffff; +}); +shapeRect.on('mouseout', (event) => { + basicText.style.fill = 0; +}); +shapeRect.on('click', (event) => { + cirleVisible = cirleVisible ? false : true; + // shapeCircle.visible = shapeCircle.visible ? false : true; +}); + +const basicText = new PIXI.Text('On / Off'); +basicText.anchor.set(0.5); +basicText.x = app.screen.width / 2; +basicText.y = app.screen.height - 75; + +app.ticker.add((delta) => { + if (cirleVisible) { + if (shapeCircle.alpha < 1) { + shapeCircle.visible = true; + shapeCircle.alpha += 0.05; + } + } + else { + if (shapeCircle.alpha > 0) shapeCircle.alpha -= 0.05; + else shapeCircle.visible = false; + } +}); + +app.stage.addChild(shapeCircle, shapeRect, basicText); diff --git a/scr/05/index.html b/scr/05/index.html new file mode 100644 index 0000000..38f52f2 --- /dev/null +++ b/scr/05/index.html @@ -0,0 +1,11 @@ + + + + + PixiJS - Слот-машина + + + + + + diff --git a/scr/assets/aa/Animation Strips/Coin Animation Strip.png b/scr/assets/aa/Animation Strips/Coin Animation Strip.png new file mode 100644 index 0000000000000000000000000000000000000000..e81e5547a7c2a4c9320002548857c9f35c19ff81 GIT binary patch literal 518 zcmV+h0{Q)kP)AQV=80l4qqoex;C007ufKmY&$004~h_5O0X zUO)Tq+x78wx?S$M0Q_^y@^O^VGM@qjbfONh1-HK|iXh5Ymk{NLih3O|JUj|kEkG(*(_YWMEQc5DB4+4f_R8x_IG>^*9{-g41-^F|Kcf7w_KEn%WD_C_1?JB=$21f}vpT6cZWOxEnJ$*#k zM;8AhvZd!QQ~v=(dJyd>pA7kHGq?(fE!au(rSD|BwqVlpm#O~%BKs_yi$A(?=L~GY z^p=OQ&TM4~M&+lP!CpQYILjwP{(Oe&1(anA<|rWP`O8e{^2x$o0Pg%YgS&t-Y{47_ zWI2BU8Vaap0cFSsQm9%$8S()bQ2+n{0000000000006(f0q+DFN2pt|DF6Tf07*qo IM6N<$g2>h5WB>pF literal 0 HcmV?d00001 diff --git a/scr/assets/aa/Animation Strips/Coin Collect Particle Strip.png b/scr/assets/aa/Animation Strips/Coin Collect Particle Strip.png new file mode 100644 index 0000000000000000000000000000000000000000..ac98c2698fd4de966880649cdef899ee06196dc8 GIT binary patch literal 515 zcmeAS@N?(olHy`uVBq!ia0y~yU{nCI6*$;{cfrsVu zfB((Zw?&gX5;xoy3cVDg7PQLwP1rnkpav9hWlQ`A@4sGq@9-ya=``G0f93J=hIh*x z7*G6pEAO>k>G0b+jYGYx3B2`TeKW0gZ|+RToegs3DQ$6ye~kW2 z`>yQXBF{6WeeT8*ERJAstn2^1PAJGO>Qy%)Qm7x1lD z{UOSlu=6aBV;$ED{%J~5JCymVk4jsX_&xs;)l?n9u$+nK-Tx?t#`FJo{b`?n|1q!j zLf&#ePTBg)()T8GMwhsyeAJ5C%>IA2jr6<4l05y#ZM9d){=aP-{>Pi!a_93R#;^bD zAKuqmAp2kFo^x+P=?0}e@|UN*f5P3NzrcEbgVutY6OSkFd&qlphiQ7o&pkhuvr4@2 z*OWgzKgw?I{7);}J}p?>cK5Z+!V>pXiOgFIYW&hAEHoF~4wNf-a%k-iV`H8!1=aTB zvNIQkM|jVFu)O90|I^dwB7T|YhyAR$BPq%CGkD*g1s1Qw>yjD2<+--q{u{vZwOju| u_^XeXtrskDV7&V-{MFMsl*j;aRvhGi{k_P1M-68Yi0kR<=d#Wzp$Py0hu|Op literal 0 HcmV?d00001 diff --git a/scr/assets/aa/Background.png b/scr/assets/aa/Background.png new file mode 100644 index 0000000000000000000000000000000000000000..2adf10dc9a6d0f631dee65ee9ab48d5b273998d5 GIT binary patch literal 4579 zcmeAS@N?(olHy`uVBq!ia0y~yU_JoE4jgPiktb;^&OnMS$=lt9;Xep2*t>i(P=vF< zBeIx*fm;}a85w5HkpK#^mw5WRvOi?yVw5$>?EcRS6q3yhi70W-&&^HED*Jd978H@y}hfLci2Io?cy>i-3?5Ke4LzWugI-# z=iue!G~U4DbBS3bed)~F_Z)}q{wDa@?|=VY9B8J<_qQxSiX#C?2pj+s3Jr`53=Ry; z3=9nnAa5}800}0L6Il#USj1>S(~MsWR{L;j!RY;h4X29*QZ5+@uP8`3D}B7a#QD#l9{pC;%`ES zJt#tX4x(%L!3;FvfB;%_<5G@@=MwSDsb$!r0m(IYkM7$?X=fuiD*zCh*O9Mk06ELL`ZTM)!Aa`TIF-UaSffW)PF{HKia3=(8 ri40ppKMX&G%&kkF*4IUyfxW4z7!l3_3~TQPXL`njxgN@xNAS8~T< literal 0 HcmV?d00001 diff --git a/scr/assets/aa/Tilesets/Decoration Tiles.png b/scr/assets/aa/Tilesets/Decoration Tiles.png new file mode 100644 index 0000000000000000000000000000000000000000..687b7edc2d3ba8cf0c8897a24f5484071f840c6f GIT binary patch literal 1501 zcmZ8fc{J1u6rQY6$}ii<8*6Bir6|kHn1{iPG>QpXl4a~$Mkc1=S zqe!7b7-5Ep7g;8R8H9P`{ntD9-20vHJNMr6oqKM=C9JuK@Nr=f2qc0*qpZ1jeLoKh zaO-p?QI87(ZWqi^AkKaiQp+E36`^4CRRRcfNNhh3fU)g63d6dHbM2{$!Fj+cnOCVMgecWH4CPTtAx%hWDa2~2 zq=Jdid)H+XED!d5ajzX%uziw6ZXGm)2y^5z;Y?DH7aQ52y?D!%?>`s6mKCL9HO*e%1N~?ay@4VY0=H;@(DR}bVUnsbts#1XCJNYi@hOu(6zIkbWF}*&0q|pm6US`nK#^}?t5KD^)SxI)Yjhi2N zu}o+SS9xD)VxIl{A$~ZGW-!jbr2>wyI)-1YEL(eFHQN=ayF4a#SOR9IH|HP*AoOoZ z{``#2K?E`euG*d}X!09z`svU6>y7uBJTP7Kcw#1w3`fPvLUY#M z>)PEa@q$fL> zCM4K0lGr);VAgWz{)7u+^75H}D;v$`pu=0CQ~7hVH7ej-&E1%#drO9iVfKm}x6QY# zQTCm-KsZ2M%U_Pa$ht* z&;QOgW$syw?4nj8#ryfHYc<4xfnFvA01$|%zi)r6T{z0T|GFN`c)K^WMl9WH8ITop zhf#Uq9Y?o9qO4FQvba;T*$zR-hYE1+upeWLBC7k0xc+r7e_x!A37i4=N3nB%1kMa} zdrY7;8A9JRS4LYX;*d4Hrt`Q?0U28HK}aek2@|U=Jyb$@)W_eF{`mpt zLi;GYggV%jMh{cgVOvBK;+WGge7y{GhwJU#-t8?W3;>u&B$&kh@dgS20UGKm&}~o0 zEN*}C3O@-^x_M7zx6t}B1%yJW`N_B;V&3a?yg3p6N8V7LgLaCk{vU zO43GkvD6(_9;-mE!ojG1(#ZigL?;FiUfQ3}Vq-OG%B_qtRubbInH!3y`=9uzx-=Hs zemeiQ6Y0k(vlO*-L(*6|4Sn{E8Betd4R6r^6l&qeo5zqb`n3obWYk$TckoT*?#?33 zr+ZZQi66lyjl0vQ;Oe&L;d%ha3E+6%&uy#H;)zTdO>1{J;_AQ1NAWRc q%>O1z53lT23;xFWVfq)Y{luy!g*KcnDr=Iw|3Da1EUL!%di1|GQ?#7` literal 0 HcmV?d00001 diff --git a/scr/assets/aa/Tilesets/Game Objects Tiles.png b/scr/assets/aa/Tilesets/Game Objects Tiles.png new file mode 100644 index 0000000000000000000000000000000000000000..541d21f647f02e467d36f1ab73651f5562bbc66d GIT binary patch literal 1652 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 U5LriR-~a#s07*qoM6N<$f*UHXKmY&$ literal 0 HcmV?d00001 diff --git a/scr/assets/chest.png b/scr/assets/chest.png new file mode 100644 index 0000000000000000000000000000000000000000..b64231b3cedaca287ca2647c170226a0cc9c0c9a GIT binary patch literal 381 zcmV-@0fPRCP)KmceSnFbsyZ)Z0nLgRsM3rLcGCqmCS~LOJ~f*ZW18Kj!{fQ z2Md9E>@it}q|CKcqcjWObN30j@y7_$4J8+p!0v32Z{H zD|;=a<9<=>Tbh$FrhX1~q@m7Wx#F{`@8kkJ;QnXP8F=q3?=Jy>zd6S=YT+N0f`d|H zLO~c~lAY<7g(@e9H_{h<9CWU+oipB!cGHN(UCQ?kh={=o-^!T}3?%IPg$f18T==m+ zf=V}0xBzHJ)bBDD$ce^Ox^d?hFzzw94iOO~iv)kOV1Gn b