Nodes ko - Akiaaaa20/Bit8_CLI GitHub Wiki

Node ์‹œ์Šคํ…œ

English | ็น้ซ”ไธญๆ–‡ | ๆ—ฅๆœฌ่ชž | ํ•œ๊ตญ์–ด

Node๋Š” BIT8_CLI์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

Node๋Š” ๊ฒŒ์ž„ ์„ธ๊ณ„ ์•ˆ์— ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์†์„ฑ์„ ์ €์žฅํ•˜๊ณ , Script๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ, Collision์„ ์ฒ˜๋ฆฌํ•˜๊ณ , Sprite๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

BIT8_CLI 0.1.0์—์„œ Node๋Š” Map ์‹œ์Šคํ…œ์˜ ์ผ๋ถ€๋กœ ์ •์˜๋˜๋ฉฐ Runtime์— ์˜ํ•ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

Main assembles the game. Nodes live the game.

Main์€ ๊ฒŒ์ž„์„ ๊ตฌ์„ฑํ•˜๊ณ , Node๋Š” ๊ทธ ์„ธ๊ณ„ ์•ˆ์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

1. Node๋ž€?

Node๋Š” ๊ฒŒ์ž„ ์„ธ๊ณ„์— ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋Œ€์ƒ์„ Node๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ
  • ์  ์บ๋ฆญํ„ฐ
  • NPC
  • ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด
  • ์›€์ง์ด๋Š” ๋ฐœํŒ
  • ๋™์ž‘์„ ๊ฐ€์ง„ ์žฅ์‹ ๊ฐ์ฒด

๊ฐ Node๋Š” ๊ณ ์œ ํ•œ ์œ„์น˜, ์†์„ฑ, ๋™์ž‘์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ˆœํ•œ Tile๊ณผ ๋‹ฌ๋ฆฌ Node๋Š” Script๋ฅผ ์‹คํ–‰ํ•˜๊ณ  Runtime ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Node์™€ Map

Node๋Š” Map ๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

BIT8_CLI๋Š” .b8map ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Map์—๋Š” ๋‹ค์Œ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Tile ๋ฐ์ดํ„ฐ
  • Node
  • Camera

Node๋Š” Tile Grid์™€ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ฐœ๋ณ„ Map Cell์— ์ œํ•œ๋˜์ง€ ์•Š๊ณ  ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Map์ด 8ร—8 ํ”ฝ์…€ Tile์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์บ๋ฆญํ„ฐ๋Š” 1ํ”ฝ์…€ ๋‹จ์œ„๋กœ ์›€์ง์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ Maps ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

3. Node ์†์„ฑ

๊ฐ Node๋Š” Script์— ๋‹ค์Œ ์†์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ ์„ค๋ช…
self.id ์•ˆ์ •์ ์ธ Node ์‹๋ณ„์ž
self.name Node ์ด๋ฆ„
self.x World X ์ขŒํ‘œ
self.y World Y ์ขŒํ‘œ
self.enabled Node ํ™œ์„ฑํ™” ์—ฌ๋ถ€

์˜ˆ:

func update()
    self.x = self.x + 1
end

์ด ์ฝ”๋“œ๋Š” ์—…๋ฐ์ดํŠธํ•  ๋•Œ๋งˆ๋‹ค Node์˜ X ์ขŒํ‘œ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

Node ์œ„์น˜๋Š” World Pixel ์ขŒํ‘œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

4. Node Script

Node๋Š” BIT8_CLI์˜ Lua ๊ธฐ๋ฐ˜ Script๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Script ํŒŒ์ผ์˜ ํ™•์žฅ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

.b8

์˜ˆ:

player.b8

Node Script๋Š” ๋‹ค์Œ Lifecycle Function์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func init()
end

func update()
end

func draw()
end

์ด ํ•จ์ˆ˜๋“ค์€ ์ดˆ๊ธฐํ™”, ๋™์ž‘ ์—…๋ฐ์ดํŠธ, ๊ทธ๋ž˜ํ”ฝ ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

Runtime์€ ๊ฒŒ์ž„ Lifecycle์— ๋”ฐ๋ผ Node Script๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

5. self ๊ฐ์ฒด

Node Script์—์„œ self๋Š” ํ˜„์žฌ Node๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

self๋ฅผ ํ†ตํ•ด Node ์†์„ฑ๊ณผ ์ง€์›๋˜๋Š” ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ:

func init()
    self.speed = 1
end

func update()
    self.x = self.x + self.speed
end

์ด ์˜ˆ์ œ์—์„œ๋Š” speed๋ผ๋Š” Runtime ์†์„ฑ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ Node ์ƒํƒœ๋Š” Runtime ์‹คํ–‰ ์ค‘์— ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

Script์—์„œ ๋งŒ๋“  ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์ด ์›๋ณธ .b8map ํŒŒ์ผ์— ์ž๋™ ์ €์žฅ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

6. Node ์ด๋™

Node๋Š” ์ขŒํ‘œ๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

self.x = self.x + 1

ํ•˜์ง€๋งŒ ์ขŒํ‘œ๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๊ณผ Collision์„ ๊ณ ๋ คํ•œ ์ด๋™์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

BIT8_CLI๋Š” ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

self:move(dx, dy)

์ด ๋ฉ”์„œ๋“œ๋Š” ์ง€์›๋˜๋Š” Collision ๊ทœ์น™์„ ์ ์šฉํ•˜๋ฉด์„œ Node ์ด๋™์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ:

func update()
    self:move(1, 0)
end

์ด ์ฝ”๋“œ๋Š” Node๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ 1ํ”ฝ์…€ ์ด๋™ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

7. Collision ํŒ์ •

BIT8_CLI๋Š” Node Collision Query๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

self:collide(dx, dy)

์ด ๋ฉ”์„œ๋“œ๋Š” ์š”์ฒญํ•œ ์ด๋™์ด ์ง€์›๋˜๋Š” Collision Geometry์™€ ์ถฉ๋Œํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

ํŒ์ • ์ž์ฒด๋Š” Node๋ฅผ ์ด๋™์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ:

func update()
    if not self:collide(1, 0) then
        self:move(1, 0)
    end
end

์ด ์ฝ”๋“œ๋Š” ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ ํ›„ ์ด๋™์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

Runtime์€ Solid Tile๊ณผ์˜ Collision์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Node์—๋Š” ์„ ํƒ์ ์œผ๋กœ Collider ์ •๋ณด๋ฅผ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

BIT8_CLI 0.1.0์€ ์™„์ „ํ•œ Physics Engine์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ Collision ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

8. ์ด๋™ ์ฒ˜๋ฆฌ ์ˆœ์„œ

Collision์„ ๊ณ ๋ คํ•œ ์ด๋™์€ ํ”ฝ์…€ ๋‹จ์œ„ ํŒ์ •์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Runtime์€ X์ถ•์„ ๋จผ์ € ์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ Y์ถ•์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋™์€ 1ํ”ฝ์…€์”ฉ ๋‹จ๊ณ„์ ์œผ๋กœ ํŒ์ •๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Node๋Š” Tile ๊ธฐ๋ฐ˜ Collision World์—์„œ๋„ ํ”ฝ์…€ ๋‹จ์œ„๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ:

self:move(2, 1)

์ด ๊ฒฝ์šฐ ๋จผ์ € ์ˆ˜ํ‰ ์ด๋™์„ ์‹œ๋„ํ•˜๊ณ , ๊ทธ๋‹ค์Œ ์ˆ˜์ง ์ด๋™์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Collision์— ๋”ฐ๋ผ ์š”์ฒญํ•œ ์ด๋™์˜ ์ผ๋ถ€ ๋˜๋Š” ์ „์ฒด๊ฐ€ ์ฐจ๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

9. Node์™€ Sprite

Node๋Š” Sprite Definition์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ž˜ํ”ฝ์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Sprite Definition์€ ๋‹ค์Œ ํŒŒ์ผ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

bit8.sprites.toml

Node๋Š” ์ •์˜๋œ Sprite๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

self:sprite("Player")

Sprite์—๋Š” ์ด๋ฆ„์ด ์ง€์ •๋œ Animation์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ:

self:play("walk")

ํ˜„์žฌ Sprite Frame์„ ๊ทธ๋ฆฌ๋ ค๋ฉด ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

self:spr()

์‚ฌ์šฉ ์˜ˆ:

func init()
    self:sprite("Player")
    self:play("idle")
end

func draw()
    self:spr()
end

์ด ์˜ˆ์ œ๋Š” Player๋ผ๋Š” Sprite์™€ idle์ด๋ผ๋Š” Animation์ด ๋ฏธ๋ฆฌ ์ •์˜๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

10. ์˜๊ตฌ Sprite ์ฐธ์กฐ

BIT8_CLI 0.1.0์€ Map ๋ฐ์ดํ„ฐ์— Sprite ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Node๋Š” Sprite Definition์˜ ์ด๋ฆ„์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ:

Player

Runtime์€ Node์˜ ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์ €์žฅ๋œ Sprite ์ฐธ์กฐ๋ฅผ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ฐ Script์—์„œ Sprite๋ฅผ ์ˆ˜๋™์œผ๋กœ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š์•„๋„ Node๋Š” ์ง€์ •๋œ Sprite๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

11. Node ํ™œ์„ฑํ™” ๋ฐ ๋น„ํ™œ์„ฑํ™”

Node๋Š” ๋‹ค์Œ ์†์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

self.enabled

์ด ์†์„ฑ์€ Node์˜ ํ™œ์„ฑํ™” ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์˜ˆ:

func update()
    if self.enabled then
        self.x = self.x + 1
    end
end

ํ™œ์„ฑํ™” ์ƒํƒœ๋Š” ๊ฒŒ์ž„ ๋™์ž‘์„ ์ œ์–ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„ํ™œ์„ฑํ™”๋œ Node์˜ ์ •ํ™•ํ•œ Runtime ์ฒ˜๋ฆฌ ๋ฐฉ์‹์€ ํ•ด๋‹น ๋ฆด๋ฆฌ์Šค์˜ ๊ตฌํ˜„์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

12. Main Script์™€ Node Script

BIT8_CLI๋Š” Main Script์™€ Node ๋™์ž‘์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Main Script๋Š” ๊ฒŒ์ž„ ์ „์ฒด์˜ Lifecycle์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func init()
end

func update()
end

func draw()
    cls(0)
    map()
end

Node Script๋Š” ๊ฐœ๋ณ„ ๊ฒŒ์ž„ ๊ฐ์ฒด์˜ ๋™์ž‘์— ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ:

func init()
    self.speed = 1
end

func update()
    self:move(self.speed, 0)
end

func draw()
    self:spr()
end

์ด ๊ตฌ์กฐ๋Š” ๋ชจ๋“ˆํ™”๋œ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Main์€ ๊ฒŒ์ž„์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Node๋Š” ๊ฒŒ์ž„ ์„ธ๊ณ„ ์•ˆ์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

13. Node ํŽธ์ง‘

BIT8_CLI์˜ VS Code Map Workspace๋Š” Node ํŽธ์ง‘ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Workspace์—์„œ ์ง€์›๋˜๋Š” Node ์†์„ฑ์„ ํ™•์ธํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ:

  • Node ์„ ํƒ
  • ์œ„์น˜
  • ์ด๋ฆ„
  • Script ์ฐธ์กฐ
  • ํ™œ์„ฑํ™” ์ƒํƒœ
  • ์ง€์›๋˜๋Š” Sprite ๋ฐ Collider ์†์„ฑ

Map Workspace๋Š” ํ”„๋กœ์ ํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

Runtime์€ Node์˜ ๋™์ž‘์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ Map Workspace ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

14. ํ˜„์žฌ ์ œํ•œ ์‚ฌํ•ญ

BIT8_CLI 0.1.0์€ ๊ฒฝ๋Ÿ‰ Node ์‹œ์Šคํ…œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์™„์ „ํ•œ Scene Tree Engine์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ธฐ๋Šฅ์€ ํ™•๋ฆฝ๋œ 0.1.0 Node ๋ชจ๋ธ์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๋ฒ”์šฉ ๊ณ„์ธตํ˜• Scene Tree
  • ์™„์ „ํ•œ Rigid Body Physics
  • ์™„์ „ํ•œ Event / Signal ์‹œ์Šคํ…œ
  • ์ž„์˜์˜ Runtime ์†์„ฑ ์ž๋™ ์˜๊ตฌ ์ €์žฅ

Node ์‹œ์Šคํ…œ์€ ๊ฒฝ๋Ÿ‰ ๊ฒŒ์ž„ ๊ฐ์ฒด, Script, ์ด๋™ ๋ฐ ๋ Œ๋”๋ง์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„

๋‹ค์Œ ํŽ˜์ด์ง€:

Sprites and Animation

๊ด€๋ จ ๋ฌธ์„œ:

Main์€ ๊ฒŒ์ž„์„ ๊ตฌ์„ฑํ•˜๊ณ , Node๋Š” ๊ทธ ์„ธ๊ณ„ ์•ˆ์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.