From 80a0c7f88dc18e8951a411ccc24a8b13bf70cabd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=9F=D0=B5=D1=87=D0=B5=D0=BD=D0=B8=D0=BD=20=D0=94=D0=B0?=
 =?UTF-8?q?=D0=BD=D0=B8=D0=BB=D0=B0=20=D0=9C=D0=B8=D1=85=D0=B0=D0=B9=D0=BB?=
 =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=87?= <dmpechenin@edu.hse.ru>
Date: Sat, 22 Mar 2025 23:55:13 +0300
Subject: [PATCH] Textures were added

---
 assets/enemy_blue.png                         | Bin 0 -> 2499 bytes
 assets/enemy_pink.png                         | Bin 0 -> 2458 bytes
 assets/enemy_red.png                          | Bin 0 -> 2798 bytes
 assets/enemy_yellow.png                       | Bin 0 -> 2901 bytes
 assets/pacman.png                             | Bin 0 -> 1975 bytes
 source/BasicAbstractions/Assets.cpp           |  53 ++++++++++++++++++
 source/BasicAbstractions/Assets.h             |  12 ++++
 source/BasicAbstractions/Button/Button.cpp    |   4 +-
 source/BasicAbstractions/Font.h               |  19 -------
 source/Configuration.h                        |  16 ++++--
 .../DynamicEntities/DynamicEntities.cpp       |  44 +++++++++++----
 .../DynamicEntities/DynamicEntities.h         |   5 +-
 .../GameState/Entities/Pacman/Pacman.cpp      |  16 +++++-
 source/States/GameState/GameState.cpp         |   6 +-
 source/States/GameState/GameState.h           |   1 -
 15 files changed, 128 insertions(+), 48 deletions(-)
 create mode 100644 assets/enemy_blue.png
 create mode 100644 assets/enemy_pink.png
 create mode 100644 assets/enemy_red.png
 create mode 100644 assets/enemy_yellow.png
 create mode 100644 assets/pacman.png
 create mode 100644 source/BasicAbstractions/Assets.cpp
 create mode 100644 source/BasicAbstractions/Assets.h
 delete mode 100644 source/BasicAbstractions/Font.h

diff --git a/assets/enemy_blue.png b/assets/enemy_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..e0c9ee5c0734dc2bc006b9af7f0facc6a49d46c5
GIT binary patch
literal 2499
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

literal 0
HcmV?d00001

diff --git a/assets/enemy_pink.png b/assets/enemy_pink.png
new file mode 100644
index 0000000000000000000000000000000000000000..27e30bf41f5d49b6212e9a6e569e3be86e78e379
GIT binary patch
literal 2458
zcmaJ@2~<;88h#PVDsoU+6b3UWf?)PBK$<+XppgQCYz0z;6az#O60=BHD%IjfbZ``~
z6iTSp>KwLdtfV54bO2>Q!%>ug6i^g63KmEVkTHRI0Sb}o+?;#w|Nj5`{_Wm-PR@kx
zBU@Q)v;Y9WDqydF7_@7l>11XCt-Hq`4nZ4?8%F*FsFpjugg$<xMF%7W2Lm3EYzCOX
z)&fR)2=oJB8-b7JWdMkRIWEZuVD5{URS*UPKr3Ji&7@Owz<3d#4ek1o08Pl#!X8Q&
z&=^cAkHvw9a#(O25{JY>HluRba?J8oOFp#aMoY32gaa-Nl_8+boV_=O3jk}H^%GX;
zxyBLlQ9_T1=0yhw5fWKUB=sQc3mQ_uWb0V~Q9yu1CXGjh3z&>FE<r$YnMV*HS+7R9
zz~>>nRFX?{a46i5#i7CRNHh}d0$RY~a3bem5+Tfg&mtZABDtjScx(a+m7boCOvfQv
zoMaTn$HxbS#-gxT1cX3vGtzie0V0jNdBMpae*9_NL=K(JqqEZBdcV{!SbQGI#YG=z
zX)NSP6VR6<rEwR_f(k_GEhr2Ujd~xAM^E|yO>g-i4eHTSS?>fBP}vKl`DQHSNYrOQ
zm_N`Me>#(v#)awuvEIb_)c#~xF3x}$Z9v?CHDnrCRx<rq3>GJxO--bMm_>?#$^fme
zl@J|9<FXiheX~IyJQ^A(jD97e{$yTBU1mn6(Rm=0-#lf7dL=7n+5WzOhUS&j5DuLN
zU77h@q0;7~8R`u1&`}ZmI5hoBieRxA;QJmH5w#Mv!a*=}^AA#aRDUXu24d0J9SAfI
zfyG8(F@(S22^eorG>)L}l-|ud*hN1?l>Yh}T<3+iGOvXm3upmR|9E(yg<EBf0sxGM
z1N?VI2w<-%?fl-ItAEgP_%@TSCuRyvIzQcq++u&t%)UIuHXoO3dRyq~idoNt**UBR
zU49npvcDn3-xb|Ww91@0>itL?_+_#0NPN~wrDn8OI((tl?tY_rsx_!m*po(lMLWS9
zbxXQESeK&uDWvn^ugSCBmupCK3dQqDjpp8er<7RIQ5_9;uR|&g?lhk}A_mJQIy=L4
zzm|}5z&^s<0g>;miNKPUUaz`0#W_7<)OWrJ$Ll|eoBJP1QEyFa-2;neyEM~UE$LqW
z)lO<vlI6IWV(;14uo0W;e>l9j!O2bCa%Z?DBe!C^<6zZxAv3<sB<P%_gJ&wn<C6H;
zjXNKmE!>Q|;pCmqKGzHv73QVZPFN%aTplq?Htwa6b8*M}vSvAc&szwLDC|jfYtV*v
zr^?=XZ`?`#uyNN#o65V?*EVvquHi{}k?Of;1OF@8(c_u%qp>qxinmoS;w$3s8Hpux
zRYPRm`6-=5y~@;Fn=<$GnDHig>WJz16UcT`b=+E$>_sd+f9RVwd>*;fEfPudt5<Gw
zoQU$M6#sRfrod{ZDB`C!6X&6D{L}DZW4Tv-T^z+)-s*+`X=B}z^K)x;Pry{&0KxZA
z!@<AYoRwS{sAvMmWxJl-+Lj$MX9Fe($L_~BJS#@4OJxl~GGxe0N)Osv?~W4I;^8PL
z2<fqy-PKnO7mKxVQ##g-F4qpb8qT(oEgx?{h)#XoHyDYmjUft%8(O$XwiwZ75AB80
z?nn2HE0x<yPR(snW(mVG!$6wfT$iF#dJd+D)!b&yDA~^zI>#4|l5nP@2Z)K$QrrG^
z%a0YU1TEB2zR=O9!Zixd_7sU>0~b7^dSq9!+f1~icGUE5*;BuV!0XWa>qVLxHz=e;
zIsSOy%O=$TK4#ja$)Sss-7a^k%sPCQs*4h!P-CBO9-W~4$Ds>>?C^n=eU;U8DJ1Bv
z%Gi0kn!d4xYx8Noa`z-Y`3yOy?Ha?T{+wilG9ppG&<u=M)KB-w&3t3kgUosoS(7>O
z*s+nAJ9U*IbAKnT`a+8e#_4d7X4L2!St&k7)*nrQZk<e7VAe%4x%02zpHYqsC-eyu
zSC86__fG(OHkG?OXAn0G2?v?|DcS2;svd3uDo>(O5=A?Uuj!I3bHC-Uw?>BS(OjN+
zWi@VFI8`bua|<mxEiJNd=&t{4{rIHJc}V!Q#EY1>w|Lzz*USrCGj)^whiN^Si|)>c
z%g!p*gQ}C$TgxEg8n^S7(k8DRls0q0y4DlZTQ7cCIq_2RW=0gJ7Ll&z%wU9ea@FRe
zscUr^{HFXmig!o;OjW>}k;hiPuhO0oeFr65ABaBl(q6xPLZv+|tu5`F_-*y*gUjAU
zYWI$tlb?HzJ|O&G*>z%*WsOC6ZIq42o*r4aDsJ7CSE2YvF9K|@FizKKs?Y4_yE`6I
z{*bpH->k@1G+!qaSnbFNYjJlROl=HIkXyzF#;U%Dw{AT0&l<Nz)30M={(c8Ten8I1
z9PIjc_qUfGF>hra`We%p$@(P=eMJ*ldNU52W1Vh2Z0(mhRx=bmHlY9e5wLrofAuE`
G$NvWdY2@Po

literal 0
HcmV?d00001

diff --git a/assets/enemy_red.png b/assets/enemy_red.png
new file mode 100644
index 0000000000000000000000000000000000000000..423708fd3cce0594dff5b8e6dde7f71e86cb22ce
GIT binary patch
literal 2798
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%0D6#*&_U>S#LF;j
z;zvewQl|K$M);k>)p^}dMD58ErwHAY2exG{+S6XlSAM^TK0X|!oPJI>j)WB3w)|o`
z0PS)Le+$EaJG#h7L5c=}#@X8Ip+zCxjl84ABn@xpH!{4~cXJ}zyh*s@mug>oa<+16
z-g%loLn_5`yFBpE-F77O!odvcEj{BxwRijN3oZlOG1~vxn!(FeSsPyP9M`?mjyzVl
zjjQ;R=Ws`6kXdtRZ^2XZjkT@lyiooR&N=*omg26WM|TEF&?8J|?wNAMaSJDxXvb{`
SH*?uvIvXno%c6Zp68;DIOtFdp

literal 0
HcmV?d00001

diff --git a/assets/enemy_yellow.png b/assets/enemy_yellow.png
new file mode 100644
index 0000000000000000000000000000000000000000..028c7b2d74a31c20c4cc5aefcc3dc9e9e61fee05
GIT binary patch
literal 2901
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

literal 0
HcmV?d00001

diff --git a/assets/pacman.png b/assets/pacman.png
new file mode 100644
index 0000000000000000000000000000000000000000..91b0b9fff9063be5b604449df17a1348b6558320
GIT binary patch
literal 1975
zcmeAS@N?(olHy`uVBq!ia0vp^HbCsa!3HGVWJFE?DaPU;cPEB*=VV?2Im=QbJkxxA
z8MJ_G4hA+xAqHlU5+Gz?lwx27vl$q|7^UItI7SVq8YZ9`Lk1wpAPU53?U@WLQ1vxH
z8U#Fm7-$lN4#=!X&B;wH$uCj}D9Tqb)-%>K0?IKjU_{utfC+Af%>rgP+X1MK;l5Ws
z$oZTF9+AZi4BWyX%*Zfnjs(z*S(zabB@w<pR>}FfdWk9dNvV1jxdk9y3^o;3KxS@g
zNuokUZcbjYRfVk*ScMgk4HDK@QUEI{$+lIB@C{IK&M!(;Fw-;8Gf=YQQczH^DN0GR
z3UYCSY6tRcl`=|73as??%gf94%8m8%i_-NCEiEne4UF`SjC6r2bc-wVN)jt{^NN)r
zhQQ2mNi9w;$}A|!%+FH*nVXoDUs__Tqy(}E4j}GKt;j^!lvfP(7SMzGAQ^o_Jp+Ag
z+DbChaA*U`;M4{TBe=IvEUQQ?fM@~-2E>gvAQxDHBQ(+_GdDG_80a56GZP!I(=a3u
zo<q_Yfuzv@StF7Jx<=>xocyBTg2d!hJ42`zBq1c#Ag@|Q1f>?|=ahoN+Rog_00{IA
zL8Og7hBUfXgwD{s%n~~zs1`I~bX}1Md2ALUOQUP`FUm{>rWmkWfnEbU5LpaKJus%M
zoQqOH87U+`KgSMRzOvCrSA}MPFEHV!B$gz)B$lMw85tOv>KYj98X1Kc8Cn?_Secq?
z8yEu_5Mxl(Ld~(!2c=%5)C|cgU{PRRvEu@2h2=Xtt`%O<I>21Y;_2cTlEM0P=Ix?p
z1%bBYOU_jn_x<nww&?PalKS@2uuV!D&y6N`HJq;dqrJM!B2}yZ_)9^fs|It}4CTHq
zcztwh_bQWJFD$BrxOSMz>mK0l-I?Ee`&B=0joO97emm!En^Mjj`g;+>@vz{pA(?lW
z>%-o#m`-hKot%`H|8Nict<?%@n|F83`MqkdcVd%lcYvjuD3gV2Nm<mlb}2_)`Q^bu
zznw%wMe<uYzb%tozp=N*by>j8JtATcgOu;D^1oHPc3snkhCNbGIo)rZ3A<WTu6gH-
z?e48jL7CGJoz+^cb3o^fmO<;`?L~=`eUCKBRyWN%soE*_d(-}_R!-5u5|(SO7u5#s
z2rrFvT=`*Zd4z+$$UDg!OO|o(Q!0s0`KRj9Q9WPuoo6g}iDE`L*KUWIRY5yaOKTM*
z#oRUis7gnzY;Q6OFXoaCSQ7k|b^gI?eP{0+p0;Rr!bXk?)-~VOo@j~@)?KmJt<{~$
z_nS?;=!U?OIx~(*=ZXso6Pjw&<Lh4@U*MU)G3fwH*UqQ^7fxy_Vn|^(OFaEK-Tu_|
z!!eVKUp$+YZ|Gl^;MKg?qxEFjW7ee>n)BLSJDB6{T|RWS;_9OVLah%33q8%(uWFFA
zQ>~bKK=a`2%4nslKN+6}oG@qB2|503+wWY>>ZqjS-{mxy-t~<->>OO+m+zNYz0f6U
z^X@C3Js)1^4)Jc4@_Z|=!S}Q_W`^^jmd^90SNjV&Ets1Zsb_r1co56XJd6AAf9VI3
zbF^#T=&qT0TITq28=p({QO&z7Rkxj1S~7D@_|!sqdrh8<R~4y0;`$oq-iUG7t8sQi
zLa3-&_k_R9^RquDf8E)Tzs2Z!gz(f&%2!+Y^%B1PzrZTLVoO9$gu#m4TbSDQm3QBF
z6s<lv+a$v06}OG$jZ<pd*tk2^PMGKLlV8&6GXMOjRXR^@OV^ZGiZ9t<5;FT1OV<DO
zUc0QXmosl}z4U;Ei|x-IyLYl|Y!#Xr%-rI8yhRc$qqBb4PPnxH#eriLUrfqGrYsC*
qJZzVfe0+}Gx>hZDZh^iNpV&`T?_1q9ciJjY-Q?-&=d#Wzp$Py%Bd-?#

literal 0
HcmV?d00001

diff --git a/source/BasicAbstractions/Assets.cpp b/source/BasicAbstractions/Assets.cpp
new file mode 100644
index 0000000..297ec89
--- /dev/null
+++ b/source/BasicAbstractions/Assets.cpp
@@ -0,0 +1,53 @@
+#include "Assets.h"
+
+sf::Font& Assets::GetFont() {
+    static sf::Font font;
+    if (!font.getInfo().family.empty()) return font;
+    if (!font.loadFromFile(config::FONT_FILE))
+        throw std::runtime_error("Failed to load font");
+    return font;
+}
+
+sf::Texture& Assets::GetPacmanTexture() {
+    static sf::Texture texture;
+    if (texture.getSize() != sf::Vector2u{0, 0}) return texture;
+    if (!texture.loadFromFile(config::PACMAN_FILE))
+        throw std::runtime_error("Failed to load texture: pacman");
+    return texture;
+}
+
+sf::Texture& Assets::GetEnemyRedTexture() {
+    static sf::Texture texture;
+    if (texture.getSize() != sf::Vector2u{0, 0})
+        return texture;
+    if (!texture.loadFromFile(config::ENEMY_RED_FILE))
+        throw std::runtime_error("Failed to load texture: enemy red");
+    return texture;
+}
+
+sf::Texture& Assets::GetEnemyPinkTexture() {
+    static sf::Texture texture;
+    if (texture.getSize() != sf::Vector2u{0, 0})
+        return texture;
+    if (!texture.loadFromFile(config::ENEMY_PINK_FILE))
+        throw std::runtime_error("Failed to load texture: enemy pink");
+    return texture;
+}
+
+sf::Texture& Assets::GetEnemyYellowTexture() {
+    static sf::Texture texture;
+    if (texture.getSize() != sf::Vector2u{0, 0})
+        return texture;
+    if (!texture.loadFromFile(config::ENEMY_YELLOW_FILE))
+        throw std::runtime_error("Failed to load texture: enemy yellow");
+    return texture;
+}
+
+sf::Texture& Assets::GetEnemyBlueTexture() {
+    static sf::Texture texture;
+    if (texture.getSize() != sf::Vector2u{0, 0})
+        return texture;
+    if (!texture.loadFromFile(config::ENEMY_BLUE_FILE))
+        throw std::runtime_error("Failed to load texture: enemy blue");
+    return texture;
+}
\ No newline at end of file
diff --git a/source/BasicAbstractions/Assets.h b/source/BasicAbstractions/Assets.h
new file mode 100644
index 0000000..b716fc4
--- /dev/null
+++ b/source/BasicAbstractions/Assets.h
@@ -0,0 +1,12 @@
+#pragma once
+#include <Configuration.h>
+
+struct Assets final {
+    Assets() = delete;
+    static sf::Font& GetFont();
+    static sf::Texture& GetPacmanTexture();
+    static sf::Texture& GetEnemyRedTexture();
+    static sf::Texture& GetEnemyYellowTexture();
+    static sf::Texture& GetEnemyBlueTexture();
+    static sf::Texture& GetEnemyPinkTexture();
+};
diff --git a/source/BasicAbstractions/Button/Button.cpp b/source/BasicAbstractions/Button/Button.cpp
index 5032979..64e7f4e 100644
--- a/source/BasicAbstractions/Button/Button.cpp
+++ b/source/BasicAbstractions/Button/Button.cpp
@@ -1,6 +1,6 @@
 #include <BasicAbstractions/Button/Button.h>
 #include <Configuration.h>
-#include <BasicAbstractions/Font.h>
+#include <BasicAbstractions/Assets.h>
 
 void Button::set(const sf::Vector2f pos, const sf::Vector2f size, const std::string& text, const size_t font_size, std::unique_ptr<ISelectCommand> ptr_command) {
     m_rectangle.setSize(size);
@@ -8,7 +8,7 @@ void Button::set(const sf::Vector2f pos, const sf::Vector2f size, const std::str
     m_rectangle.setFillColor(config::BUTTON_COLOR_FILL);
     m_rectangle.setOutlineThickness(config::BUTTON_FRAME_THICKNESS);
     m_rectangle.setOutlineColor(config::BUTTON_COLOR_FRAME);
-    m_text.setFont(MyFont::Instance());
+    m_text.setFont(Assets::GetFont());
     m_text.setCharacterSize(font_size);
     m_text.setFillColor(config::BUTTON_COLOR_TEXT);
     m_text.setString(text);
diff --git a/source/BasicAbstractions/Font.h b/source/BasicAbstractions/Font.h
deleted file mode 100644
index d77f027..0000000
--- a/source/BasicAbstractions/Font.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#pragma once
-#include <Configuration.h>
-
-class MyFont final {
-public:
-    static sf::Font& Instance() {
-        static MyFont instance;
-        return instance.m_font;
-    }
-    MyFont(const MyFont&) = delete;
-    MyFont& operator=(const MyFont&) = delete;
-private:
-    MyFont() {
-        if (!m_font.loadFromFile(config::FONT_FILE))
-            throw std::runtime_error("Failed to load font");
-    }
-    ~MyFont() = default;
-    sf::Font m_font;
-};
diff --git a/source/Configuration.h b/source/Configuration.h
index 759b57d..d8829d0 100644
--- a/source/Configuration.h
+++ b/source/Configuration.h
@@ -3,7 +3,7 @@
 
 namespace config {
     // Общее:
-    constexpr unsigned int FRAME_RATE_LIMIT = 60;
+    constexpr unsigned int FRAME_RATE_LIMIT = 10;
     // Меню:
     const sf::Vector2f BUTTON_SIZE = { 250, 80 };
     const size_t BUTTON_FONT_SIZE = static_cast<size_t>(BUTTON_SIZE.y / 1.5f);
@@ -18,6 +18,12 @@ namespace config {
     constexpr char BUTTON_TEXT_EXIT[] = "Exit";
     // Игра:
     const sf::VideoMode GAME_VIDEO_MODE{ 1080, 720 };
+    constexpr char PACMAN_FILE[] = ASSETS_PATH "pacman.png";
+    constexpr char ENEMY_PINK_FILE[] = ASSETS_PATH "enemy_pink.png";
+    constexpr char ENEMY_RED_FILE[] = ASSETS_PATH "enemy_red.png";
+    constexpr char ENEMY_BLUE_FILE[] = ASSETS_PATH "enemy_blue.png";
+    constexpr char ENEMY_YELLOW_FILE[] = ASSETS_PATH "enemy_yellow.png";
+    constexpr size_t ENEMY_ON_SPRITE_COUNT = 8;
     constexpr char EASY_GAME_TITLE[] = "Level: Easy";
     constexpr char MEDIUM_GAME_TITLE[] = "Level: Medium";
     constexpr char HARD_GAME_TITLE[] = "Level: Hard";
@@ -26,12 +32,12 @@ namespace config {
     constexpr float MEDIUM_GAME_ENEMY_RATIO = 0.03f;
     constexpr float HARD_GAME_ENEMY_RATIO = 0.07f;
     constexpr float ROOM_SIZE = 50;
-    constexpr float GAME_ENEMY_SIZE = ROOM_SIZE * 0.7;
+    constexpr float GAME_ENEMY_SIZE = ROOM_SIZE * 0.8;
     constexpr float GAME_FOOD_SIZE = ROOM_SIZE * 0.1;
     constexpr float ENEMY_SPEED = 80;
-    constexpr float PACMAN_SPEED = 300;
+    constexpr float PACMAN_SPEED = 400;
     // Пакмэн:
-    constexpr float GAME_PACMAN_SIZE = ROOM_SIZE * 0.8;
+    constexpr float GAME_PACMAN_SIZE = ROOM_SIZE * 0.9;
     constexpr sf::Keyboard::Key KEY_LEFT = sf::Keyboard::A;
     constexpr sf::Keyboard::Key KEY_RIGHT = sf::Keyboard::D;
     constexpr sf::Keyboard::Key KEY_UP = sf::Keyboard::W;
@@ -46,11 +52,9 @@ namespace config {
     const sf::Color BUTTON_COLOR_SELECTION{ 255, 180, 180 };
     const sf::Color BUTTON_COLOR_FRAME{ 0, 0, 0 };
     const sf::Color SELECT_LEVEL_BACKGROUND_COLOR{ 230,230,230 };
-    const sf::Color GAME_COLOR_PACMAN{ 250, 150, 0 };
     const sf::Color GAME_COLOR_ROOM{ 255, 255, 255 };
     const sf::Color GAME_COLOR_WALL{ 0, 0, 0 };
     const sf::Color GAME_FOOD_COLOR{ 0, 200, 100 };
-    const sf::Color GAME_ENEMY_COLOR{ 255, 50, 0 };
     const sf::Color GAME_COLOR_BACKGROUND_INGAME{ 230,230,230 };
     const sf::Color TEXT_COLOR_NOTIFICATION{ 0, 0, 0, 255};
     const sf::Color NOTIFICATION_BANNER_COLOR_PLAY{ 0, 100, 255, 200 };
diff --git a/source/States/GameState/Entities/DynamicEntities/DynamicEntities.cpp b/source/States/GameState/Entities/DynamicEntities/DynamicEntities.cpp
index 1e228fa..a47c0a6 100644
--- a/source/States/GameState/Entities/DynamicEntities/DynamicEntities.cpp
+++ b/source/States/GameState/Entities/DynamicEntities/DynamicEntities.cpp
@@ -1,10 +1,24 @@
 #include <Configuration.h>
+#include <BasicAbstractions/Assets.h>
 #include <States/GameState/Entities/DynamicEntities/DynamicEntities.h>
 
-Enemy::Enemy() : m_rectangle({config::GAME_ENEMY_SIZE, config::GAME_ENEMY_SIZE}) {
-    m_rectangle.setFillColor(config::GAME_ENEMY_COLOR);
-    m_rectangle.setOrigin({config::GAME_ENEMY_SIZE/2, config::GAME_ENEMY_SIZE/2});
-    m_distance_limit = config::ENEMY_SPEED/config::ROOM_SIZE;
+Enemy::Enemy() {
+    std::mt19937 gen{std::random_device{}()};
+    std::uniform_int_distribution<size_t> dist{0, 3};
+    const sf::Texture* texture;
+    switch (dist(gen)) {
+        case 0: texture = &Assets::GetEnemyRedTexture(); break;
+        case 1: texture = &Assets::GetEnemyYellowTexture(); break;
+        case 2: texture = &Assets::GetEnemyBlueTexture(); break;
+        case 3: texture = &Assets::GetEnemyPinkTexture(); break;
+        default: texture = &Assets::GetEnemyRedTexture(); break;;
+    }
+
+    m_sprite.setTexture(*texture);
+    m_sprite.setTextureRect(sf::IntRect(0, 0,
+        static_cast<int>(texture->getSize().x / config::ENEMY_ON_SPRITE_COUNT), static_cast<int>(texture->getSize().y)));
+    m_sprite.setOrigin(static_cast<float>(texture->getSize().x) / (2.f * config::ENEMY_ON_SPRITE_COUNT), static_cast<float>(texture->getSize().y) / 2.f);
+    m_distance_limit = config::ENEMY_SPEED / config::ROOM_SIZE;
 }
 
 std::unique_ptr<IDynamicEntity> Enemy::clone() const {
@@ -13,11 +27,11 @@ std::unique_ptr<IDynamicEntity> Enemy::clone() const {
 
 void Enemy::action() {
     if (m_is_moving) {
-        const sf::Vector2f cur_pos = m_rectangle.getPosition();
-        sf::Vector2f displacement = m_estimated_position - cur_pos;
+        const sf::Vector2f cur_pos = m_sprite.getPosition();
+        const sf::Vector2f displacement = m_estimated_position - cur_pos;
         const float distance = std::sqrt(displacement.x * displacement.x + displacement.y * displacement.y);
         if (distance < m_distance_limit) {
-            m_rectangle.setPosition(m_estimated_position);
+            m_sprite.setPosition(m_estimated_position);
             m_is_moving = false;
             return;
         }
@@ -32,7 +46,14 @@ void Enemy::action() {
             delta_y = std::min(direction.y, displacement.y);
         else
             delta_y = std::max(direction.y, displacement.y);
-        m_rectangle.move(delta_x, delta_y);
+        m_sprite.move(delta_x, delta_y);
+        m_time_count += frame_duration;
+        if(m_time_count > 1) {
+            sf::IntRect rect = m_sprite.getTextureRect();
+            rect.left = static_cast<int>((rect.left / rect.width + 4) % config::ENEMY_ON_SPRITE_COUNT) * rect.width;
+            m_sprite.setTextureRect(rect);
+            m_time_count = 0;
+        }
     }
     else {
         if (static_cast<size_t>(m_stopwatch.getElapsedTime().asMilliseconds()) < m_dist_milliseconds(m_rng))
@@ -44,15 +65,14 @@ void Enemy::action() {
 }
 
 void Enemy::draw_into(sf::RenderWindow& window) const {
-    window.draw(m_rectangle);
+    window.draw(m_sprite);
 }
 
 void Enemy::prepare_for_first_drawing() {
-    m_rectangle.setPosition(m_ptr_room->get_position());
+    m_sprite.setPosition(m_ptr_room->get_position());
 }
 
 void Enemy::prepare_for_drawing() {
     m_estimated_position = m_ptr_room->get_position();
     m_is_moving = true;
-    action();
-}
+}
\ No newline at end of file
diff --git a/source/States/GameState/Entities/DynamicEntities/DynamicEntities.h b/source/States/GameState/Entities/DynamicEntities/DynamicEntities.h
index ceb115f..74572ba 100644
--- a/source/States/GameState/Entities/DynamicEntities/DynamicEntities.h
+++ b/source/States/GameState/Entities/DynamicEntities/DynamicEntities.h
@@ -17,11 +17,12 @@ public:
     void draw_into(sf::RenderWindow& window) const override;
     void prepare_for_first_drawing() override;
     void prepare_for_drawing() override;
-    sf::FloatRect getBounds() const { return m_rectangle.getGlobalBounds(); }
+    sf::FloatRect getBounds() const { return m_sprite.getGlobalBounds(); }
     std::unique_ptr<IGameEvent> accept(IVisitor* ptr_visitor) override { return ptr_visitor->visit(this); }
 private:
-    sf::RectangleShape m_rectangle;
+    sf::Sprite m_sprite;
     sf::Vector2f m_estimated_position;
+    float m_time_count = 0;
     bool m_is_moving = false;
     float m_distance_limit;
     sf::Clock m_stopwatch;
diff --git a/source/States/GameState/Entities/Pacman/Pacman.cpp b/source/States/GameState/Entities/Pacman/Pacman.cpp
index 5a4fad2..696e78d 100644
--- a/source/States/GameState/Entities/Pacman/Pacman.cpp
+++ b/source/States/GameState/Entities/Pacman/Pacman.cpp
@@ -1,10 +1,11 @@
 #include <Configuration.h>
+#include <BasicAbstractions/Assets.h>
 #include <States/GameState/Entities/DynamicEntities/DynamicEntities.h>
 #include <States/GameState/Entities/Pacman/Pacman.h>
 #include <States/GameState/Entities/StaticEntities/StaticEntities.h>
 
 Pacman::Pacman() : m_circle{ config::GAME_PACMAN_SIZE/2 } {
-    m_circle.setFillColor(config::GAME_COLOR_PACMAN);
+    m_circle.setTexture(&Assets::GetPacmanTexture());
     m_circle.setOrigin(config::GAME_PACMAN_SIZE/2, config::GAME_PACMAN_SIZE/2);
     m_distance_limit = config::PACMAN_SPEED/config::ROOM_SIZE;
 }
@@ -21,12 +22,22 @@ void Pacman::move() {
     const sf::Vector2f cur_pos = m_circle.getPosition();
     const sf::Vector2f displacement = m_estimated_position - cur_pos;
     const float distance = std::sqrt(displacement.x * displacement.x + displacement.y * displacement.y);
+
     if (distance < m_distance_limit) {
         m_circle.setPosition(m_estimated_position);
         m_is_moving = false;
         return;
     }
-    const sf::Vector2f direction = config::PACMAN_SPEED * frame_duration * displacement / distance;
+
+    sf::Vector2f  direction = displacement / distance;
+    float target_angle = 0;
+    if (std::abs(direction.x) > std::abs(direction.y))
+        target_angle = (direction.x > 0) ? 0 : 180;
+    else
+        target_angle = (direction.y > 0) ? 90 : 270;
+    m_circle.setRotation(target_angle);
+
+    direction = config::PACMAN_SPEED * frame_duration * displacement / distance;
     float delta_x, delta_y;
     if (direction.x > 0)
         delta_x = std::min(direction.x, displacement.x);
@@ -50,7 +61,6 @@ void Pacman::prepare_for_first_drawing() {
 void Pacman::prepare_for_drawing() {
     m_estimated_position = m_ptr_room->get_position();
     m_is_moving = true;
-    move();
 }
 
 std::unique_ptr<IGameEvent> Pacman::visit(Food* ptr_food) {
diff --git a/source/States/GameState/GameState.cpp b/source/States/GameState/GameState.cpp
index 33c41d1..d24164e 100644
--- a/source/States/GameState/GameState.cpp
+++ b/source/States/GameState/GameState.cpp
@@ -1,4 +1,4 @@
-#include <BasicAbstractions/Font.h>
+#include <BasicAbstractions/Assets.h>
 #include <States/GameState/GameState.h>
 #include <States/SelectState/SelectState.h>
 
@@ -12,7 +12,7 @@ GameState::GameState(IStateManager& state_manager, const sf::VideoMode& video_mo
         round((static_cast<float>(m_window.getSize().x) - m_rect.getSize().x) / 2.0f),
         round((static_cast<float>(m_window.getSize().y) - m_rect.getSize().y) / 2.0f)
     );
-    m_text.setFont(MyFont::Instance());
+    m_text.setFont(Assets::GetFont());
     m_text.setCharacterSize(config::NOTIFICATION_FONT_SIZE);
     m_text.setStyle(sf::Text::Bold);
     m_text.setFillColor(config::TEXT_COLOR_NOTIFICATION);
@@ -34,7 +34,7 @@ void GameState::event_handling() {
                 case GameContext::INGAME:
                     context.state = GameContext::PAUSE;
                     break;
-                default:
+                default: break;
             }
         }
         if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Z && event.key.control)
diff --git a/source/States/GameState/GameState.h b/source/States/GameState/GameState.h
index c83d6bc..d4624bd 100644
--- a/source/States/GameState/GameState.h
+++ b/source/States/GameState/GameState.h
@@ -1,5 +1,4 @@
 #pragma once
-#include <Configuration.h>
 #include <BasicAbstractions/IState.h>
 #include <BasicAbstractions/IWindowKeeper.h>
 #include <States/GameState/Maze/Maze.h>
-- 
GitLab