Layouts - kuimoani/defold GitHub Wiki

Layouts

Defold๋Š” ๋ชจ๋ฐ”์ผ ์žฅ์น˜์—์„œ ํ™”๋ฉด ๋ฐฉํ–ฅ ์ „ํ™˜(screen orientation changes)์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์กฐ์ •ํ•˜๋Š” GUI ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ™”๋ฉด์˜ ๋ฐฉํ–ฅ(orientation)๊ณผ ์ข…ํšก๋น„(aspect ratio)์— ๋งž๊ฒŒ GUI๋ฅผ ๋””์ž์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ์ด ๊ธฐ๋Šฅ์ด ๋™์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

GUI์˜ ๋™์  ๋ ˆ์ด์•„์›ƒ์€ ๋””์Šคํ”Œ๋ ˆ์ด ํ”„๋กœํŒŒ์ผ์„ ํ˜„์žฌ ๊ฒŒ์ž„์ด ์‹คํ–‰์ค‘์ธ ๋””์Šคํ”Œ๋ ˆ์ด์˜ ๋„“์ด์™€ ๋†’์ด์— ๋งค์นญ์‹œ์ผœ์„œ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Display profiles

๊ฐ ํ”„๋กœ์ ํŠธ๋Š” "builtins/render/default.display_profiles"์— ๋‘ ๊ฐœ์˜ ํ”„๋กœํŒŒ์ผ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Default display profiles

Landscape

ํญ 1280 ํ”ฝ์…€, ๋†’์ด 720 ํ”ฝ์…€

Portrait

ํญ 720 ํ”ฝ์…€, ๋†’์ด 1280 ํ”ฝ์…€

16:9์˜ ์ข…ํšก๋น„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์žฅ์น˜์—์„œ๋Š” ์ด๋“ค ํ”„๋กœํŒŒ์ผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ํ™”๋ฉด์˜ ์‹ค์ œ ๋ฌผ๋ฆฌ ํฌ๊ธฐ๊ฐ€ ๋” ํฌ๊ฑฐ๋‚˜ ์ž‘๋”๋ผ๋„, ์—”์ง„์ด ๋น„์Šทํ•œ ํ”„๋กœํŒŒ์ผ๋กœ ์ž๋™์œผ๋กœ ์„ ํƒํ•ด ์ค๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ธฐ๋ณธ ํ”„๋กœํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ๋‚ด์žฅ๋œ ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ๋กœ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ ์ƒ์„ฑํ•ด์„œ "project.settings"์—์„œ ์—”์ง„์ด ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ํ”„๋กœํŒŒ์ผ ํŒŒ์ผ์„ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Project settings

๋˜ํ•œ dynamic_orientation ๋ฅผ ์ฒดํฌํ•ด์„œ ์žฅ์น˜์˜ ๋ฐฉํ–ฅ์ด ๋ฐ”๋€” ๊ฒฝ์šฐ ์—”์ง„์ด ๋ ˆ์ด์•„์›ƒ์„ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ iOS์šฉ ๊ฐœ๋ฐœ ์•ฑ์€ dynamic_orientation ์„ค์ •์„ ๋”ฐ๋ฅด์ง€ ์•Š๊ณ , ๋ฐฉํ–ฅ์„ ๋™์ ์œผ๋กœ ํ•ญ์ƒ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

GUI layouts

์ •์˜๋œ ๋””์Šคํ”Œ๋ ˆ์ด ํ”„๋กœํŒŒ์ผ์€ GUI ์—๋””ํ„ฐ์—์„œ ๋ ˆ์ด์•„์›ƒ์„ ๋งŒ๋“œ๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์—๋””ํ„ฐ์ƒ์—์„œ ์ž‘์—…์‹œ, ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฉด Default ๋ ˆ์ด์•„์›ƒ์ด ๊ธฐ๋ณธ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ ˆ์ด์•„์›ƒ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด Outline ์ฐฝ์—์„œ Layouts ํด๋”๋ฅผ ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ ํด๋ฆญ ํ›„ Layout ๋ฉ”๋‰ด๋ฅผ ์„ ํƒํ•˜์„ธ์š”.

Add layout to scene

Default ๋ ˆ์ด์•„์›ƒ์€ GUI ์”ฌ์— ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ "Landscape" ๋ ˆ์ด์•„์›ƒ์„ ์ถ”๊ฐ€ํ•˜๊ณ  "Portrait" ๋ ˆ์ด์•„์›ƒ๋„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ชจ๋“  ๋ฐฉํ–ฅ์— ์ž˜ ๋งž๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

GUI ์”ฌ์„ ํŽธ์ง‘์ค‘์ผ ๋•Œ, ๋ชจ๋“  ๋…ธ๋“œ๋“ค์€ ํŠน์ •ํ•œ ๋ ˆ์ด์•„์›ƒ์—์„œ ํŽธ์ง‘๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์„ ํƒ๋œ ๋ ˆ์ด์•„์›ƒ์€ Outline ์ฐฝ์— ๋‚˜ํƒ€๋‚˜๋ฉฐ bold ๊ธ€์”จ์ฒด๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Editing default layer

๋˜ํ•œ ๋…ธ๋“œ๊ฐ€ ํ˜„์žฌ ์„ ํƒ๋œ ๋ ˆ์ด์–ด(Default ๋ง๊ณ  ๋‹ค๋ฅธ ๋ ˆ์ด์–ด)์—์„œ ์˜ค๋ฒ„๋ผ์ด๋“œ ๋œ๊ฑด์ง€ ์•„๋‹Œ์ง€์— ๋”ฐ๋ผ ์‹œ๊ฐ์  ํ”ผ๋“œ๋ฐฑ์„ ์–ป์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ๋œ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ๋…ธ๋“œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด Default ๋ ˆ์ด์–ด์— ๊ด€๋ จ๋œ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์˜ค๋ฒ„๋ผ์ด๋“œ ๋ฉ๋‹ˆ๋‹ค. ์˜ค๋ฒ„๋ผ์ด๋“œ ๋œ ํ”„๋กœํผํ‹ฐ๋“ค์€ ํŒŒ๋ž€์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋˜๋ฉฐ ํŒŒ๋ž€์ƒ‰ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์„ ํด๋ฆญํ•ด์„œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฆฌ์…‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Editing with layouts

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

Layout change messages

์—”์ง„์ด ์žฅ์น˜์˜ ํšŒ์ „๋ฐฉํ–ฅ์— ๋”ฐ๋ผ ๋ ˆ์ด์•„์›ƒ์„ ์ „ํ™˜ํ•˜๋ฉด, layout_changed ๋ฉ”์„ธ์ง€๋ฅผ GUI ์ปดํฌ๋„ŒํŠธ์˜ ์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณด๋‚ด์ค๋‹ˆ๋‹ค. ์ด ๋ฉ”์„ธ์ง€์—๋Š” ๋ ˆ์ด์•„์›ƒ์˜ ํ•ด์‰ฌ ์•„์ด๋””๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์–ด๋–ค ๋ ˆ์ด์•„์›ƒ์ด ์„ ํƒ๋˜์—ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์•Œ๋งž์€ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function on_message(self, message_id, message, sender)
	if message_id == hash("layout_changed") and message.id == hash("Landscape") then
		-- ๋ ˆ์•„์ด์›ƒ์„ landscape๋กœ ์ „ํ™˜
    ...
	elseif message_id == hash("layout_changed") and message.id == hash("Portrait") then
    -- ๋ ˆ์ด์•„์›ƒ์„ portrait๋กœ ์ „ํ™˜
    ...
	end
end

๋˜ํ•œ ํ˜„์žฌ ๋ Œ๋” ์Šคํฌ๋ฆฝํŠธ๋„ ์œˆ๋„์šฐ ์ฐฝ(๊ฒŒ์ž„ ํ™”๋ฉด)์ด ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ๋ฐฉํ–ฅ์ด ์ „ํ™˜๋  ๊ฒฝ์šฐ ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

function on_message(self, message_id, message)
    if message_id == hash("window_resized") then
      -- ์œˆ๋„์šฐ๊ฐ€ ๋ฆฌ์‚ฌ์ด์ง•๋จ. message.width๊ณผ message.height์— ์ฐฝ์˜ ์ƒˆ ํฌ๊ธฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Œ
    end
end

In game content

๋ฐฉํ–ฅ(orientation)์ด ์ „ํ™˜๋˜๋ฉด, GUI ๋ ˆ์ด์•„์›ƒ ๋งค๋‹ˆ์ €๋Š” ๋…ธ๋“œ ํ”„๋กœํผํ‹ฐ์™€ ๋ ˆ์ด์•„์›ƒ์— ๋งž๊ฒŒ GUI ๋…ธ๋“œ๋“ค์˜ ์Šค์ผ€์ผ๊ณผ ์œ„์น˜๋ฅผ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ๋‚ด ์ปจํ…์ธ ์˜ ๊ฒฝ์šฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ˜„์žฌ ์œˆ๋„์šฐ์— ๋งž๊ฒŒ ๋Š˜๋ ค์„œ(stretch-fit) ๋ทฐ๊ฐ€ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

Orientation rendering

๋‹น์‹ ์˜ ๊ฒŒ์ž„ ๋””์ž์ธ์ด ๊ฒŒ์ž„ ๋ทฐ๊ฐ€ ๋ Œ๋”๋ง ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ํŠน์ • ์ œ์•ฝ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ๋ Œ๋” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๋™์ž‘, ์นด๋ฉ”๋ผ, ๋ทฐํฌํŠธ, ๊ธฐํƒ€ ๊ณ ๋ ค์‚ฌํ•ญ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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