0Pricing
Lua Academy · 강의

이동과 충돌

플레이 가능한 장면을 만들어 보세요.

이동과 충돌은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Lua Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

위치와 속도

LÖVE에서 이동은 시간에 따라 객체의 위치를 바꾸는 것을 의미합니다. x와 y를 저장한 다음, love.update에서 dt를 곱한 속도를 더하십시오.

속도를 초당 dx와 dy로 유지하면 대각선 이동과 물리 처리를 깔끔하게 구현할 수 있으며 프레임 속도의 영향을 받지 않습니다.

function love.update(dt)
  player.x = player.x + player.dx * dt
  player.y = player.y + player.dy * dt
end

입력으로 움직이기

폴링과 속도를 결합하여 객체의 방향을 조절하십시오. love.update에서 방향 키를 읽고 속도에 dt를 곱한 값을 적용합니다.

love.keyboard.isDown은 매 프레임 확인되므로 키를 누르고 있는 동안 플레이어가 부드럽게 움직입니다.

function love.update(dt)
  if love.keyboard.isDown('left') then player.x = player.x - player.speed*dt end
  if love.keyboard.isDown('right') then player.x = player.x + player.speed*dt end
end

대각선 속도 정규화

두 방향 키를 동시에 누르면 두 축에 모두 전체 속도가 더해지므로 대각선 이동이 더 빨라집니다. 이를 해결하려면 이동 벡터를 정규화하십시오.

방향을 그 길이로 나누어 크기를 1로 만든 다음 속도를 곱합니다. 이제 대각선 이동 거리와 직선 이동 거리가 같아집니다.

local dx, dy = ix, iy
local len = math.sqrt(dx*dx + dy*dy)
if len > 0 then
  player.x = player.x + (dx/len) * player.speed * dt
end

화면 안에 유지하기

객체가 화면 밖으로 나가지 않도록 위치를 제한하십시오. love.graphics.getWidth와 getHeight로 창 크기를 읽은 다음 좌표의 범위를 제한합니다.

math.max와 math.min을 함께 사용하면 값을 최솟값과 최댓값 사이로 깔끔하게 제한할 수 있습니다.

local w = love.graphics.getWidth()
player.x = math.max(0, math.min(player.x, w - player.size))

축 정렬 경계 상자

가장 간단한 충돌 방식은 직사각형을 사용하는 것으로, 이를 축 정렬 경계 상자 또는 AABB라고 합니다. 각 객체에는 x, y, 너비, 높이가 있습니다.

두 상자는 수평축과 수직축 모두에서 동시에 겹칠 때 겹친 상태가 됩니다. 이 확인은 빠르며 대부분의 2D 게임에 충분합니다.

-- box: { x, y, w, h }

AABB 겹침 검사

두 직사각형은 어느 축에서도 한쪽의 왼쪽 변이 다른 쪽의 오른쪽 변을 지나지 않을 때 겹칩니다. 전형적인 검사는 네 가지 비교를 결합합니다.

네 조건이 모두 참이면 상자들이 교차합니다. 이 하나의 조건이 2D 충돌 감지의 핵심입니다.

function overlaps(a, b)
  return a.x < b.x + b.w and
         b.x < a.x + a.w and
         a.y < b.y + b.h and
         b.y < a.y + a.h
end

충돌에 반응하기

overlaps가 참을 반환하면 어떤 일이 일어날지 결정하십시오. 동전을 줍거나, 피해를 입거나, 이동을 멈추게 할 수 있습니다. 이동한 뒤 love.update에서 충돌을 확인하십시오.

수집 아이템이라면 항목을 제거하거나 점수를 증가시키면 됩니다. 단단한 벽이라면 플레이어를 다시 바깥으로 밀어내야 합니다.

function love.update(dt)
  movePlayer(dt)
  if overlaps(player, coin) then
    score = score + 1
    coin.dead = true
  end
end

원 충돌

둥근 객체에는 거리 기반 충돌 방식이 더 정확합니다. 두 원의 중심 사이 거리가 두 반지름의 합보다 작으면 충돌합니다.

제곱 거리를 비교하면 비용이 큰 제곱근 계산을 피할 수 있습니다. 이는 많은 객체를 확인할 때 흔히 사용하는 최적화입니다.

function circlesHit(a, b)
  local dx, dy = a.x - b.x, a.y - b.y
  local rsum = a.r + b.r
  return dx*dx + dy*dy < rsum*rsum
end

벽 충돌 해결

벽에서 플레이어를 멈추려면 각 축을 따로 이동하고, 겹침을 일으키는 이동을 되돌리는 간단한 방법을 사용할 수 있습니다.

x를 이동하고 확인한 뒤, 충돌하면 x를 되돌립니다. y에 대해서도 반복하십시오. 이렇게 축을 분리하여 해결하면 모서리에 달라붙는 현상을 막을 수 있습니다.

player.x = player.x + vx * dt
if overlaps(player, wall) then player.x = player.x - vx * dt end
player.y = player.y + vy * dt
if overlaps(player, wall) then player.y = player.y - vy * dt end

중력 적용

플랫포머 게임에서는 일정한 아래 방향 가속도를 추가합니다. 매 프레임 중력에 dt를 곱한 값을 수직 속도에 더한 다음, 속도를 위치에 적용하십시오.

플레이어가 바닥에 착지하면 수직 속도를 0으로 만들어 낙하를 멈추게 합니다. 점프할 때는 음의 수직 속도를 설정합니다.

function love.update(dt)
  player.dy = player.dy + GRAVITY * dt
  player.y = player.y + player.dy * dt
end

사라진 객체 제거

충돌이 발생한 뒤에는 객체를 제거하는 경우가 많습니다. 목록을 뒤에서 앞으로 순회하면서 table.remove를 호출하면 삭제하는 동안 인덱스가 유효하게 유지됩니다.

뒤에서 앞으로 순회하는 방식은 반복 중간에 항목을 제거할 때 사용하는 안전한 Lua 관용구입니다. 앞에서부터 순회할 때 발생하는 항목 건너뛰기를 피할 수 있습니다.

for i = #coins, 1, -1 do
  if coins[i].dead then
    table.remove(coins, i)
  end
end

빠른 확인

LÖVE의 이동과 충돌에 대한 이해도를 확인해 보십시오.

복습

이동은 위치, 속도, dt를 결합하며, 공정한 대각선 이동을 위해 정규화를 사용하고 객체가 화면 안에 있도록 위치를 제한합니다. 충돌은 AABB 겹침 검사로 시작하며, 둥근 객체에는 원의 거리 검사를 사용합니다.

축별 이동을 되돌려 벽 충돌을 해결하고, 플랫포머 게임에는 중력을 추가하십시오. 사라진 객체는 뒤에서 앞으로 순회하면서 table.remove로 제거합니다.

자주 묻는 질문

“이동과 충돌” 강의는 무료인가요?

네 — “이동과 충돌” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“이동과 충돌”에서 뭘 배우나요?

플레이 가능한 장면을 만들어 보세요. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Lua Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“이동과 충돌” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. LOVE 게임 루프
  2. 도형과 이미지 그리기
  3. 입력 처리하기
  4. 이동과 충돌
← Lua Academy(으)로 돌아가기