harmful | cat-v | acme | uriel | 9front | sl | sigrid | qwx | cinap_lenrek

Entity Component System

html | troff | pdf | txt | gmi

[0] ECS merupakan sebuah teknik yang biasanya digunakan dalam

pembuatan game yang bertujuan untuk memisahkan data dengan prilaku,

ECS merupakan singkatan dari 3 kata, yaitu Entity Component System,

ECS hanya digunakan untuk, dalam contoh kali ini saya menggunakan

implementasi ECS yang bernama Apecs yang ada di bahasa Haskell.

Entity

Entity dalam ECS yaitu adalah sebuah id yang nantinya akan diberikan

sebuah component, berikut cara membuat id dalam Apecs

newEntity_ ( Ball

           , Color (RTC.Color 72 207 255 255)

           , Radius 20

           , Position (V2 (fromIntegral windowWidth/2)

                          (fromIntegral windowHeight/2))

           , Velocity (V2 300 200)

           )

dalam contoh di atas kita membuat sebuah entity dengan component Ball,

Color, Radius, Position dan Velocity, dalam ECS component lah yang

terpenting, karena di ECS kita melakukan iterasi pada component karena

setiap entity yang berbeda memiliki component yang berbeda.

Component

pada component ini lah hal yang terpenting, karena untuk mengubah

suatu component dalam entity kita bisa melakukan iterasi pada

component dan mengubahnya, berikut cara membuat component dan

melakukan perubahan pada Apecs

data Ball = Ball deriving Show

instance Component Ball where

  type Storage Ball = Map Ball

newtype Color = Color RL.Color

instance Component Color where

  type Storage Color = Map Color

newtype Radius = Radius Float

instance Component Radius where

  type Storage Radius = Map Radius

newtype Position = Position (V2 Float)

instance Component Position where

  type Storage Position = Map Position

newtype Velocity = Velocity (V2 Float)

instance Component Velocity where

  type Storage Velocity = Map Velocity

selaint component kita diharuskan juga membuat sebuah world untuk

penempatan component, jadi component hanya berada di word yang kita

tentukan

makeWorld "World" [ ’’Ball

                  , ’’Color

                  , ’’Radius

                  , ’’Position

                  , ’’Velocity

                  ]

System

untuk memodifikasi component kita menggunakan cmap atau cmapM_,

perbedaanya adalah penggunaan monad, disinilah kita merubah sebuah

prilaku pada entity, disini juga kita bisa menggunakan rendering

enggine seperti [1] Raylib & [2] SDL atau kita juga bisa menggunakan

graphic API seperti [3] OpenGL, [4] DirecX, [5] Metal atau [6] Vulkan

cmap $ \(Ball, Position x, Velocity y, Radius r) ->

  wallCollide (Position x, Velocity y, Radius r) (V2 sw sh)

wallCollide :: (Position, Velocity, Radius) -> V2 Float -> Velocity

wallCollide ( Position (V2 x y)

            , Velocity (V2 vx vy)

            , Radius r

            ) (V2 sw sh) =

  Velocity (V2 (if x-r-5 < 0 || x > sw-r-10 then -vx else vx)

               (if y-r-5 < 0 || y > sh-r-10 then -vy else vy))

dalam system ini juga kita melakukan rendering, disinilah kita bisa

menggunakan varian monad dari cmap, yaitu cmapM_

render :: System World ()

render =

  do

    liftIO $ RC.beginDrawing

          >> RC.clearBackground (RTC.Color 240 173 194 255)

    cmapM_ $ \(Ball, Position x, Radius r, Color c) ->

      liftIO $ RCS.drawCircleV (v2cast x) (realToFrac r) c

    liftIO RC.endDrawing

disini saya menggunakan Raylib sebagai rendering system, kamu bisa

melikat contohnya di aplikasi yang saya buat bernama [7] eternal-pong.

Referensi

[0] Plan 9 from Bell Labs Overview https://github.com/SanderMertens/ecs-faq

[1] Raylib https://www.raylib.com

[2] SDL https://libsdl.org

[3] OpenGL https://www.opengl.org

[4] DirecX https://learn.microsoft.com/en-us/windows/win32/directx

[5] Metal https://developer.apple.com/metal

[6] Vulkan https://www.vulkan.org

[7] eternal-pong https://codeberg.org/aerphanas/eternal-pong



Powered by troff(1)