2D graphics - kuimoani/defold GitHub Wiki

2D Graphics

2D ๊ฒŒ์ž„์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์€ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง€๋ฉฐ, ํ”Œ๋ฆฝ-๋ถ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด๋‚˜ ๋ณต์žกํ•œ ์ŠคํŒŒ์ธ(Spine) ์• ๋‹ˆ๋ฉ”์ด์…˜์— ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ํƒ€์ผ๋งต์˜ ๋ ˆ๋ฒจ์ด๋‚˜ ๋ฐฐ๊ฒฝ์— ๋งคํ•‘๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”๋‰ด์–ผ์—์„œ๋Š” Defold๊ฐ€ ์ง€์›ํ•˜๋Š” 2D ๊ทธ๋ž˜ํ”ฝ ์š”์†Œ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ, ๋‹ค์ˆ˜์˜ ์ด๋ฏธ์ง€๋“ค์„ ํ•˜๋‚˜ ํ˜น์€ ๋ช‡ ๊ฐœ์˜ ํฐ ์ด๋ฏธ์ง€๋กœ ๋ณ‘ํ•ฉํ•˜์—ฌ, ์ž‘์€ ์›๋ณธ ์ด๋ฏธ์ง€๋ฅผ ์–ด๋–ค ํฐ ์ด๋ฏธ์ง€์˜ ์„œ๋ธŒ-์ด๋ฏธ์ง€๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์€ ์ด๋ฏธ์ง€๋“ค์„ ํฐ ์ด๋ฏธ์ง€๋กœ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์€ ๋ฐ์Šคํฌํƒ‘PC๋‚˜ ์ฝ˜์†”๊ฒŒ์ž„๊ธฐ์— ๋น„ํ•ด ๋ฉ”๋ชจ๋ฆฌ์™€ ์ „๋ ฅ์ด ๋ถ€์กฑํ•œ ๋ชจ๋ฐ”์ผ ๋””๋ฐ”์ด์Šค์—์„œ ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

Defold์—๋Š” ํฐ ์ด๋ฏธ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์˜ ์—์…‹์ด ์žˆ์Šต๋‹ˆ๋‹ค:

Atlases

์•„ํ‹€๋ผ์Šค๋Š” ์ด๋ฏธ์ง€๋“ค์˜ ๋ชฉ๋ก์„ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ž๋™์ ์œผ๋กœ ํฐ ์ด๋ฏธ์ง€๋กœ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๊ฒƒ์€ http://en.wikipedia.org/wiki/Texture_atlas ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Tile Sources

ํƒ€์ผ ์†Œ์Šค๋Š” ๊ท ์ผํ•œ ๊ฒฉ์ž(grid)์— ์ •๋ ฌ๋œ ์„œ๋ธŒ-์ด๋ฏธ์ง€๋“ค์„ ์ด๋ฏธ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํˆด์—์„œ๋Š” ํƒ€์ผ์…‹(tile set)์ด๋‚˜ ์Šคํ”„๋ผ์ดํŠธ์‹œํŠธ(sprite sheet)๋ผ๋Š” ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๊ฒƒ์€ http://en.wikipedia.org/wiki/Tileset#Tile_set ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Importing Image Files

Defold์—์„œ ์—์…‹์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ ๊ณ„์ธต๊ตฌ์กฐ(project hierarchy)์— ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ, ๊ทธ๋ž˜ํ”ฝ์— ์“ฐ์ผ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์ž„ํฌํŠธ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ์—์…‹์„ ์ž„ํฌํŠธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทธ๋ƒฅ ๋‹น์‹ ์˜ ์ปดํ“จํ„ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ Defold ์—๋””ํ„ฐ์˜ ํ”„๋กœ์ ํŠธ ์ต์Šคํ”Œ๋กœ๋Ÿฌ ์ฐฝ(Project Explorer)์˜ ์ ๋‹นํ•œ ์œ„์น˜๋กœ ๋“œ๋ž˜๊ทธ-์•ค-๋“œ๋กญ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ, Defold๋Š” ์˜ค์ง PNG ์ด๋ฏธ์ง€ ํฌ๋ฉง ๋งŒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Importing image files

Importing image files

Creating an Atlas

์•„ํ‹€๋ผ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์—, ๋จผ์ € ์•„ํ‹€๋ผ์Šค์— ์ด๋ฏธ์ง€๋ฅผ ์ฑ„์šฐ๋Š” ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์•„ํ‹€๋ผ์Šค์— ์ด๋ฏธ์ง€๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ์Šคํ”„๋ผ์ดํŠธ๋‚˜ ํŒŒํ‹ฐํดFX ์ปดํฌ๋„ŒํŠธ์™€ ๊ฐ™์ด ์˜ค๋ธŒ์ ํŠธ ์ปดํฌ๋„ŒํŠธ์— ๊ทธ๋ž˜ํ”ฝ ์†Œ์Šค๋กœ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์•„๋ž˜์˜ Sprite ์™€ ParticleFX ๊ฐ€์ด๋“œ ์ฐธ๊ณ )

  1. ์œ„์—์„œ ์„ค๋ช…ํ•œ๋Œ€๋กœ ์ด๋ฏธ์ง€ ํŒŒ์ผ๋“ค์„ ์ž„ํฌํŠธ ํ•˜๊ธฐ
  2. ํ”„๋กœ์ ํŠธ ์ต์Šคํ”Œ๋กœ๋Ÿฌ ์ฐฝ(Project Explorer)์—์„œ ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ New > Atlas File ์„ ํƒํ•˜๊ธฐ
  3. ์•„์›ƒ๋ผ์ธ ์ฐฝ(Outline)์—์„œ ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ Add Images ์„ ํƒํ•˜๊ธฐ

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•„ํ‹€๋ผ์Šค์— ์ถ”๊ฐ€ํ•˜๊ธธ ์›ํ•˜๋Š” ์ด๋ฏธ์ง€๋“ค์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ™”์ƒ์ž๊ฐ€ ์—ด๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ํ•„ํ„ฐ๋งํ•˜๊ฑฐ๋‚˜ ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ํŒŒ์ผ๋“ค์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Creating an atlas, adding images

Creating an atlas

Defining flip-book animations

์•„ํ‹€๋ผ์Šค์—์„œ ํ•˜์œ„ ์ด๋ฏธ์ง€๋“ค์„ ์„ ํƒํ•ด์—ฌ ํ”Œ๋ฆฝ-๋ถ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ์•„์›ƒ๋ผ์ธ ์ฐฝ(Outline)์—์„œ ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ Add Animation Group ์„ ํƒํ•˜๊ธฐ
  2. ์ƒ์„ฑ๋œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ทธ๋ฃน์— ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ Add Images๋ฅผ ๋ˆ„๋ฅด๊ณ  ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ํ”„๋ ˆ์ž„์— ์‚ฌ์šฉํ•  ์ด๋ฏธ์ง€๋“ค์„ ์„ ํƒํ•˜๊ธฐ
  3. ํ•„์š”ํ•œ ๋งŒํผ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์†์„ฑ(Properties)์„ ์กฐ์ ˆํ•˜๊ธฐ

ํ•„์š”ํ•˜๋‹ค๋ฉด ์ด๋ฏธ์ง€๋ฅผ ๋“œ๋ž˜๊ทธํ•ด์„œ ์•„์›ƒ๋ผ์ธ ์ฐฝ์˜ ์ด๋ฏธ์ง€ ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ ์‹ ๊ณต(Edit ๋ฉ”๋‰ด, ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ, ํ‚ค๋ณด๋“œ ๋‹จ์ถ•ํ‚ค)์„ ์‚ฌ์šฉํ•˜์—ฌ ์•„์›ƒ๋ผ์ธ ์ฐฝ์˜ ์ด๋ฏธ์ง€๋“ค์„ ์‰ฝ๊ฒŒ ๋ณต์‚ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ํ•˜๋ ค๋ฉด ํ•ด๋‹น ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์„ ํƒํ•˜๊ณ  ํ‚ค๋ณด๋“œ์˜ Spaceํ‚ค๋ฅผ ๋ˆŒ๋Ÿฌ ์ฃผ์„ธ์š”.

Creating a Tile Source

ํƒ€์ผ ์†Œ์Šค๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋ชจ๋“  ํƒ€์ผ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ์ด๋ฏธ์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํƒ€์ผ์€ ๋ฐ˜๋“œ์‹œ ์™„์ „ํžˆ ๋™์ผํ•œ ํฌ๊ธฐ๋กœ ๊ฒฉ์ž(grid)์— ๋ฐฐ์น˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Defold๋Š” ๊ฐ ํƒ€์ผ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์กฐ์ ˆํ•˜๋Š” spacing๊ณผ padding์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Defold๋Š” ๋•Œ๋•Œ๋กœ ๋ฐœ์ƒํ•˜๋Š” visual artifacts(์ž”์ƒ์ด๋‚˜ ํ”Œ๋ฆฌ์ปค๋ง ๋“ฑ์˜์˜ ์ด์ƒํ•œ ์‹œ๊ฐ์  ํ˜„์ƒ๋“ค)์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™์ ์œผ๋กœ ์™ธ๊ณฝ์„ ์„ ๋Œ์ถœ(extrude borders) ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ์†Œ์Šค๊ฐ€ ์ค€๋น„๋˜๋ฉด ์•„๋ž˜ ๋ฐฉ๋ฒ•์œผ๋กœ ํƒ€์ผ ์†Œ์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ์ด๋ฏธ์ง€๋ฅผ ํ”„๋กœ์ ํŠธ ์ต์Šคํ”Œ๋กœ๋Ÿฌ ์ฐฝ(Project Explorer)์œผ๋กœ ๋“œ๋ž˜๊ทธํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์— ์ž„ํฌํŠธํ•ฉ๋‹ˆ๋‹ค.
  2. ์ƒˆ ํƒ€์ผ ์†Œ์Šค(Tile Source) ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  3. ์†์„ฑ์ฐฝ์˜ Image ์†์„ฑ์—์„œ ๊ฒ€์ƒ‰[...] ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ด๋ฏธ์ง€๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ด๋ฏธ์ง€๊ฐ€ ์—๋””ํ„ฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  4. ํƒ€์ผ์˜ ๋†’์ด(Tile Height)๋‚˜, ๋„“์ด(Tile Width), ๋งˆ์ง„(Tile Margin), ๊ฐ„๊ฒฉ(Tile Spacing)์„ ์›๋ณธ ์ด๋ฏธ์ง€์— ์•Œ๋งž๊ฒŒ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์…€์ด ํˆฌ๋ช…ํ•œ ๊ทธ๋ฆฌ๋“œ์— ์ •ํ™•ํ•˜๊ฒŒ ์ •๋ ฌ๋˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Creating a Tile Source

์„ ํ˜• ํ•„ํ„ฐ๋ง(linear filtering - ์•„๋ž˜ ์ฐธ์กฐ)๊ณผ ํ•จ๊ป˜ ํƒ€์ผ๋“ค์ด ๋‹ค๋‹ฅ ๋‹ค๋‹ฅ ๋ถ™์–ด์žˆ๋Š”(์™ธ๊ณฝ์„ ์ด ์—†๋Š”) ํƒ€์ผ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด edge bleeding์œผ๋กœ ๋ถˆ๋ฆฌ๋Š” visual artifact๊ฐ€ ๋ฐœ์ƒํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ด์›ƒํ•œ ํƒ€์ผ์˜ ๊ฐ€์žฅ์ž๋ฆฌ๊ฐ€ ์ปฌ๋Ÿฌ๊ฐ€ ์žˆ๋Š” ํ”ฝ์…€๋กœ ๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ด ๊ฐ€์žฅ์ž๋ฆฌ ๋ถ€๋ถ„์˜ ์ƒ‰์ƒ์ด ํ˜๋Ÿฌ ๋„˜์น˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ์ด์ƒํ•˜๊ฒŒ ๋ณด์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ Extrude Border ์†์„ฑ(์•„ํ‹€๋ผ์Šค๋‚˜ ํƒ€์ผ ์†Œ์Šค์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ)์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ๊ฐ€์žฅ์ž๋ฆฌ์˜ ํ”ฝ์…€์ด ๊ฒŒ์ž„ ์‹คํ–‰์— ์‚ฌ์šฉ๋œ ์ตœ์ข… ํ…์Šค์ณ์—์„œ ์ž๋™์ ์œผ๋กœ ๋ช‡ ๋ฒˆ์ด๋‚˜ ๋ณต์ œ๋˜์–ด์•ผ ํ•˜๋Š” ์ง€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ข‹์€ ์ธก์ •๋ฐฉ๋ฒ•์€ ๊ฒŒ์ž„์ด ๋ณด์—ฌ์งˆ ๋•Œ ํ…์Šค์ณ์˜ ํฌ๊ธฐ๋ฅผ ์–ผ๋งŒํผ ์กฐ์ ˆํ• ์ง€์— ์•Œ๋งž๋Š” ์ˆซ์ž๋ฅผ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒŒ์ž„์›”๋“œ๋ฅผ ์ ˆ๋ฐ˜ ํฌ๊ธฐ๋กœ ๋‚˜ํƒ€๋‚ด๋ ค๋ฉด Extrude Borders๋ฅผ 2๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ…์Šค์ฒ˜๋ฅผ ์ ˆ๋ฐ˜ ํฌ๊ธฐ๋กœ ์ค„์—ฌ์„œ ์‚ฌ์šฉํ•˜๋ฉด, ๋ Œ๋”๋ง์— ๋ฐ‰๋งต(mipmap)์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฐ‰๋งต์€ ์›๋ณธ ์ด๋ฏธ์ง€์˜ ๋„“์ด์™€ ๋†’์ด๊ฐ€ ์ ˆ๋ฐ˜์ž…๋‹ˆ๋‹ค.

Tile Source Collision Shapes

ํƒ€์ผ ๋งต(Tile Map)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌผ๋ฆฌ ์ƒํ˜ธ์ž‘์šฉ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ์ถฉ๋Œ ์˜์—ญ(Collision shape)์€ ์ž๋™์ ์œผ๋กœ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Defold๋Š” Collision ์†์„ฑ์— ๋ช…์‹œ๋œ ์ด๋ฏธ์ง€๋กœ๋ถ€ํ„ฐ ๊ฐ ํƒ€์ผ์— ๋ณผ๋กํ•œ ์˜์—ญ(Convex shape)์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์•ŒํŒŒ ์ฑ„๋„(alpha channel)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์†์„ฑ์—๋Š” ์ด๋ฏธ์ง€์™€ ๋˜‘๊ฐ™์€ ์ถฉ๋Œ ์˜์—ญ์„ ์œ„ํ•ด ๋™์ผํ•œ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถฉ๋Œ ์˜์—ญ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์ด๊ฒ ์ง€๋งŒ, ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ์ถฉ๋Œ ์˜์—ญ์„ ์›ํ•œ๋‹ค๋ฉด ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋ฅผ ์„ ํƒํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค. ์ถฉ๋Œ(collision) ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •ํ•˜๋ฉด, ์ƒ์„ฑ๋œ ์ถฉ๋Œ ์˜์—ญ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ ํƒ€์ผ์˜ ์œค๊ณฝ์„ ์œผ๋กœ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๊ฒƒ์€ Physics ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ  ๋ฐ”๋ž๋‹ˆ๋‹ค.

Collision Shapes

Tile Source flip-book animations

ํƒ€์ผ ์†Œ์Šค์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ •์˜ํ•˜๋ ค๋ฉด ๊ฐ ํ”„๋ ˆ์ž„์— ํƒ€์ผ์„ ํ•˜๋‚˜ ์”ฉ ํ• ๋‹น(๋™์ผํ•œ ๋„“์ด์™€ ๋†’์ด๋กœ ๊ฒฉ์ž์— ๋“ค์–ด๋งž๊ฒŒ)ํ•ด์•ผ ํ•˜๋ฉฐ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ ์ˆœ์„œ๋กœ ๋‚˜๋ž€ํžˆ ๋†“์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์ค„๋กœ ํ–‰์ด ๋„˜์–ด๊ฐ€๋ฉด ๋‹ค์‹œ ๋งจ ์™ผ์ชฝ๋ถ€ํ„ฐ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ํƒ€์ผ ์†Œ์Šค์—๋Š” "anim"์ด๋ผ๊ณ  ํ•˜๋Š” ๊ธฐ๋ณธ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ํด๋ฆญํ•˜๋ฉด ์ด๋ฆ„(id), ์‹œ์ž‘๊ณผ ๋ ํ”„๋ ˆ์ž„(Start Tile, End Tile), ์žฌ์ƒ(Playback) ๋ฐฉ๋ฒ• ๋ฐ ์†๋„(Fps), ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๊ฐ€๋กœ๋‚˜ ์„ธ๋กœ๋กœ ๋’ค์ง‘ํ˜€์•ผ ํ•˜๋Š”์ง€(Flip Horizontally, Flip Vertically)๋ฅผ ์„ค์ •ํ•˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ์†์„ฑ์ฐฝ(Properties)์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

Tile Source add animation

์•„์›ƒ๋ผ์ธ(Outline) ์ฐฝ์˜ Tile Source๋ฅผ ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ํด๋ฆญํ•˜์—ฌ ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด๋ฅผ ์—ด๊ณ  Add Animation๋ฅผ ์„ ํƒํ•˜์—ฌ ํƒ€์ผ ์†Œ์Šค์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‰ฝ๊ฒŒ ๋” ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Tile Source animation

Manipulating Game Objects and components

๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์— ์‹œ๊ฐ์  ๊ตฌ์„ฑ์š”์†Œ(์Šคํ”„๋ผ์ดํŠธ, ํŒŒํ‹ฐํดFX ๋“ฑ)๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, ์ปดํฌ๋„ŒํŠธ์˜ ์œ„์น˜๊ฐ’๊ณผ ํšŒ์ „ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์˜ ์œ„์น˜, ํšŒ์ „์— ๋Œ€ํ•œ ์˜คํ”„์…‹์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ด ๊ฐ’์€ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์กฐ๋ฆฝ(assemble)ํ• ๋•Œ ์ปดํฌ๋„ŒํŠธ์— ์„ค์ • ๋ฉ๋‹ˆ๋‹ค.

Component position

Defold์˜ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋Š” ์ด๋™, ํšŒ์ „์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ด ์†์„ฑ๋“ค์„ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ด๋™, ํšŒ์ „ํ•˜๋ฉด ํ•˜์œ„์˜ ์ปดํฌ๋„ŒํŠธ๋„ ๊ฐ™์ด ์›€์ง์ด๊ฒŒ ๋˜์ง€๋งŒ, ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์— ์ƒ๋Œ€์ ์ธ ์œ„์น˜๊ฐ’๊ณผ ํšŒ์ „๊ฐ’(relative position and rotation)์€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๋Š” ๋„๊ณ  ์ผค ์ˆ˜ ์žˆ์ง€๋งŒ ๋™์ ์œผ๋กœ ์ด๋™, ํšŒ์ „ํ•˜๊ฑฐ๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ์ฃผ๋Š”๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(์•„๋ž˜์˜ ์˜ˆ์™ธ์‚ฌํ•ญ ์ฐธ๊ณ ). ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ทธ๋ž˜ํ”ฝ์˜ ์œ„์น˜, ํšŒ์ „์„ ๋ณ€๊ฒฝํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด ๋ณ„๋„์˜ ๊ฒŒ์ž„์˜ค๋ธŒ์ ํŠธ๋กœ ์ง‘์–ด ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์˜ ๊ทธ๋ฃน์ด๋‚˜ ๊ฒŒ์ž„์˜ค๋ธŒ์ ํŠธ ๊ณ„์ธต(hierarchy)์€ ์ปฌ๋ ‰์…˜์— ํŽธ๋ฆฌํ•˜๊ฒŒ ์กฐ๋ฆฝ(assemble)๋œ ํ›„ ์ด ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์ž์œ ๋กญ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

Component position

    -- wand ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์— ์ด๋™, ํšŒ์ „ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œํ‚ค๊ธฐ
    go.animate("wand", "position", go.PLAYBACK_ONCE_FORWARD, vmath.vector3(530, 79, -0.1), go.EASING_INOUTSINE, 0.5)
    go.animate("wand", "euler", go.PLAYBACK_ONCE_FORWARD, vmath.vector3(0, 0, -70), go.EASING_INOUTSINE, 0.5)

Dynamically scaling Sprites

์Šคํ”„๋ผ์ดํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์™€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์„œ๋กœ ์—ฐ๊ด€๋˜์–ด ๋™์ž‘ํ•˜๋Š”์ง€ ์ž‘๋™ ๋ฐฉ์‹์˜ ์ดํ•ด(mental model)๊ฐ€ ์กฐ๊ธˆ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํ”„๋ผ์ดํŠธ๋Š” vmatch.vector3 ํƒ€์ž…์ธ "scale" ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ปดํฌ๋„ŒํŠธ์— ์•„๋ž˜์ฒ˜๋Ÿผ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

go.animate("my_object#sprite", "scale.x", go.PLAYBACK_ONCE_FORWARD, 1.5, go.EASING_INOUTSINE, 2)

Sprites

์Šคํ”„๋ผ์ดํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ๊ทธ๋ž˜ํ”ฝ์ด๋‚˜ ํ”Œ๋ฆฝ๋ถ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์— ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์บ๋ฆญํ„ฐ๋‚˜ ์†Œํ’ˆ(props)๋“ค์„ ๋งŒ๋“œ๋Š” ๋ฐ ์“ฐ์ด๋ฉฐ, ์Šคํ”„๋ผ์ดํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค:

  1. ์Šคํ”„๋ผ์ดํŠธ๊ฐ€ ์†ํ•  ๊ฒŒ์ž„์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์—ด๊ธฐ
  2. ์•„์›ƒ๋ผ์ธ ์ฐฝ์—์„œ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์— ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ ๋ˆŒ๋Ÿฌ์„œ Add Component ์„ ํƒํ•˜๊ธฐ
  3. "Sprite" ์„ ํƒํ•˜๊ธฐ
  4. ์Šคํ”„๋ผ์ดํŠธ์˜ Image ์†์„ฑ์„ ํƒ€์ผ์†Œ์Šค๋‚˜ ์•„ํ‹€๋ผ์Šค๋กœ ์ง€์ •ํ•˜๊ธฐ
  5. ์Šคํ”„๋ผ์ดํŠธ์˜ Default Animation ์†์„ฑ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”Œ๋ ˆ์ดํ•  ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ์ง€์ •ํ•˜๊ธฐ

๊ธฐ๋ณธ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ๊ฒŒ์ž„ ์‹คํ–‰์ค‘์— ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ํ”Œ๋ ˆ์ด ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ด๋ฏธ์ง€ ๋ฆฌ์†Œ์Šค๋กœ ์•„ํ‹€๋ผ์Šค๋ฅผ ์‚ฌ์šฉ์ค‘์ด๋ผ๋ฉด Default Animation ์†์„ฑ์˜ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด๋ฅผ ํ†ตํ•ด์„œ ์ด๋ฏธ์ง€๋“ค์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ผ ์†Œ์Šค์— ์žˆ๋Š” ์ด๋ฏธ์ง€๋กœ๋ถ€ํ„ฐ ์Šคํ”„๋ผ์ดํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด, 1 ํ”„๋ ˆ์ž„ ์งœ๋ฆฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋งŒ๋“ค๊ณ  Playback ์†์„ฑ์„ "None"์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Collision Shapes

์Šคํ”„๋ผ์ดํŠธ๋Š” ์•„์ง ํƒ€์ผ์†Œ์Šค์—์„œ ์ถฉ๋Œ๋ชจํ˜•(Collision Shape)์„ ์ž๋™์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , ๋‹ค๋ฅธ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ถฉ๋Œ ๋ชจํ˜•(Collision Shape)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถฉ๋Œ ์˜ค๋ธŒ์ ํŠธ(Collision Object)๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๊ฒƒ์€ Physics ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ  ๋ฐ”๋ž๋‹ˆ๋‹ค.

Blend Mode

๋ธ”๋ Œ๋“œ ๋ชจ๋“œ ์†์„ฑ์€ ์Šคํ”„๋ผ์ดํŠธ๊ฐ€ ๋’ค์ชฝ์— ๊ฒน์ณ์ง„ ๊ทธ๋ž˜ํ”ฝ๊ณผ ์–ด๋–ป๊ฒŒ ํ˜ผํ•ฉ(blend)ํ• ์ง€ ์ •์˜ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ธ”๋ Œ๋“œ ๋ชจ๋“œ์˜ ์ข…๋ฅ˜์™€ ๊ฐ๊ฐ ์–ด๋–ป๊ฒŒ ๊ณ„์‚ฐ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์žˆ์Šต๋‹ˆ๋‹ค:

Alpha

๊ธฐ๋ณธ ๋ธ”๋ Œ๋”ฉ: a0 * rgb0 + (1 - a0) * rgb1

Add

ํ•ด๋‹น ์Šคํ”„๋ผ์ดํŠธ ํ”ฝ์…€์˜ ์ปฌ๋Ÿฌ๊ฐ’์„ ์ด์šฉํ•ด ๋ฐฐ๊ฒฝ์„ ๋ฐ๊ฒŒ ํ•จ: rgb0 + rgb1

Add Alpha

๋ณด์—ฌ์ง€๋Š”(visible) ์Šคํ”„๋ผ์ดํŠธ ํ”ฝ์…€์˜ ์ปฌ๋Ÿฌ๊ฐ’์„ ์ด์šฉํ•ด ๋ฐฐ๊ฒฝ์„ ๋ฐ๊ฒŒ ํ•จ: a0 * rgb0 + rgb1

Multiply

ํ•ด๋‹น ์Šคํ”„๋ผ์ดํŠธ ํ”ฝ์…€์˜ ์ปฌ๋Ÿฌ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ๋ฐฐ๊ฒฝ์„ ์–ด๋‘ก๊ฒŒ ํ•จ: rgb0 * rgb1

Sprite Shading

๊ธฐ๋ณธ ์Šคํ”„๋ผ์ดํŠธ ์‰์ด๋”ฉ ํŒŒ์ผ์€ ํ”„๋กœ์ ํŠธ์˜ "/builtins/material/sprite.*" ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์‰์ด๋”ฉ์€ ํ‘œ์ค€ ํ…์Šค์ณ ์ƒ‰์ƒ ๋ณด์ •(regular texture lookup)์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ํ…์Šค์ณ ์ƒ‰์ƒ๊ณผ ๊ฒน์ณ์ง€๋Š”(multiply) ์ƒ‰์กฐ(tint: fragment shader constant) ๋˜ํ•œ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํด๋ฆญ์‹œ ์Šคํ”„๋ผ์ดํŠธ๋ฅผ ํ•˜์–—๊ฒŒ ๋ฒˆ์ฉ์ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•ด ์ปค์Šคํ…€ ์‰์ด๋”ฉ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ผ์ดํŠธ์— ์ปค์Šคํ…€ ์‰์ด๋”ฉ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ผํ•ด ๋ด…์‹œ๋‹ค:

  1. "/builtins/material/sprite.*" ์˜ ํŒŒ์ผ๋“ค์„ ๋‹น์‹ ์˜ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ์ค‘ ํ•˜๋‚˜("built-in" ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ปจํ…์ธ ๋Š” ์ˆ˜์ • ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.)์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ •ํ•ด์ง„ ๋ฐฉ์‹์€ ์•„๋‹ˆ์ง€๋งŒ ์ž‘์—…์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. ๋ณต์‚ฌํ•œ "sprite.material" ํŒŒ์ผ์„ ์—ด์–ด, ์œ„์—์„œ ๋ณต์‚ฌํ•œ ์‰์ด๋” ํŒŒ์ผ(.vp์™€ .fp ํŒŒ์ผ)์˜ ๊ฒฝ๋กœ๋กœ ๋‹ค์‹œ ๋งคํ•‘(remap)ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ณต์‚ฌํ•œ ์‰์ด๋” ํŒŒ์ผ(.vp์™€ .fp ํŒŒ์ผ)์„ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์‰์ด๋” ์ƒ์ˆ˜(shader constants)๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ๋ฉ”ํ„ฐ๋ฆฌ์–ผ(material) ํŒŒ์ผ์— ์„ ์–ธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  4. ์Šคํ”„๋ผ์ดํŠธ๋ฅผ ์—ด์–ด์„œ ์†์„ฑ์ฐฝ(Properties)์—์„œ ์ƒˆ ๋ฉ”ํ„ฐ๋ฆฌ์–ผ๋กœ ์ง€์ •ํ•ด์ค๋‹ˆ๋‹ค.
  5. ๊ฒŒ์ž„ ์‹คํ–‰ ์ค‘์— ์‰์ด๋” ์ƒ์ˆ˜(shader constants)๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด, sprite.set_constant() ํ•จ์ˆ˜์™€ sprite.reset_contant() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Tile Maps

ํƒ€์ผ๋งต์€ ํฐ ๊ฒฉ์ž(grid) ๊ณต๊ฐ„์œผ๋กœ ํƒ€์ผ ์†Œ์Šค์˜ ํƒ€์ผ์„ ์กฐ๋ฆฝํ•˜๊ฑฐ๋‚˜ ํŽ˜์ธํŒ… ํ•˜๊ฒŒ ํ•ด ์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. ํƒ€์ผ๋งต์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ ˆ๋ฒจ ํ™˜๊ฒฝ์„ ๋งŒ๋“œ๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ถฉ๋Œ์„ ๊ฐ์ง€ํ•˜๊ณ  ๋ฌผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์œ„ํ•ด ๋งต์˜ ํƒ€์ผ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ์ถฉ๋Œ ๋ชจํ˜•(Collision Shapes)์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Painting Tiles

  1. ์ž‘์—…ํ•˜๊ธธ ์›ํ•˜๋Š” ํƒ€์ผ๋งต์„ ์—ฝ๋‹ˆ๋‹ค.
  2. Property ๋˜๋Š” Outline ์ฐฝ์— ํ”Œ๋ž˜๊ทธ ์ด์Šˆ(flagged issues)๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  3. Outline ์ฐฝ์—์„œ ํŽ˜์ธํŒ…ํ•˜๋ ค๋Š” ๋ ˆ์ด์–ด๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ธŒ๋Ÿฌ์‹œ๋กœ ์‚ฌ์šฉํ•  ํƒ€์ผ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. (ํƒ€์ผ ํŒ”๋ ˆํŠธ๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด์„œ Space ํ‚ค๋ฅผ ๋ˆŒ๋Ÿฌ ๋ณด์„ธ์š”.)

Painting tiles

Picking Tiles

ํƒ€์ผ๋งต์—์„œ ํƒ€์ผ์„ ์ง์ ‘ ์„ ํƒํ•ด์„œ ๋ธŒ๋Ÿฌ์‹œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Shift๋ฅผ ๋ˆ„๋ฅธ ์ฑ„๋กœ ํƒ€์ผ์„ ํด๋ฆญํ•˜๋ฉด ๋ธŒ๋Ÿฌ์‹œ๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. Shift๋ฅผ ๋ˆ„๋ฅธ ์ฑ„๋กœ ํด๋ฆญ๊ณผ ๋“œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด ํƒ€์ผ์˜ ๊ตฌ์—ญ์„ ์„ ํƒํ•˜๋ฉด ๋” ํฐ ๋ธŒ๋Ÿฌ์‹œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Picking tiles

Erasing Tiles

์ง€์šฐ๊ฐœ ํˆด์€ ํŽ˜์ธํŒ…ํ•œ ํƒ€์ผ์„ ์ง€์šฐ๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ง€์šฐ๊ฐœ๋ฅผ ์„ ํƒํ•˜๋ ค๋ฉด ์•„๋ž˜ ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ํƒ€์ผ๋งต ๋ฉ”๋‰ด์—์„œ ์„ ํƒํ•˜๊ธฐ
  2. Backspaceํ‚ค ๋ˆ„๋ฅด๊ธฐ
  3. ํƒ€์ผ ํŒ”๋ ˆํŠธ์—์„œ ์„ ํƒ๋œ ํƒ€์ผ์„ ๋‹ค์‹œ ํด๋ฆญํ•˜๊ธฐ
  4. ํƒ€์ผ๋งต์—์„œ ์•„๋ฌด ๋นˆ ์…€์ด๋‚˜ ์„ ํƒํ•˜๊ธฐ

Attaching Physics

ํƒ€์ผ๋งต์— ๋ฌผ๋ฆฌ ๊ธฐ๋Šฅ์„ ์ฒจ๋ถ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํƒ€์ผ๊ณผ ๊ด€๋ จ๋œ ์ถฉ๋Œ์„ ๊ฐ์ง€ํ•˜๊ฑฐ๋‚˜ ๋ฌผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ผ๋งต์— ๋ฌผ๋ฆฌ ๊ธฐ๋Šฅ์„ ๋ถ™์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” Physics ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ  ๋ฐ”๋ž๋‹ˆ๋‹ค.

Changing tiles from script

๊ฒŒ์ž„์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋™์ ์œผ๋กœ ํƒ€์ผ๋งต์˜ ์ปจํ…์ธ ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์œ„ํ•ด์„œ๋Š” ํƒ€์ผ๋งต์— set_tile ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

-- ๋‘๊ฐœ์˜ ํƒ€์ผ๋กœ ๋œ ๋ฌธ์ง์„ "์—ด๋ฆฐ ๋ฌธ์ง" ํƒ€์ผ๋กœ ๋ฐ”๊พธ๋Š” ์ฝ”๋“œ
-- ๋ฌธ์ง์ด ๋‘ ๊ฐœ์˜ ํƒ€์ผ์ด๋ฏ€๋กœ ๋‘ ๋ฒˆ ํ˜ธ์ถœ ํ•„์š”
local doorpos = vmath.vector3(174, 305, 0)
msg.post("/level#tilemap", "set_tile", { layer_id = hash("layer1"), position = doorpos, tile = 58 })
-- ๋ฌธ์ง์˜ ์œ—๋ถ€๋ถ„ ํƒ€์ผ์˜ ์œ„์น˜๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ "dy"๋ฅผ 1๋กœ ์„ค์ •ํ•ด์„œ ๋ฌธ์ง ์•„๋žซ๋ถ€๋ถ„ ์ˆ˜์ •
msg.post("/level#tilemap", "set_tile", { layer_id = hash("layer1"), position = doorpos, tile = 46, dy = 1 })

Adding a Tile Map to your game

๊ฒŒ์ž„์— ํƒ€์ผ ๋งต์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด:

  1. ํƒ€์ผ๋งต ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋Š” ํŒŒ์ผ๋กœ ๋˜์–ด ์žˆ๋˜์ง€ ์ปฌ๋ ‰์…˜์—์„œ ์ง์ ‘ ์ƒ์„ฑ๋˜์—ˆ๋˜์ง€๋Š” ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค.
  2. ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์— ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ํด๋ฆญ ํ›„ Add component from file ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. ํƒ€์ผ๋งต ํŒŒ์ผ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ํƒ€์ผ๋งต์„ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด์ œ ์›ํ•˜๋Š” ์œ„์น˜์— ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฐฐ์น˜ํ•˜๊ฑฐ๋‚˜ ์Šคํฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Placed tile map

Texture Filtering and Sampling

Defold๋Š” ํ…์Šค์ณ ์ƒ˜ํ”Œ๋ง์„ ์œ„ํ•ด ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์„ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹๋“ค์€ texel(ํ…์Šค์ณ์˜ ํ”ฝ์…€)์ด ์™„๋ฒฝํ•˜๊ฒŒ ํ™”๋ฉด์˜ ํ”ฝ์…€์— ์ •๋ ฌ๋˜์–ด ๋“ค์–ด๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ์‹œ๊ฐ์  ๊ฒฐ๊ณผ(visual result)๋ฅผ ์ œ์–ดํ•˜๋Š”๋ฐ, ์ด ๋ฌธ์ œ๋Š” ์‹ฌ๋ฆฌ์Šค(seamlessly: ์ด์Œ์ƒˆ๊ฐ€ ์—†๋Š”)ํ•œ ํ…์Šค์ณ๋ฅผ ํฌํ•จํ•˜๋Š” ์Šคํ”„๋ผ์ดํŠธ๋ฅผ ์›€์ง์ผ ๊ฒฝ์šฐ(์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฉํ–ฅ ์ƒ๊ด€์—†์ด 0.2ํ”ฝ์…€์„ ์›€์ง์—ฌ ๋ณด๋ฉด...) ์ด๊ฑฐ๋‚˜ ์นด๋ฉ”๋ผ๋ฅผ ์‹ฌ๋ฆฌ์Šคํ•˜๊ฒŒ ์›€์ง์ด๊ฑฐ๋‚˜ ์คŒ ์ธ/์•„์›ƒ ํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค:

Nearest

์ด ๋ฐฉ์‹์€ ๊ฐ€์žฅ ๊ทผ์ ‘ํ•œ ํ…์…€(nearest texel)์„ ์„ ํƒํ•ด ํ™”๋ฉด์˜ ํ”ฝ์…€์„ ์ฑ„์›๋‹ˆ๋‹ค. ์ด ์ƒ˜ํ”Œ๋ง ๋ฐฉ๋ฒ•์€ ํ…์Šค์ณ์—์„œ ํ™”๋ฉด์— ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ์ผ๋Œ€์ผ ๋งคํ•‘์„ ์›ํ•  ๊ฒฝ์šฐ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ๊ทผ์ ‘ ํ•„ํ„ฐ๋ง(nearest filtering)์„ ์‚ฌ์šฉํ•˜๋ฉด ์›€์ง์ผ ๋•Œ ํ”ฝ์…€์—์„œ ํ”ฝ์…€๋กœ ๋ชจ๋“  ๊ฒƒ์ด ์Šค๋ƒ…(snap)๋˜๋ฉฐ ์Šคํ”„๋ผ์ดํŠธ๊ฐ€ ์ฒœ์ฒœํžˆ ์›€์ง์ด๋Š” ๊ฒฝ์šฐ ๊นœ๋นก์ด๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Linear

ํ™”๋ฉด ํ”ฝ์…€์— ์ปฌ๋Ÿฌ๋ฅผ ์ž…ํžˆ๊ธฐ ์ „์— ํ…์…€์€ ์ด์›ƒํ•œ ์ปฌ๋Ÿฌ๋“ค์˜ ํ‰๊ท ์น˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ์Šคํ”„๋ผ์ดํŠธ๊ฐ€ ํ™”๋ฉด์— ์™„์ „ํ•˜๊ฒŒ ์ฑ„์ƒ‰๋˜๊ธฐ ์ด์ „์— ํ”ฝ์…€๋กœ ๋ธ”๋ฆฌ๋“œ(bleed) ๋˜๋ฏ€๋กœ ์ง€์†์ ์œผ๋กœ ๋А๋ฆฌ๊ฒŒ ์›€์ง์ด๊ฑฐ๋‚˜, ๋ถ€๋“œ๋Ÿฝ๊ฒŒ(smooth) ๋งŒ๋“œ๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ์ „์ฒด ํ”ฝ์…€๋ณด๋‹ค ์ž‘์€ ์Šคํ”„๋ผ์ดํŠธ๋ฅผ ์›€์ง์ด๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด ํ•„ํ„ฐ๋ง ์„ค์ •๊ฐ’์€ Project Settings ํŒŒ์ผ์— ์ €์žฅ๋˜๋ฉฐ, ์—ฌ๊ธฐ ๋‘ ๊ฐ€์ง€ ์„ค์ •๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค:

default_texture_min_filter

์ถ•์†Œ ํ•„ํ„ฐ๋ง(Minifying filtering)์€ ํ…์…€์ด ํ™”๋ฉด ํ”ฝ์…€๋ณด๋‹ค ์ž‘์„ ๋•Œ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

default_texture_mag_filter

ํ™•๋Œ€ ํ•„ํ„ฐ๋ง(Magnifying filtering)์€ ํ…์…€์ด ํ™”๋ฉด ํ”ฝ์…€๋ณด๋‹ค ํด ๋•Œ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‘ ์„ค์ •๊ฐ’ ๋ชจ๋‘ linear๋‚˜ nearest ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

[graphics]
default_texture_min_filter = nearest
default_texture_mag_filter = nearest

์•„๋ฌด๊ฒƒ๋„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด, ๋‘ ๊ฐ’ ๋ชจ๋‘ linear ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

(๊ทธ๋ž˜ํ”ฝ ์—์…‹ ์ผ๋ถ€๋Š” Kenney: http://kenney.nl/assets ์— ์˜ํ•ด ์ œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.)