Pixel arts: Pixel Art Tutorials — Pixilart

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

β€ŽAppΒ Store: Pixel Art — Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ

ОписаниС

Если Π²Π°ΠΌ нравится Pixel Art с этим ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Ρ‚Π΅ΠΆΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ!

Π”Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм простоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для рисования ΠΏΠΈΠΊΡΠ΅Π»ΡŒΠ½Ρ‹Ρ… искусств!
Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ являСтся Π½ΠΎΠ²Ρ‹ΠΌ чувством прилоТСния Pixel Arts Painting.

ΠœΠΎΡ‰Π½Ρ‹ΠΉ ΠΏΠΈΠΊΡΠ΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ изобраТСния Π½Π° пиксСльном ΡƒΡ€ΠΎΠ²Π½Π΅.

Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

— Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ холста (пиксСлСй), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ»ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ свой ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€.
— ΠšΡ€Π°ΡΠΊΠ° с ΠΏΠ°Π»ΡŒΡ†Π΅ΠΌ пиксСлСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅.
— Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡ‚Π΅Ρ€Π΅Ρ‚ΡŒ, ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Ρ†Π²Π΅Ρ‚ Π³Ρ€Π°Π½ΠΈΡ† …
— Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ доступный Ρ†Π²Π΅Ρ‚ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Ρ†Π²Π΅Ρ‚.
— Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ свой рисунок Π² своСй Π³Π°Π»Π΅Ρ€Π΅Π΅ ΠΈ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
— Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ свою Π½ΠΈΡ‡ΡŒΠ΅ ΠΈ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅.
— ΠŸΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅ΡΡŒ своим рисунком с Π΄Ρ€ΡƒΠ·ΡŒΡΠΌΠΈ.

Π’ настоящСС врСмя ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ°:
— ΠΊΠ°Ρ€Π°Π½Π΄Π°Ρˆ, ластик, ΠΎΡ‚ΠΌΠ΅Π½Π°, ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ, ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ, ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ .

..
— Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ для Π²Ρ‹Π±ΠΎΡ€Π° Ρ†Π²Π΅Ρ‚Π° ΠΈΠ· ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ…
— Π Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ сСтки, 8×8, 16×16, 32×32 ΠΈ 64×64. И, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ (максимум 128).

Π›Π΅Π³ΠΊΠΎ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ.
Π’Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ своими ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ сСтями ΠΈΠ»ΠΈ прилоТСниями Π² Ρ‡Π°Ρ‚Π΅.

ВСрсия 1.4

Новая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ:
— Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ для Π²Ρ‹Π±ΠΎΡ€Π° Ρ†Π²Π΅Ρ‚Π° ΠΎΡ‚ Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π½Π° нашСм рисункС.

Ошибки исправлСны:
— Ошибка сохранСния Ρ‡Π΅Ρ€Ρ‚Π΅ΠΆΠ΅ΠΉ для рСдактирования ΠΏΠΎΠ·ΠΆΠ΅ исправлСно
— Ошибка ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ пиксСля

ΠžΡ†Π΅Π½ΠΊΠΈ ΠΈ ΠΎΡ‚Π·Ρ‹Π²Ρ‹

ΠžΡ†Π΅Π½ΠΎΠΊ: 20

НуТно Π΄ΠΎΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ

Π˜Π³Ρ€Π° ΠΌΠ½Π΅ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»Π°ΡΡŒ, Π½ΠΎ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ:
1. Π‘Π΄Π΅Π»Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«ΠΎΡ‚ΠΌΠ΅Π½Π° дСйствия»;
2. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ°Ρ‚ΡŒ рисунок, Π° Ρ‚ΠΎ Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ 64Ρ…64 Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π±Π΅Π· приблиТСния;
3. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ рисунок Π³ΠΎΡ‚ΠΎΠ², сдСлайтС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΠΊΠΎΠ² ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ (ΠΏΠΎ ТСланию) ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΡ… Ρ†Π²Π΅Ρ‚ ΠΈ Ρ‚ΠΎΠ»Ρ‰ΠΈΠ½Ρƒ;
4. НС знаю ΠΊΠ°ΠΊ Ρƒ Π΄Ρ€ΡƒΠ³ΠΈΡ…, Π½ΠΎ Ρƒ мСня зависаСт ΠΈΠ³Ρ€Π°, ΠΊΠΎΠ³Π΄Π° я Ρ…ΠΎΡ‡Ρƒ подСлится рисунком. ΠŸΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡΡ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ· ΠΈΠ³Ρ€Ρ‹;
5. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ большС Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² холста;

Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Π½Π° этом всС минусы. Π‘Ρ‚Π°Π²Π»ΡŽ ΠΏΠΎΠΊΠ° 4 ☺️

ΠŸΡ€ΠΈΠ²Π΅Ρ‚!
Π’ Π½ΠΎΠ²ΠΎΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ, ΠΈ исправили ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ совмСстного использования изобраТСния. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ рисунок Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π²Π°ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π² пиксСлях. Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Π½ΠΎΠ²Ρ‹ΠΌ функциям, Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ рисунок, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ·ΠΆΠ΅.

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ рисунка.
Бпасибо!

ИдСя Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ-исполнСниС Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ

Π ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ Π½Π° Π°ΠΉΡ„ΠΎΠ½Π΅ слоТно, Π½Π΅ всСгда ΠΏΠ°Π»ΡŒΡ†Π΅ΠΌ попадаСшь ΠΊΡƒΠ΄Π° Π½ΡƒΠΆΠ½ΠΎ. Но самая большая Π½Π΅ΠΏΡ€ΠΈΡΡ‚Π½ΠΎΡΡ‚ΡŒ-это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ своС Ρ‚Π²ΠΎΡ€Π΅Π½ΠΈΠ΅ Π² Ρ„ΠΎΡ‚ΠΎΠΏΠ»Π΅Π½ΠΊΡƒ. ΠŸΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ-Π²Ρ‹Π»Π΅Ρ‚Π°Π΅Ρ‚. И рисунок исчСзаСт.

ΠŸΡ€ΠΈΠ²Π΅Ρ‚! Π’ Π½ΠΎΠ²ΠΎΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ, ΠΈ исправили ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ совмСстного использования изобраТСния. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ рисунок Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π²Π°ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π² пиксСлях. Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Π½ΠΎΠ²Ρ‹ΠΌ функциям, Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ рисунок, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ·ΠΆΠ΅. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ рисунка. Бпасибо!

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Mireia Lluch Ortola ΡƒΠΊΠ°Π·Π°Π», Ρ‡Ρ‚ΠΎ в соотвСтствии с ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ прилоТСния Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ описано Π½ΠΈΠΆΠ΅. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ свСдСния доступны Π²Β ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°.

Π”Π°Π½Π½Ρ‹Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Β­ΠΌΡ‹Π΅ для отслСТи­вания ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для отслСТивания ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ Π² прилоТСниях ΠΈ Π½Π° сайтах, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΠΌ компаниям:

НС связанныС с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Β­Ρ‚Π΅Π»Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅

ΠœΠΎΠΆΠ΅Ρ‚ Π²Π΅ΡΡ‚ΠΈΡΡŒ сбор ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нС связаны ΡΒ Π»ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ:

ΠšΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ Π² зависимости ΠΎΡ‚ вашСго возраста, задСйствованных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ². ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ

ΠŸΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€
Mireia Lluch Ortola

Π Π°Π·ΠΌΠ΅Ρ€
13,4Β ΠœΠ‘

ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ
РазвлСчСния

Возраст
4+

Copyright
Β© Creations Apps

Π¦Π΅Π½Π°
БСсплатно

  • Π‘Π°ΠΉΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° прилоТСния
  • ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

Π”Ρ€ΡƒΠ³ΠΈΠ΅ прилоТСния этого Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°

Π’Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΡ‚ΡŒΡΡ

ПишСм Pixel Art Maker Π½Π° JavaScript / Π₯Π°Π±Ρ€

Π”ΠΎΠ±Ρ€ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ суток, Π΄Ρ€ΡƒΠ·ΡŒΡ!

ΠŸΡ€Π΅Π΄ΠΈΡΠ»ΠΎΠ²ΠΈΠ΅

ΠžΠ΄Π½Π°ΠΆΠ΄Ρ‹ Π²Π΅Π± сСрфинг ΠΏΡ€ΠΈΠ²Π΅Π» мСня ΠΊ этому.

ПозТС ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ» ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΏΡ€ΠΎ Ρ‚ΠΎ, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

Казалось Π±Ρ‹, Π½ΠΈΡ‡Π΅Π³ΠΎ особСнного β€” ΠŸΠΈΠΊΠ°Ρ‡Ρƒ, нарисованный срСдствами CSS. Данная Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° называСтся Pixel Art (пиксСльноС искусство?). Π§Ρ‚ΠΎ мСня ΠΏΠΎΡ€Π°Π·ΠΈΠ»ΠΎ, Ρ‚Π°ΠΊ это Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΎΡΡ‚ΡŒ процСсса. КаТдая ΠΊΠ»Π΅Ρ‚ΠΎΡ‡ΠΊΠ° Ρ€Π°ΡΠΊΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ (Π½Ρƒ, ΠΏΠΎΡ‡Ρ‚ΠΈ; Π±Π»Π°Π³ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ прСпроцСссоры; Sass Π² Π΄Π°Π½Π½ΠΎΠΌ случаС). ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, красота Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΆΠ΅Ρ€Ρ‚Π². Однако Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ β€” сущСство Π»Π΅Π½ΠΈΠ²ΠΎΠ΅. ΠŸΠΎΡΠ΅ΠΌΡƒ я задумался ΠΎΠ± Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π’Π°ΠΊ появилось Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я Π½Π°Π·Π²Π°Π» Pixel Art Maker.

Условия

Π§Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ?

Нам Π½ΡƒΠΆΠ½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ количСство ΠΊΠ»Π΅Ρ‚ΠΎΡ‡Π΅ΠΊ с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΈΡ… Ρ€Π°ΡΠΊΡ€Π°ΡˆΠΈΠ²Π°Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ†Π²Π΅Ρ‚Π°ΠΌΠΈ.

Π’ΠΎΡ‚ ΠΏΠ°Ρ€ΠΎΡ‡ΠΊΠ° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΈΠ· сСти:

  • ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 1
  • ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 2

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

  • Ρ„ΠΎΡ€ΠΌΠ° ΠΊΠ»Π΅Ρ‚ΠΎΡ‡Π΅ΠΊ β€” ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ ΠΈΠ»ΠΈ ΠΊΡ€ΡƒΠ³
  • ΡˆΠΈΡ€ΠΈΠ½Π° ΠΊΠ»Π΅Ρ‚ΠΎΡ‡Π΅ΠΊ Π² пиксСлях
  • количСство ΠΊΠ»Π΅Ρ‚ΠΎΡ‡Π΅ΠΊ
  • Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π°
  • Ρ†Π²Π΅Ρ‚ для Ρ€Π°ΡΠΊΡ€Π°ΡˆΠΈΠ²Π°Π½ΠΈΡ
  • функция создания холста
  • функция отобраТСния Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² ΠΊΠ»Π΅Ρ‚ΠΎΡ‡Π΅ΠΊ
  • функция сохранСния/удалСния изобраТСния
  • функция очистки холста
  • функция удалСния холста

Π‘ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠ΅ Π΄Π΅Ρ‚Π°Π»ΠΈ обсудим Π² процСссС ΠΊΠΎΠ΄ΠΈΠ½Π³Π°.

Π˜Ρ‚Π°ΠΊ, ΠΏΠΎΠ΅Ρ…Π°Π»ΠΈ.

Π Π°Π·ΠΌΠ΅Ρ‚ΠΊΠ°

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° наш HTML Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

<!-- создаСм ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для инструмСнтов -->
<div>
    <!-- создаСм ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для Ρ„ΠΎΡ€ΠΌΡ‹ Ρ„ΠΈΠ³ΡƒΡ€ (ΠΊΠ»Π΅Ρ‚ΠΎΡ‡Π΅ΠΊ) -->
    <div>
        <p>Shape Form</p>
        <select>
            <!-- ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ -->
            <option value="squares">Square</option>
            <!-- ΠΊΡ€ΡƒΠ³ -->
            <option value="circles">Circle</option>
        </select>
    </div>
    <!-- создаСм ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ количСства ΠΊΠ»Π΅Ρ‚ΠΎΡ‡Π΅ΠΊ -->
    <div>
        <!-- ΡˆΠΈΡ€ΠΈΠ½Π° -->
        <div>
            <!-- устанавливаСм Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΎΡ‚ 10 Π΄ΠΎ 50 (объяснСниС Π½ΠΈΠΆΠ΅) -->
            <p>Shape Width <br> <span>(from 10 to 50)</span></p>
            <input type="number" value="20">
        </div>
        <!-- количСство -->
        <div>
            <!-- устанавливаСм Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ -->
            <p>Shape Number <br> <span>(from 10 to 50)</span></p>
            <input type="number" value="30">
        </div>
    </div>
    <!-- создаСм ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для Ρ†Π²Π΅Ρ‚ΠΎΠ² -->
    <div>
        <!-- Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π° -->
        <div>
            <p>Background Color</p>
            <input type="color" value="#ffff00" required>
        </div>
        <!-- Ρ†Π²Π΅Ρ‚ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ (для Ρ€Π°ΡΠΊΡ€Π°ΡˆΠΈΠ²Π°Π½ΠΈΡ) -->
        <div>
            <p>Shape Color</p>
            <input type="color" value="#0000ff">
        </div>
    </div>
    <!-- создаСм ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для ΠΊΠ½ΠΎΠΏΠΎΠΊ -->
    <div>
        <!-- ΠΊΠ½ΠΎΠΏΠΊΠ° для создания холста -->
        <input type="button" value="Generate Canvas">
        <!-- ΠΊΠ½ΠΎΠΏΠΊΠ° для ΠΏΠΎΠΊΠ°Π·Π°/скрытия Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² ΠΊΠ»Π΅Ρ‚ΠΎΡ‡Π΅ΠΊ (Ρ„ΠΈΠ³ΡƒΡ€) -->
        <input type="button" value="Show/Hide Numbers">
        <!-- ΠΊΠ½ΠΎΠΏΠΊΠ° сохранСния/удалСния изобраТСния (Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°) -->
        <input type="button" value="Save/Delete Image">
        <!-- ΠΊΠ½ΠΎΠΏΠΊΠ° для очистки холста с сохранСниСм ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ количСства Ρ„ΠΈΠ³ΡƒΡ€ -->
        <input type="button" value="Clear Canvas">
        <!-- ΠΊΠ½ΠΎΠΏΠΊΠ° для ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ удалСния холста -->
        <input type="button" value="Delete Canvas">
    </div>
</div>
<!-- холст -->
<canvas></canvas>

Π”ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ (Π»ΠΈΠΌΠΈΡ‚) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ количСства ΠΊΠ»Π΅Ρ‚ΠΎΡ‡Π΅ΠΊ опрСдСлялся ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ. ЭкспСримСнты ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ мСньшиС/большиС значСния нСцСлСсообразны ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎΠΉ Π΄Π΅Ρ‚Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ < 10 для ΡˆΠΈΡ€ΠΈΠ½Ρ‹), сниТСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ > 50 для количСства) ΠΈ Ρ‚.Π΄.

Π‘Ρ‚ΠΈΠ»ΠΈ

Π’ стилях Ρƒ нас Π½ΠΈΡ‡Π΅Π³ΠΎ особСнного.

CSS:

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}
body {
    margin: 0;
    min-height: 100vh;
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;
    align-content: flex-start;
}
h2 {
    width: 100%;
    text-align: center;
    font-size: 2.4em;
    color: #222;
}
.tools {
    height: 100%;
    display: inherit;
    flex-direction: column;
    margin: 0;
    font-size: 1.1em;
}
.buttons {
    display: inherit;
    flex-direction: column;
    align-items: center;
}
div {
    margin: .25em;
    text-align: center;
}
p {
    margin: .25em 0;
    user-select: none;
}
select {
    padding: .
25em .5em; font-size: .8em; } input, select { outline: none; cursor: pointer; } input[type="number"] { width: 30%; padding: .25em 0; text-align: center; font-size: .8em; } input[type="color"] { width: 30px; height: 30px; } .buttons input { width: 80%; padding: .5em; margin-bottom: .5em; font-size: .8em; } .examples { position: absolute; top: 0; right: 0; } a { display: block; } span { font-size: .8em; } canvas { display: none; margin: 1em; cursor: pointer; box-shadow: 0 0 1px #222; }

JavaScript

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ холст ΠΈ Π΅Π³ΠΎ контСкст (2D контСкст рисования):

let c = document.querySelector('canvas'),
    $ = c.getContext('2d')

Находим ΠΊΠ½ΠΎΠΏΠΊΡƒ для создания холста ΠΈ «вСшаСм» Π½Π° Π½Π΅Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события Β«ΠΊΠ»ΠΈΠΊΒ»:

document.querySelector('.generate').onclick = generateCanvas

Π’Π΅ΡΡŒ дальнСйший ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Β«generateCanvasΒ»:

function generateCanvas(){
    . ..
}

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ Ρ„ΠΎΡ€ΠΌΡƒ, ΡˆΠΈΡ€ΠΈΠ½Ρƒ, количСство ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ ΠΈ ΠΎΠ±Ρ‰Π΅Π΅ количСство (холст прСдставляСт собой ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ количСство ΠΊΠ»Π΅Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ ΠΈ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ), Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π°:

// Ρ„ΠΎΡ€ΠΌΠ°
let shapeForm = document.querySelector('select').value
// ΡˆΠΈΡ€ΠΈΠ½Π° (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ†Π΅Π»Ρ‹Π΅ числа)
let shapeWidth = parseInt(document.querySelector('.shapeWidth').value)
// количСство ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ†Π΅Π»Ρ‹Π΅ числа)
let shapeNumber = parseInt(document.querySelector('.shapeNumber').value)
// ΠΎΠ±Ρ‰Π΅Π΅ количСство (ΡƒΠ΄Π²Π°ΠΈΠ²Π°Π΅ΠΌ количСство ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ)
let shapeAmount = Math.pow(shapeNumber, 2)
// Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π°
let backColor = document.querySelector('.backColor').value

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ холста ΠΈ устанавливаСм Π΅ΠΌΡƒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ (ΠΏΠΎΠΌΠ½ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ холста устанавливаСтся Ρ‡Π΅Ρ€Π΅Π· Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹):

// ΡˆΠΈΡ€ΠΈΠ½Π° = высота = ΡˆΠΈΡ€ΠΈΠ½Π° ΠΊΠ»Π΅Ρ‚ΠΎΡ‡ΠΊΠΈ * количСство ΠΊΠ»Π΅Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ
let W = H = shapeWidth * shapeNumber
c. setAttribute('width', W)
c.setAttribute('height', H)

НСкоторыС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ настройки:

// ΡˆΠΈΡ€ΠΈΠ½Π° Π³Ρ€Π°Π½ΠΈΡ†
let border = 1
// Ρ†Π²Π΅Ρ‚ Π³Ρ€Π°Π½ΠΈΡ†
let borderColor = 'rgba(0,0,0,.4)'
// ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½ΠΎΠΌΠ΅Ρ€Π° Ρ„ΠΈΠ³ΡƒΡ€ Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ
let isShown = false
// провСряСм соблюдСниС Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ
// ΠΈ числового Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π΄Π°Π½Π½Ρ‹Ρ…
// ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ холст
// ΠΈ Π² зависимости ΠΎΡ‚ Ρ„ΠΎΡ€ΠΌΡ‹ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ запускаСм ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
if (shapeWidth < 10 || shapeWidth > 50 || shapeNumber < 10 || shapeNumber > 50 || isNaN(shapeWidth) || isNaN(shapeNumber)) {
    throw new Error(alert('wrong number'))
} else if (shapeForm == 'squares') {
    c.style.display = 'block'
    squares()
} else {
    c.style.display = 'block'
    circles()
}

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит функция Β«squaresΒ»:

function squares() {
    // опрСдСляСм Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹
    let x = y = 0
    // массив Ρ„ΠΈΠ³ΡƒΡ€
    let squares = []
    // ΡˆΠΈΡ€ΠΈΠ½Π° ΠΈ высота Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ (ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°)
    let w = h = shapeWidth
    // Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ количСство Ρ„ΠΈΠ³ΡƒΡ€
    addSquares()
    // функция-конструктор
    function Square(x, y) {
        // ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° Ρ… 
        this. x = x
        // ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° y 
        this.y = y
        // Ρ†Π²Π΅Ρ‚ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ = Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π°
        this.color = backColor
        // ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ„ΠΈΠ³ΡƒΡ€Π° Π½Π΅ Π²Ρ‹Π±Ρ€Π°Π½Π°
        this.isSelected = false
    }
    // функция добавлСния Ρ„ΠΈΠ³ΡƒΡ€
    function addSquares() {
        // Ρ†ΠΈΠΊΠ» ΠΏΠΎ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ количСству Ρ„ΠΈΠ³ΡƒΡ€
        for (let i = 0; i < shapeAmount; i++) {
            // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ конструктор
            let square = new Square(x, y)
            // опрСдСляСм ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹
            // для этого ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Ρ… прибавляСм ΡˆΠΈΡ€ΠΈΠ½Ρƒ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹
            x += w
            // ΠΊΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ… становится Ρ€Π°Π²Π½Ρ‹ΠΌ ΡˆΠΈΡ€ΠΈΠ½Π΅ холста
            // ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ y Π½Π° высоту Ρ„ΠΈΠ³ΡƒΡ€Ρ‹
            // Ρ‚Π°ΠΊ осущСствляСтся ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС
            // сбрасываСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…
            if (x == W) {
                y += h
                x = 0
            }
            // добавляСм Ρ„ΠΈΠ³ΡƒΡ€Ρƒ Π² массив
            squares.push(square)
        }
        // рисуСм Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ Π½Π° холстС
        drawSquares()
    }
    // функция рисования Ρ„ΠΈΠ³ΡƒΡ€
    function drawSquares() {
        // ΠΎΡ‡ΠΈΡ‰Π°Π΅ΠΌ холст
        $. clearRect(0, 0, W, H)
        // Ρ†ΠΈΠΊΠ» ΠΏΠΎ количСству Ρ„ΠΈΠ³ΡƒΡ€
        for (let i = 0; i < squares.length; i++) {
            // Π±Π΅Ρ€Π΅ΠΌ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ ΠΈΠ· массива
            let square = squares[i]
            // Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ
            $.beginPath()
            // рисуСм ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹
            $.rect(square.x, square.y, w, h)
            // Ρ†Π²Π΅Ρ‚ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹
            $.fillStyle = square.color
            // ΡˆΠΈΡ€ΠΈΠ½Π° Π³Ρ€Π°Π½ΠΈΡ†
            $.lineWidth = border
            // Ρ†Π²Π΅Ρ‚ Π³Ρ€Π°Π½ΠΈΡ†
            $.strokeStyle = borderColor
            // Π·Π°Π»ΠΈΠ²Π°Π΅ΠΌ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ
            $.fill()
            // ΠΎΠ±Π²ΠΎΠ΄ΠΈΠΌ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ
            $.stroke()
            // Ссли Π½Π°ΠΆΠ°Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ° для отобраТСния Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² Ρ„ΠΈΠ³ΡƒΡ€
            if (isShown) {
                $.beginPath()
                // ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡˆΡ€ΠΈΡ„Ρ‚Π°
                $.font = '8pt Calibri'
                // Ρ†Π²Π΅Ρ‚ тСкста
                $.fillStyle = 'rgba(0,0,0,.6)'
                // рисуСм Π½ΠΎΠΌΠ΅Ρ€, ΠΎΠΏΠΈΡ€Π°ΡΡΡŒ Π½Π° Π΅Π³ΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹
                $. fillText(i + 1, square.x, (square.y + 8))
            }
        }
    }
    // вСшаСм Π½Π° холст ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события "ΠΊΠ»ΠΈΠΊ"
    c.onclick = select
    // функция ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠ»ΠΈΠΊΠ°
    function select(e) {
        // опрСдСляСм ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ курсора
        let clickX = e.pageX - c.offsetLeft,
            clickY = e.pageY - c.offsetTop
        // Ρ†ΠΈΠΊΠ» ΠΏΠΎ количСству Ρ„ΠΈΠ³ΡƒΡ€
        for (let i = 0; i < squares.length; i++) {
            let square = squares[i]
            // опрСдСляСм Ρ„ΠΈΠ³ΡƒΡ€Ρƒ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ»ΠΈΠΊΠ½ΡƒΠ»ΠΈ
            // ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠΎΠ²ΠΎΠ·ΠΈΡ‚ΡŒΡΡ
            // Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, сущСствуСт Π±ΠΎΠ»Π΅Π΅ изящноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅
            if (clickX > square.x && clickX < (square.x + w) && clickY > square.y && clickY < (square.y + h)) {
                // Ρ€Π°ΡΠΊΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ»ΠΈΠΊΠ½ΡƒΠ»ΠΈ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ
                // ΠΏΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Ρ„ΠΈΠ³ΡƒΡ€Π΅ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ (Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π°)
                if (square.isSelected == false) {
                    square.isSelected = true
                    square. color = document.querySelector('.shapeColor').value
                } else {
                    square.isSelected = false
                    square.color = backColor
                }
                // пСрСрисовываСм Ρ„ΠΈΠ³ΡƒΡ€Ρ‹
                // Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ пСрСрисовку Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ»ΠΈΠΊΠ½ΡƒΠ»ΠΈ
                // Π½ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Ρƒ мСня, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΌ
                // Ρ€Π΅ΡˆΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΈΠ³Ρ€Π° Π½Π΅ стоит свСч 
                drawSquares()
            }
        }
    }
    // Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊΠ½ΠΎΠΏΠΊΡƒ для отобраТСния Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² Ρ„ΠΈΠ³ΡƒΡ€ ΠΈ вСшаСм Π½Π° Π½Π΅Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события "ΠΊΠ»ΠΈΠΊ"
    document.querySelector('.show').onclick = showNumbers
    // функция отобраТСния Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² Ρ„ΠΈΠ³ΡƒΡ€
    function showNumbers() {
        if (!isShown) {
            isShown = true
            // Ρ†ΠΈΠΊΠ» ΠΏΠΎ количСству Ρ„ΠΈΠ³ΡƒΡ€ 
            for (let i = 0; i < squares.length; i++) {
                let square = squares[i]
                $.beginPath()
                // ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡˆΡ€ΠΈΡ„Ρ‚Π° 
                $. font = '8pt Calibri'
                // Ρ†Π²Π΅Ρ‚ ΡˆΡ€ΠΈΡ„Ρ‚Π° 
                $.fillStyle = 'rgba(0,0,0,.6)'
                // рисуСм Π½ΠΎΠΌΠ΅Ρ€, ΠΎΠΏΠΈΡ€Π°ΡΡΡŒ Π½Π° Π΅Π³ΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹
                $.fillText(i + 1, square.x, (square.y + 8))
            }
        } else {
            isShown = false
        }
        // пСрСрисовываСм Ρ„ΠΈΠ³ΡƒΡ€Ρ‹
        drawSquares()
    }
}

Ѐункция Β«circlesΒ» ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Β«squaresΒ».

JavaScript:

function circles() {
    // радиус ΠΊΡ€ΡƒΠ³Π°
    let r = shapeWidth / 2
    let x = y = r
    let circles = []
    addCircles()
    function Circle(x, y) {
        this.x = x
        this.y = y
        this.color = backColor
        this.isSelected = false
    }
    function addCircles() {
        for (let i = 0; i < shapeAmount; i++) {
            let circle = new Circle(x, y)
            // ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Ρ… прибавляСтся ΡˆΠΈΡ€ΠΈΠ½Π° Ρ„ΠΈΠ³ΡƒΡ€Ρ‹
            x += shapeWidth
            // ΠΊΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ… становится Ρ€Π°Π²Π½Ρ‹ΠΌ суммС ΡˆΠΈΡ€ΠΈΠ½Ρ‹ холста ΠΈ радиуса Ρ„ΠΈΠ³ΡƒΡ€Ρ‹
            // ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρƒ Π½Π° ΡˆΠΈΡ€ΠΈΠ½Ρƒ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹
            // сбрасываСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ… Π΄ΠΎ значСния радиуса
            if (x == W + r) {
                y += shapeWidth
                x = r
            }
            circles. push(circle)
        }
        drawCircles()
    }
    function drawCircles() {
        $.clearRect(0, 0, W, H)
        for (let i = 0; i < circles.length; i++) {
            let circle = circles[i]
            $.beginPath()
            // рисуСм ΠΊΡ€ΡƒΠ³
            $.arc(circle.x, circle.y, r, 0, Math.PI * 2)
            $.fillStyle = circle.color
            $.strokeStyle = borderColor
            $.lineWidth = border
            $.fill()
            $.stroke()
            if (isShown) {
                $.beginPath()
                $.font = '8pt Calibri'
                $.fillStyle = 'rgba(0,0,0,.6)'
                $.fillText(i + 1, (circle.x - 8), circle.y)
            }
        }
    }
    c.onclick = select
    function select(e) {
        let clickX = e.pageX - c.offsetLeft,
            clickY = e.pageY - c.offsetTop
        for (let i = 0; i < circles.length; i++) {
            let circle = circles[i]
            // опрСдСляСм ΠΊΡ€ΡƒΠ³, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΊΠ»ΠΈΠΊΠ½ΡƒΠ»ΠΈ
            let distanceFromCenter = Math. sqrt(Math.pow(circle.x - clickX, 2) + Math.pow(circle.y - clickY, 2))
            if (distanceFromCenter <= r) {
                if (circle.isSelected == false) {
                    circle.isSelected = true
                    circle.color = document.querySelector('.shapeColor').value
                } else {
                    circle.isSelected = false
                    circle.color = backColor
                }
                drawCircles()
            }
        }
    }
    document.querySelector('.show').onclick = showNumbers
    function showNumbers() {
        if (!isShown) {
            isShown = true
            for (let i = 0; i < circles.length; i++) {
                let circle = circles[i]
                $.beginPath()
                $.font = '8pt Calibri'
                $.fillStyle = 'rgba(0,0,0,.6)'
                $.fillText(i + 1, (circle.x - 8), circle.y)
            }
        } else {
            isShown = false
        }
        drawCircles()
    }
}

Находим ΠΊΠ½ΠΎΠΏΠΊΡƒ для сохранСния/удалСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° (изобраТСния) ΠΈ вСшаСм Π½Π° Π½Π΅Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события Β«ΠΊΠ»ΠΈΠΊΒ»:

document. querySelector('.save').onclick = () => {
    // ΠΈΡ‰Π΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
    let img = document.querySelector('img')
    // Ссли Π½Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ, создаСм
    // Ссли Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ, удаляСм
    img == null ? document.body.appendChild(document.createElement('img')).src = c.toDataURL() : document.body.removeChild(img)
}

Находим ΠΊΠ½ΠΎΠΏΠΊΡƒ для очистки холста ΠΈ…:

document.querySelector('.clear').onclick = () => {
    // ΠΎΡ‡ΠΈΡ‰Π°Π΅ΠΌ ΠΈ пСрСрисовываСм холст
    $.clearRect(0, 0, W, H)
    generateCanvas()
}

Находим ΠΊΠ½ΠΎΠΏΠΊΡƒ для удалСния холста ΠΈ…:

document.querySelector('.delete').onclick = () => {
    $.clearRect(0, 0, W, H)
    c.style.display = 'none'
}

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выглядит Ρ‚Π°ΠΊ:

Codepen (Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΏΠ°Ρ€ΠΎΡ‡ΠΊΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² использования)

Github

Π‘Π»Π°Π³ΠΎΠ΄Π°Ρ€ΡŽ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅.

Editing Girl Base β€” бСсплатный ΠΎΠ½Π»Π°ΠΉΠ½-инструмСнт для рисования Π² пиксСльной Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅

ΠŸΠΎΠΏΡƒΠ»ΡΡ€Π½Ρ‹Π΅

НовыС

Π˜Π·Π±Ρ€Π°Π½Π½Ρ‹Π΅

ЧастныС

Назад

Π”Π°Π»Π΅Π΅

:

Π Π°Π·ΠΌΠ΅Ρ€ пиксСля (1)

Π₯:0, Y: 0

Π¨ΠΈΡ€ΠΈΠ½Π°: 256px
Высота: 144px

Π¨ΠΈΡ€ΠΈΠ½Π°: 0, Высота: 0

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ°. .

слоСв Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ ВсС
Draw.modal.download.frames Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ ВсС
GIF Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ