Skip to content

Collision ko

Shiraishi_AKi edited this page Oct 6, 2026 · 1 revision

Collision ์‹œ์Šคํ…œ

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

BIT8_CLI๋Š” Tile ๊ธฐ๋ฐ˜ 2D ๊ฒŒ์ž„์„ ์œ„ํ•œ ๊ฒฝ๋Ÿ‰ Collision ์‹œ์Šคํ…œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

BIT8_CLI 0.1.0์—์„œ Node๋Š” Solid Tile๊ณผ ์ง€์›๋˜๋Š” Collider ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฅ์• ๋ฌผ์„ ๊ฐ์ง€ํ•˜๊ณ  Collision์„ ๊ณ ๋ คํ•œ ์ด๋™์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์‹œ์Šคํ…œ์€ ์™„์ „ํ•œ ๋ฌผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜๋ณด๋‹ค ๋‹จ์ˆœํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ด๋™ ์ฒ˜๋ฆฌ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.

1. Collision ๊ฐœ์š”

Collision ์‹œ์Šคํ…œ์€ ์ฃผ๋กœ ์„ธ ๊ฐ€์ง€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • Solid Tile: ์ด๋™์„ ์ฐจ๋‹จํ•˜๋Š” Map Tile
  • Node Collider: Node์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์„ ํƒ์  Collision Geometry
  • Movement API: ์ด๋™์„ ํ™•์ธํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ

์ฃผ์š” Node ๋ฉ”์„œ๋“œ:

self:collide(dx, dy)
self:move(dx, dy)

์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Node Script์—์„œ Collision World์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Solid Tile

Tile์€ Asset Registry๋ฅผ ํ†ตํ•ด Solid๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Asset Registry๋Š” ๋‹ค์Œ ํŒŒ์ผ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

bit8.assets.toml

์˜ˆ:

solid = [6]

์ด ์„ค์ •์€ ํ•ด๋‹น Tilesheet์˜ ์—ฌ์„ฏ ๋ฒˆ์งธ Tile์„ Solid๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋Š” ์„ค์ •์˜ ์ผ๋ถ€์ด๋ฉฐ ์™„์ „ํ•œ Registry ํŒŒ์ผ์€ ์•„๋‹™๋‹ˆ๋‹ค.

Solid Tile์€ Collision ํŒ์ •์—์„œ ์ „์ฒด 8ร—8 ํ”ฝ์…€ ์˜์—ญ์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค.

3. Tile ์ขŒํ‘œ์™€ Collision

BIT8_CLI๋Š” 8ร—8 ํ”ฝ์…€ Tile์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ:

Tile (0, 0) โ†’ Pixels (0โ€“7, 0โ€“7)
Tile (1, 0) โ†’ Pixels (8โ€“15, 0โ€“7)
Tile (0, 1) โ†’ Pixels (0โ€“7, 8โ€“15)

Solid Tile์€ ํ•ด๋‹น ์˜์—ญ์„ ํ†ต๊ณผํ•˜๋Š” ์ด๋™์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

Node๋Š” World Pixel ์ขŒํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ Tile Grid๋ณด๋‹ค ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. Node Collider

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

Collider๋Š” Node์™€ ์—ฐ๊ฒฐ๋œ Collision Geometry๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

Runtime์€ ์ง€์›๋˜๋Š” Collision Geometry๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋™์„ ํŒ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Collider ์„ค์ •์€ Node์˜ Map ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์ง€์›๋˜๋Š” Collider ์†์„ฑ๊ณผ ํŒŒ์ผ ํ˜•์‹์˜ ์ •ํ™•ํ•œ ๋‚ด์šฉ์€ 0.1.0 ๊ตฌํ˜„์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

5. Collision ํ™•์ธ

์ด๋™ ์‹œ Collision ๋ฐœ์ƒ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

self:collide(dx, dy)

์˜ˆ:

func update()
    if self:collide(1, 0) then
        -- ์˜ค๋ฅธ์ชฝ ์ด๋™์ด ์ฐจ๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    end
end

๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ™•์ธํ•˜๋ ค๋Š” ์ด๋™๋Ÿ‰์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋Š” Collision๋งŒ ํ™•์ธํ•˜๋ฉฐ Node์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

6. Collision์„ ๊ณ ๋ คํ•œ ์ด๋™

Collision์„ ๊ณ ๋ คํ•˜์—ฌ Node๋ฅผ ์ด๋™ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

self:move(dx, dy)

์˜ˆ:

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

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

Collision์œผ๋กœ ์ด๋™์ด ์ฐจ๋‹จ๋˜๋ฉด ์‹ค์ œ ์ด๋™ ๊ฑฐ๋ฆฌ๊ฐ€ ์š”์ฒญํ•œ ๊ฑฐ๋ฆฌ๋ณด๋‹ค ์ž‘์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

BIT8_CLI 0.1.0์€ 1ํ”ฝ์…€ ๋‹จ์œ„๋กœ Collision์„ ํŒ์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด๋™ ์ฒ˜๋ฆฌ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. X์ถ•
  2. Y์ถ•

์˜ˆ:

self:move(3, 2)

Runtime์€ ์ˆ˜ํ‰ ์ด๋™์„ ๋จผ์ € ์‹œ๋„ํ•˜๊ณ , ์ดํ›„ ์ˆ˜์ง ์ด๋™์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

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

์ด ๋ฐฉ์‹์€ ๊ฒฝ๋Ÿ‰ Tile ๊ธฐ๋ฐ˜ ์ด๋™ ์ฒ˜๋ฆฌ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

8. Collision Query์™€ Movement

๋‘ ๋ฉ”์„œ๋“œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ ์šฉ๋„ ์œ„์น˜ ๋ณ€๊ฒฝ
self:collide(dx, dy) ์ด๋™ ์‹œ Collision ํ™•์ธ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ
self:move(dx, dy) Collision์„ ๊ณ ๋ คํ•œ ์ด๋™ ์‹œ๋„ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋ณ€๊ฒฝ

๋‹จ์ˆœํ•œ ์ด๋™์—๋Š” self:move()๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์• ๋ฌผ์„ ํ™•์ธํ•œ ํ›„ ๊ฒŒ์ž„ ๋™์ž‘์„ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค๋ฉด self:collide()๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

9. ํ”Œ๋ ˆ์ด์–ด ์ด๋™ ์˜ˆ์ œ

๋‹ค์Œ ์˜ˆ์ œ๋Š” ๋ฐฉํ–ฅ ์ž…๋ ฅ ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

func update()
    if btn(LEFT) then
        self:move(-1, 0)
    end

    if btn(RIGHT) then
        self:move(1, 0)
    end

    if btn(UP) then
        self:move(0, -1)
    end

    if btn(DOWN) then
        self:move(0, 1)
    end
end

์ด ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ์ ์ธ 4๋ฐฉํ–ฅ Collision ๋Œ€์‘ ์ด๋™์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ๋Š” Script๊ฐ€ ์ ์ ˆํ•œ Collision ์„ค์ •์„ ๊ฐ€์ง„ Node์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

10. ์ขŒํ‘œ ์ง์ ‘ ๋ณ€๊ฒฝ

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

self.x = self.x + 1

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

self:move(1, 0)

์žฅ์• ๋ฌผ์ด Node ์ด๋™์— ์˜ํ–ฅ์„ ์ฃผ์–ด์•ผ ํ•œ๋‹ค๋ฉด Collision์„ ๊ณ ๋ คํ•œ ์ด๋™์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

์˜๋„์ ์œผ๋กœ Node์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์ขŒํ‘œ๋ฅผ ์ง์ ‘ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

11. Collision๊ณผ Map

Collision ๋ฐ์ดํ„ฐ๋Š” Map๊ณผ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Map์€ Tile ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , Asset Registry๋Š” ๋“ฑ๋ก๋œ Tile ์ค‘ ์–ด๋–ค Tile์ด Solid์ธ์ง€ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

Node๋Š” Collision Query์™€ ์ด๋™ ์ฒ˜๋ฆฌ ์ค‘ ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

  • ์™„์ „ํ•œ Rigid Body Dynamics
  • ๋ฌผ๋ฆฌ ์—”์ง„์„ ํ†ตํ•œ ์ž๋™ ์ค‘๋ ฅ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
  • ํ˜„์‹ค์ ์ธ ํž˜๊ณผ ์šด๋™๋Ÿ‰ ๊ณ„์‚ฐ
  • ๋ฒ”์šฉ ๋ฌผ๋ฆฌ ํ”„๋ ˆ์ž„์›Œํฌ ์ˆ˜์ค€์˜ ๊ณ ๊ธ‰ Collision Shape

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

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

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

Camera

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

Collision์€ Node๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

Clone this wiki locally