티스토리 뷰
히트체크는 사각형에서 체크와 원형체크가 대표적이다. 원형체크의 경우에는 피타고라스 정의를 쓰면 되는데 문제는 제곱근에 경우에 연산을 많이 차지 하기 때문에 실제 게임에서 쓰기 어렵다. 그래서 다른 방식을 써야 하는데 이게 이번 공부의 핵심이다. 히트체크가 끝나면 삼각함수 편을 볼 예정이다.
게임 엔진에서는 콜라이더가 있기 때문에 이걸 구할필요는 없는데 플루터에 게임 엔진이라든지 이런 로우한 엔진들은 해당 기능이 없어서 직접 히트 체크 하는 법을 알아야 한다,
이거 끝나고 프로그래머스에 가서 자료구조 알고리즘 고득점 키트 문제를 풀어야 할듯 싶다. 이번 한번만 해두면 될듯 싶다.
우선 사각형 체크는 서로 가로 길이의 반 혹은 세로길이의 반을 서로 더한거랑 거리랑 비교했을때 여분의 값 즉 공간이 남으면 서로 간에 거리가 먼거고 공간이 안남고 더한값보다 거리값이 적은 경우에는 서로 겹치고 있는 상황이다.
그림으로 봐야 이해가 쉬워서 자세한 내용은 파이썬으로 배우는 게임 개발 책을 사서 보면 좋을듯 싶다. 좋은 책이다.
using System;
using System.Collections.Generic;
using System.Linq;
using Godot;
namespace Base.Scripts;
public partial class Hit : Node2D
{
readonly List<Node2D> _nodeList = new();
public override void _Ready()
{
GetChildren().ToList().ForEach(i => _nodeList.Add(i.GetNode<Node2D>(".")));
GD.Print($"hit : {HitCheckRectangle()}");
}
bool HitCheckRectangle()
{
var one = _nodeList[0];
var two = _nodeList[1];
var distanceX = Math.Abs(one.Position.X - two.Position.X);
var distanceY = Math.Abs(one.Position.Y - two.Position.Y);
return (distanceX <= one.Scale.X / 2 + two.Scale.X / 2) &&
(distanceY <= one.Scale.Y / 2 + two.Scale.Y /2);
}
}
잘 작동한다. 이제 원형일때 히트 체크를 확인 하도록 하자.
이게 정석은 제곱근 함수를 활용해서 두점사이에 거리를 구하는 거다. 다만 이건 일반적인 경우에는 잘 쓸수 있지만 업데이트 같은데서는 쓰기 어렵기 때문에 다른 방식으로 쓰는법을 익혀야 한다.
bool HitCheckCircle()
{
var one = _nodeList[0];
var two = _nodeList[1];
var distance = Math.Sqrt((one.Position.X - two.Position.X) * (one.Position.X - two.Position.X)
+ (one.Position.Y - two.Position.Y) * (one.Position.Y - two.Position.Y));
return (distance <= one.Scale.X / 2 + two.Scale.X / 2);
}
일단 요런식으로 구할수 있다. 단 이 방식은 정확도는 높지만 제곱근을 구하는 함수가 부하가 있는 편이다.
bool HitCheck()
{
var one = _nodeList[0];
var two = _nodeList[1];
var distanceSquare = (one.Position.X - two.Position.X) * (one.Position.X - two.Position.X)
+ (one.Position.Y - two.Position.Y) * (one.Position.Y - two.Position.Y);
return (distanceSquare <= (one.Scale.X / 2 + two.Scale.X / 2) * (one.Scale.X / 2 + two.Scale.X / 2));
}
거리를 구하는 것이 아니라 그냥 Hit 체크 여부만 구하는 거면 이런식으로 제곱으로 비교하면 된다. 간단한 건데 머리가 똥멍청이가 되다보니 아이디어를 생각하지 못했던 거다. 글고 보면 그 전 직장에서 동료가 피타고라스를 쓰면 부하가 많이 갈꺼라고 했던게 이걸 두고 하는 이야기 였던거 같다.
'학습 > 고도' 카테고리의 다른 글
고도엔진을 연구해야지 (1) | 2024.02.27 |
---|---|
2차원 리스트 맵 (0) | 2024.02.26 |
배경 움직이기와 캐릭터 애니메이션 (1) | 2024.02.26 |
파이썬으로 배우는 게임 개발 실전편 (0) | 2024.02.26 |