Love2D둜 κ²Œμž„ λ§Œλ“€κΈ° μ‹œλ¦¬μ¦ˆ

이전 κΈ€ : https://gall.dcinside.com/game_dev/156920

이번 κ°•μ˜μ—μ„œλŠ” μ €λ²ˆ κ°•μ˜μ—μ„œ λΆ€μ‘±ν•˜λ‹€κ³  μƒκ°ν–ˆλ˜ 점, ν”Όλ“œλ°±μ„ 받은 점듀을 κ°œμ„ ν•˜μ—¬ λ…μžμ˜ μˆ˜μ€€μ΄ Lua ν”„λ‘œκ·Έλž˜λ°μ— λŒ€ν•œ 일반적인 지식이 λΆ€μ‘±ν•˜λ‹€κ³  κ°€μ •ν•˜κ³  λͺ¨λ°”일 가독성을 λ†’μ΄λŠ”λ° μ£Όλ ₯함. λ¬Όλ‘  κ°•μ˜μ˜ λͺ©μ μ€ μ–΄λ””κΉŒμ§€λ‚˜ Love2D둜 κ°„λ‹¨ν•œ κ²Œμž„ λ§Œλ“œλŠ” 법에 λŒ€ν•œ λ‚΄μš©μ΄λ‹ˆ Lua에 λŒ€ν•œ μ•„μ£Ό 기본적인 λ‚΄μš©μ€ 닀루지 μ•Šμ„ κ²ƒμž„. ν•„μš”ν•˜λ‹€λ©΄ λ”°λ‘œ λ°°μš°κ±°λ‚˜ 좔후에 Lua ν”„λ‘œκ·Έλž˜λ° κ°•μ˜λ₯Ό μ“Έ μˆ˜λ„ μžˆμœΌλ‹ˆ 기닀리기λ₯Ό...

11. μ†ŒμŠ€μ½”λ“œκ°€ λ„ˆλ¬΄ λ³΅μž‘ν•΄! λͺ¨λ“ˆν™”λ₯Ό ν•΄λ³΄μž.
μš°λ¦¬λŠ” main.lua νŒŒμΌμ— λͺ¨λ“  μ •μ˜λ₯Ό λ‹€ λ°€μ–΄λ„£μ—ˆλ‹€. ν•œ νŒŒμΌμ— 베이슀 객체 μ •μ˜, νŒŒμƒ 객체 μ •μ˜, 콜백 ν•¨μˆ˜ μ •μ˜κ°€ λͺ¨λ‘ λ‹€ λ“€μ–΄κ°€κ²Œ λ˜μ—ˆκ³  κ·Έ κ²°κ³Ό μ†ŒμŠ€μ½”λ“œλ₯Ό 읽기가 맀우 νž˜λ“€μ–΄μ‘Œλ‹€. 일반적으둜 ν•œ νŒŒμΌμ— μ½”λ“œλ₯Ό λͺ°μ•„μ“°κ²Œλ˜λ©΄ μ–΄λ–€ λ¬Έμ œκ°€ λ°œμƒν• κΉŒ?

(1). 이름 곡간이 μΆ©λŒν•  수 μžˆλ‹€.
예λ₯Ό λ“€μ–΄, DataλΌλŠ” μ΄λ¦„μœΌλ‘œ 객체λ₯Ό λ‘λ²ˆ μ •μ˜ν•  수 μ—†λ‹€. λ¬Έμ œλŠ” DataλŠ” ν”ν•œ μ΄λ¦„μ΄λΌμ„œ 자주 μ“°μΈλ‹€λŠ” 점이닀.


(2). μ†ŒμŠ€μ½”λ“œ 읽기가 λ„ˆλ¬΄ νž˜λ“€μ–΄μ§„λ‹€.
ν˜„μž¬ μ†ŒμŠ€μ½”λ“œμ˜ λ¬Έλ§₯이 μ½”λ“œμ— ν•„μš”ν•œ 객체λ₯Ό μ •μ˜ν•˜λŠ” 단계라면 κ·Έ κ³³μ—λŠ” κ·Έμ € 객체의 μ΄λ¦„λ§Œ 써두고 μ‹€μ œ μ •μ˜λŠ” κ°œλ³„ 파일둜 뢄리할 μˆ˜λ„ μžˆλ‹€.
ν•˜μ§€λ§Œ λͺ¨λ“ˆν™”κ°€ μ•ˆλœλ‹€λ©΄ μ‹€μ œ μ •μ˜κ°€ ν•˜λ‚˜μ˜ νŒŒμΌμ— μ „λΆ€ μ™€μ•Όν•˜λ―€λ‘œ 맀우 κΈ΄ νŒŒμΌμ„ 읽어야 λ‹€μŒ λ¬Έλ§₯을 읽을 수 μžˆμ„ κ±°λ‹€.


(3). 잘λͺ»λœ λ°©λ²•μœΌλ‘œ ν”„λ‘œκ·Έλž˜λ°μ„ ν•  κ°€λŠ₯성을 λ†’νžŒλ‹€.
1번의 λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 접두어λ₯Ό λΆ™νžŒλ‹€! 이건 Luaμ—μ„œ μ „ν˜€ 쒋은 생각이 μ•„λ‹ˆλ‹€. LuaλŠ” ν…Œμ΄λΈ”λ‘œ 이름 곡간을 λ§Œλ“€ 수 μžˆλ‹€! κ·Έ 외에도 λ§Žμ€ λ¬Έμ œμ μ„ λ§Œλ“ λ‹€.

κ·Έλž˜μ„œ 11μž₯μ—μ„œλŠ” main.luaλ₯Ό 객체 λ‹¨μœ„λ‘œ λ‚˜λˆ„μ–΄ μ—¬λŸ¬ νŒŒμΌμ— λΆ„μ‚°ν•˜λŠ” 법을 μ„€λͺ…ν•œλ‹€.

일반적으둜 Luaμ—μ„œ λͺ¨λ“ˆμ€ λ‹€μŒκ³Ό 같이 κ΅¬μ„±λœλ‹€.

local M = {} -- 객체λ₯Ό 담을 수 μžˆλŠ” ν…Œμ΄λΈ”μ„ 생성.

-- 이곳에 μ†ŒμŠ€μ½”λ“œλ₯Ό μž‘μ„±, ν•¨μˆ˜λ₯Ό function M:name
-- ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•˜λ©΄ name은 ν…Œμ΄λΈ” M의 멀버가 되고
-- λ§€κ°œλ³€μˆ˜ λͺ©λ‘ 제일 μ•žμ— selfκ°€ μžλ™μœΌλ‘œ μΆ”κ°€λœλ‹€.
-- λ§Œμ•½ λͺ¨λ“ˆ μ •μ˜μ™€ μ „ν˜€ 상관없고 λͺ¨λ“ˆ μ•ˆμ—μ„œλ§Œ
-- μ“°μ΄λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜κ³  μ‹Άλ‹€λ©΄ local function을
-- μ‚¬μš©ν•  수 μžˆλ‹€. κ·Έ 외에 M이 λΆ™μ§€ μ•ŠμœΌλ©΄ 멀버가
-- μ•„λ‹ˆλ‹€.
-- μ•„λž˜λŠ” λͺ¨λ“ˆμ„ 객체처럼 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ μƒμ„±μžλ₯Ό
-- μ •μ˜ν–ˆλ‹€.
function M:new (o)
o = o or {}
setmetatable(o, self)
self.__index = self

return o
end

return M -- μ •μ˜ν•œ 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.

λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” require ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€. (μ£Όμ˜ν•  점은, λͺ¨λ“ˆμ˜ 경둜λ₯Ό μ§€μ •ν• λ•ŒλŠ” ν™•μž₯자λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€. '.'은 디렉터리 κ΅¬λΆ„μžλ‘œ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ΄λ‹€.)
local M = require "M"
local N = M:new()

μš°λ¦¬λŠ” main.lua 파일 ν•˜λ‚˜λ₯Ό μͺΌκ°œμ–΄μ„œ GameObject.lua, Bomb.lua 파일둜 뢄리할 μˆ˜λ„ μžˆλ‹€. μ•„λž˜λŠ” λͺ¨λ“ˆ λ°©μ‹μœΌλ‘œ μž‘μ„±λœ GameObject.lua의 μ˜ˆμ‹œλ₯Ό 보인닀.

local GameObject = {
x = 0,
y = 0,
width = 0,
height = 0,
radius = 0,
color = {
red = 1,
green = 1,
blue = 1,
alpha = 1,
},
rotation = 0,
direction = 1,
speed = 300,
}

function GameObject:new (o)
o = o or {}
setmetatable(o, self)
self.__index = self

return o
end

function GameObject:isCollide (that)
local distance = math.sqrt(
(self.x - that.x)^2 + (self.y - that.y)^2)
return distance < self.radius + that.radius
end

function GameObject:update (dt)
local width = love.graphics.getWidth()
local height = love.graphics.getHeight()
-- Implementing wall reflection
if self.x+self.radius > width then
self.direction = self.direction ==
1 and 2 or 3
elseif self.y-self.radius < 0 then
self.direction = self.direction ==
2 and 3 or 4
elseif self.x-self.radius < 0 then
self.direction = self.direction ==
3 and 4 or 1
elseif self.y+self.radius > height then
self.direction = self.direction ==
4 and 1 or 2
end

local move = math.sin(math.pi/4)
if self.direction == 1 then
self.x = self.x + self.ref.speed *
move * dt
self.y = self.y - self.ref.speed *
move * dt
elseif self.direction == 2 then
self.x = self.x - self.ref.speed *
move * dt
self.y = self.y - self.ref.speed *
move * dt
elseif self.direction == 3 then
self.x = self.x - self.ref.speed *
move * dt
self.y = self.y + self.ref.speed *
move * dt
elseif self.direction == 4 then
self.x = self.x + self.ref.speed *
move * dt
self.y = self.y + self.ref.speed *
move * dt
end
end

function GameObject:isClicked () end

function GameObject:onClick () end

function GameObject:draw ()
love.graphics.setLineStyle("rough")
love.graphics.setColor(
self.color.red,
self.color.green,
self.color.blue,
self.color.alpha
)
love.graphics.circle(
"line",
self.x-self.radius,
self.y-self.radius,
self.radius
)
end

return GameObject



12. κ²Œμž„μ˜ 점수 κ·œμΉ™κ³Ό 패배 쑰건을 κ΅¬ν˜„ν•˜μž.
"였래 μ‚΄μ•„λ‚¨μ„μˆ˜λ‘ μ μˆ˜κ°€ λ†’κ³ , 폭탄과 λΆ€λ”ͺνžˆκ±°λ‚˜ κ²Œμž„ ν™”λ©΄ λ°–μœΌλ‘œ λ‚˜κ°€λ©΄ νŒ¨λ°°ν•˜λ©° 점수λ₯Ό ν‘œμ‹œν•œλ‹€."

μ–΄μ œ 5개의 κ²Œμž„ κ·œμΉ™μ„ μ„€λͺ…ν•œ λ°” μžˆλ‹€. 이번 κ°•μ˜μ—μ„œλŠ” 3번째 κ·œμΉ™μ„ κ΅¬ν˜„ν•  κ±°λ‹€.

1단계: 마우슀의 μ›€μ§μž„μ„ κ°μ§€ν•˜μž.

Love2DλŠ” love.mousemovedλΌλŠ” μ½œλ°±μ„ μ§€μ›ν•œλ‹€. 이 ν•¨μˆ˜λ₯Ό λ‹€μŒκ³Ό 같이 μž‘μ„±ν•˜μž.

function love.mousemoved (x, y, _, _)
cursor.x = x
cursor.y = y
end

μ΄λŠ” λ§ˆμš°μŠ€κ°€ 맀번 μ›€μ§μΌλ•Œλ§ˆλ‹€ cursor 객체의 x 및 y값을 κ°±μ‹ ν•΄μ£ΌλŠ” 역할을 ν•œλ‹€. 이 값은 0λΆ€ν„° μ΅œλŒ€ ν™”λ©΄ 크기에 1을 λΊ€ κ°’ μ‚¬μ΄λ‘œ μ •ν•΄μ§„λ‹€.


그리고 cursor 객체의 μ •μ˜κ°€ μ•ˆλ˜μ—ˆμœΌλ‹ˆ main.lua 상단에 λ‹€μŒ μ½”λ“œλ₯Ό μΆ”κ°€ν•œλ‹€.

cursor = {
x = 0,
y = 0,
radius = 0,
}

radiusλŠ” λ‚˜μ€‘μ— 좩돌 κ°μ§€μ—μ„œ μ‚¬μš©λ  것이닀. isCollideλŠ” GameObjectλ₯Ό 비ꡐ λŒ€μƒμœΌλ‘œ κ°–λŠ”λ° μ΄λ•Œ λ§ˆμš°μŠ€λŠ” GameObjectκ°€ μ•„λ‹ˆμ§€ μ•Šλƒκ³  물을 μˆ˜λ„ μžˆλ‹€.


ν•˜μ§€λ§Œ λ§ˆμš°μŠ€κ°€ μœ„μΉ˜ν•œ 점은 사싀 λ°˜μ§€λ¦„μ΄ 0인 μ›μœΌλ‘œ 생각할 수 있고 λ§ˆμš°μŠ€κ°€ 움직일 λ•Œλ§ˆλ‹€ 이 원이 λ”°λΌμ„œ 움직인닀고 μƒκ°ν•˜λ©΄ λœλ‹€. λ§ˆμš°μŠ€μ™€ μ›μ˜ μΆ©λŒμ„ κ°μ§€ν•˜λŠ” ν•¨μˆ˜λ₯Ό μƒˆλ‘œ λ§Œλ“œλŠ” κ²ƒλ³΄λ‹€λŠ” μž¬ν™œμš©μ΄ λ‚«λ‹€.


2단계: 폭탄이 λ§ˆμš°μŠ€μ™€ μΆ©λŒν•˜λŠ”μ§€ κ²€μ‚¬ν•œλ‹€.

이건 정말 쉽닀. κ·Έμ € main.lua νŒŒμΌμ— μžˆλŠ” update μ½œλ°±μ„ λ‹€μŒκ³Ό 같이 λ³€κ²½ν•΄μ£Όμž.

function love.update (dt)
if not isGameovered then
for _, v in ipairs(bombs) do
if v:isCollide(cursor) then
isGameovered = true
return
end
v:update(dt)
end

local width = love.graphics.getWidth()-1
local height = love.graphics.getHeight()-1
if cursor.x == 0 or cursor.x == width or
cursor.y == 0 or cursor.y == height then
isGameovered = true
return
end
end
end

폭탄과 접촉을 κ°μ§€ν•˜λŠ” 뢀뢄은 isCollide ν•¨μˆ˜λ‘œ μΆ©λŒμ„ κ²€μ‚¬ν•˜κ³  좩돌이 ν™•μΈλ˜λ©΄ isGameoveredλ₯Ό true둜 μ„€μ •ν•΄μ„œ κ²Œμž„ 패배둜 λ§Œλ“œλŠ” κ°„λ‹¨ν•œ ꡬ쑰이닀.


λ§ˆμš°μŠ€κ°€ 화면을 λ²—μ–΄λ‚˜λŠ” 것을 κ°μ§€ν•˜λŠ” 뢀뢄은 마우슀 μœ„μΉ˜κ°€ 0 λ˜λŠ” ν™”λ©΄ 경계와 μΌμΉ˜ν•˜λŠ”μ§€λ₯Ό κ²€μ‚¬ν•œλ‹€. μ•„κΉŒ 마우슀 μ»€μ„œ μœ„μΉ˜μ˜ λ²”μœ„κ°€ 0λΆ€ν„° μ‹œμž‘ν•œλ‹€κ³  ν–ˆκΈ° λ•Œλ¬Έμ— getWidth와 getHeight둜 μ–»μ–΄λ‚Έ ν™”λ©΄ ν¬κΈ°μ—μ„œ 1을 λΉΌμ€€λ‹€.


3단계: κ²Œμž„ 패배 화면을 μ„€μ •ν•˜μž.

draw μ½œλ°±μ„ λ‹€μŒκ³Ό 같이 λ°”κΎΈμž.

function love.draw ()
local width = love.graphics.getWidth()
local height = love.graphics.getHeight()

if not isGameovered then
for _, v in ipairs(bombs) do
v:draw()
end
else
love.graphics.setColor(1, 1, 1)
love.graphics.print(
"Game Over",
width/2,
height/2
)
end
end

κ²Œμž„ μ˜€λ²„κ°€ μ•„λ‹ˆλΌλ©΄ 폭탄을 ν‘œμ‹œν•˜κ³ , κ²Œμž„ μ˜€λ²„ μƒνƒœλ©΄ κ²Œμž„ μ˜€λ²„ λ©”μ‹œμ§€λ₯Ό ν™”λ©΄ 쀑앙에 ν‘œμ‹œν•œλ‹€.

13. 점수 μ‹œμŠ€ν…œμ„ κ΅¬ν˜„ν•˜μž.

이제 ν™”λ©΄λ³΄ν˜ΈκΈ° μˆ˜μ€€μ€ λ²—μ–΄λ‚œ 것 κ°™λ‹€. ν•˜μ§€λ§Œ ν•΄κ²°ν•΄μ•Όν•  λ¬Έμ œκ°€ ν•˜λ‚˜ 더 λ‚¨μ•˜λ‹€. 아무리 μ˜€λž«λ™μ•ˆ 폭탄을 ν”Όν•΄ 살아남아도 μ μˆ˜κ°€ μ—†μœΌλ‹ˆ κ²Œμž„μ„ ν•˜λŠ” μ˜λ―Έκ°€ μ—†λ‹€.


κ·Έλž˜μ„œ μ΄λ²ˆμ—λŠ” 점수 μ‹œμŠ€ν…œμ„ κ΅¬ν˜„ν•˜κ³  생쑴 μ‹œκ°„μ— 따라 점수λ₯Ό λΆ€μ—¬ν•˜μž.


λ¨Όμ €, gameScore λ³€μˆ˜λ₯Ό μ •μ˜ν•΄μ€€λ‹€.

local gameScore = 0


우리 κ²Œμž„μ€ 살아남은 μ‹œκ°„μ— λΉ„λ‘€ν•˜μ—¬ μ μˆ˜κ°€ κ²°μ •λ˜λŠ” μ‹œμŠ€ν…œμ„ μ±„νƒν•˜μ˜€λ‹€. κ°„λ‹¨ν•˜κ²Œ 1μ΄ˆμ— 타이머가 60번 μ¦κ°€ν•˜κ³  1번 μ¦κ°€ν• λ•Œλ₯Ό 1점으둜 μ‚Όμž. κ²Œμž„μ˜ μ‹œκ°„μ„ μΈ‘μ •ν•˜λŠ” λ³€μˆ˜λ₯Ό μ •μ˜ν•΄μ€€λ‹€.

local gameTimer = 0


이제 update μ½œλ°±μ— gameTimer의 값을 1μ”© μ¦κ°€μ‹œν‚€λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ λœλ‹€.

gameTimer = gameTimer + 1


참고둜 LuaλŠ” 볡합 λŒ€μž… μ—°μ‚°μžλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. 1을 λ”ν•˜λ €λ©΄ gameTimer += 1κ³Ό 같이 ν•  수 μ—†λ‹€.


λ§ˆμ§€λ§‰μœΌλ‘œ κ²Œμž„ μ˜€λ²„μ‹œ 점수λ₯Ό ν‘œμ‹œν•  수 μžˆλ„λ‘ draw μ½œλ°±μ„ μˆ˜μ •ν•˜μž.

function love.draw ()
local width = love.graphics.getWidth()
local height = love.graphics.getHeight()
gameScore = gameTimer

if not isGameovered then
for _, v in ipairs(bombs) do
v:draw()
end
else
love.graphics.setColor(1, 1, 1)
love.graphics.print(
"Game Over",
width/2,
height/2
)
love.graphics.print(
"Score: " .. tostring(gameScore),
width/2,
height/2+10
)
end
end


14. 버그λ₯Ό μˆ˜μ •ν•˜μž.

우리 κ²Œμž„μ€ 별 이상이 μ—†λŠ” κ²ƒμ²˜λŸΌ 보인닀. κ·ΈλŸ¬λ‚˜ κ²Œμž„μ„ μ‹œμž‘ν•˜κ³  λ‚˜μ„œ μ€€λΉ„ν•  μ‹œκ°„μ„ μ£Όμ§€ μ•ŠλŠ”λ‹€λŠ” 것이 λ¬Έμ œλ‹€. λ²„κ·ΈλŠ” κ²Œμž„μ˜ 둜직이 μ˜€μž‘λ™ν•΄μ„œλ„ μΌμ–΄λ‚˜μ§€λ§Œ 가끔은 λ‚˜μœ μ‚¬μš©μž κ²½ν—˜μ΄ λ²„κ·Έμ²˜λŸΌ λ³΄μ΄λŠ” κ²½μš°κ°€ μžˆλ‹€. ν•˜μ§€λ§Œ 그건 버그가 λ§žλ‹€. μ™œλƒν•˜λ©΄ μ €λ²ˆ νŽΈμ—μ„œ 이미 μ€€λΉ„ μ‹œκ°„μ„ 5초 μ€€λ‹€κ³  μ„€λͺ…ν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€.


μ€€λΉ„ μ‹œκ°„λ™μ•ˆμ—λŠ” 폭탄에 λ‹Ώκ±°λ‚˜ ν™”λ©΄ 밖을 λ²—μ–΄λ‚˜λ„ κ²Œμž„ μ˜€λ²„κ°€ 되면 μ•ˆλœλ‹€. 단, μ€€λΉ„ μ‹œκ°„μ€ κ²Œμž„ 점수둜 μΈμ •ν•˜μ§€ μ•Šκ±°λ‚˜ λ¬΄μ˜λ―Έν•΄μ•Ό ν•œλ‹€. μ΄λŠ” λͺ¨λ“  κ²Œμž„ μ˜€λ²„μ™€ κ΄€λ ¨λœ λ‘œμ§μ— λ‹€μŒ 쑰건문을 λ„£λŠ” κ²ƒμœΌλ‘œ ν•΄κ²° κ°€λŠ₯ν•˜λ‹€.

if gameTimer-300 > 0 then
isGameovered = true
return
end

이 쑰건문은 κ²Œμž„ 타이머가 0μ—μ„œ 300인 κ΅¬κ°„κΉŒμ§€λŠ” μ ˆλŒ€λ‘œ μ„±λ¦½ν•˜μ§€ μ•ŠλŠ”λ‹€. 300ν”„λ ˆμž„μ΄λ©΄ 5μ΄ˆμ΄λ‹€. 그럼 이제 5초의 μ€€λΉ„ μ‹œκ°„μ΄ μ£Όμ–΄μ§„ κ±°λ‹€.


λ²„κ·ΈλŠ” μ•Œκ³  보면 μ•„μ£Ό μž‘μ€ μ›μΈμœΌλ‘œ μΌμ–΄λ‚˜λŠ” κ²½μš°κ°€ μžˆλ‹€. μ‹€μ œλ‘œ LuaλŠ” λΉ λ₯Έ 개발 속도가 μž₯점인 μ–Έμ–΄μ΄μ§€λ§Œ κ·Έ 많큼 덕-νƒ€μ΄ν•‘μœΌλ‘œ 인해 λ§Žμ€ 버그λ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆλ‹€. λ¬Όλ‘  이번 κ²½μš°λŠ” 덕-타이핑이 μ•„λ‹ˆκ³  μ½”λ“œλ₯Ό μ§  λ†ˆμ˜ 머리가 덕-μˆ˜μ€€μ΄λΌ κ·ΈλŸ°κ±°λ‹ˆ Luaλ₯Ό νƒ“ν•˜μ§€ 말자.




κ°•μ˜λ₯Ό λ‘λ²ˆμ§Έλ‘œ μ¨λ³΄λŠ”λ° λ””μ‹œ 에디터가 μ›Œλ‚™ κ΅¬λ €μ„œ νŽΈμ§‘ν•˜κΈ° νž˜λ“¬. ν•„λ ₯도 쒋은 편이 μ•„λ‹ˆλΌμ„œ 어렀움. ν•œ 글에 λͺ°μ•„μ“°λŠ” μ΄μœ κ°€ 이거 빨리 끝내고 μ‹Άμ–΄μ„œ 그런데 κ·Έλƒ₯ μ’€ 길게 써도 λ˜λ‹ˆκΉŒ μžμ„Έν•˜κ²Œ μ“ΈκΉŒ 생각 μ€‘μž„ 근데 λ‚˜λ³΄λ‹€ Luaλž‘ Love2Dλ₯Ό 잘 κ°€λ₯΄μΉ˜λŠ” μ–‘λ°˜λ“€μ΄ μ°¨κ³  λ„˜μ³μ„œ μ–΄λ €μšΈμˆ˜λ„ (λ¬Όλ‘  죄닀 μ˜μ–΄μž„)

https://drive.google.com/drive/folders/1jJYUduwm6jUcpqsjRKhm1Xmuf4nywrRz?usp=sharing

μ†ŒμŠ€μ½”λ“œλŠ” λ“œλΌμ΄λΈŒμ— 올림.


μ•„ λ‹€ μ“°κ³ λ‚˜λ‹ˆκΉŒ κΈ€μž 수 μ œν•œ κ±Έλ Έλ‹€ κ·Έλž˜μ„œ 일뢀 λ‚΄μš© νƒ€λ…ΈμŠ€λ¨ 주의