pygame으로 만든 게임 원 충돌함수와 화살 포인트 추적

코변·2022년 4월 27일
0

개발일지

목록 보기
9/41

사과처럼 작은 오브젝트는 rect값이 너무 커서 아무리 작은 포인트를 찾아서 충돌함수를 이용해도 오브젝트 rect간의 겹침현상을 막을 수가 없다. 그래서 원안에 포함되어 있는지 확인하는 함수를 찾아서 코드에 대입했다. 잘 구동이 되었고 원과 다른 오브젝트가 잘 겹치지 않도록 잘 처리가 되었다.

# 특정포인트 값이 원 내부에 있는지 검사하는 함수
# 사과 주변의 정확한 원을 그리기 위해서 
# 사과의 중앙을 구함
center_x = self.x_pos + (self.width /2)
center_y = self.y_pos + (self.height/2)
collide = (math.pow(10,2) >= (math.pow(center_x - point[0], 2) + math.pow(center_y - point[1],2)))

또한 기존의 코드 중에서 화살의 포인트 추적을 pygame의 x포지션 y포지션으로 추적하다보니 화살촉에 딱 맞아들어가지 않아서 각도 변화에 따라서 밑변과 높이 값을 구해서 포인트에다 더하고 빼는 함수를 추가했더니 딱 맞게 떨어지지는 않지만 비슷하게 맞아 들어가는 것을 확인했다.

 # 화살의 4각형의 rect값은 다음과 같다
 # [x, y, width, height]
 # 기존의 x, y 에서 오른쪽 위로 이동하기 위해서는
 # 각각 width와 height값을 더해야하고
 # 거기다 더해 각도에 따라 변화하는 특정 포인트를 찾기 위해서
 # 피타고라스 정의를 활용하여 각도마다 변하는 정확한 값을 추가함
precise_point = [arrow.x_pos + 40 + (ux * tm), arrow.y_pos +24 +((uy * tm) + (g * tm ** 2) / 2)]
pre_cos_val = (12 * math.cos(math.radians(90) - radian_now))
pre_sin_val = (12 * math.sin(math.radians(90) - radian_now))
# 0도 일때는 arrow의 height/2 값을 더해준다.
if arrow_degree == 0:
precise_point[1] += 12
# 각도가 높아질 때 안 쪽 삼각형의 밑변과 높이를
# 구해야하기 때문에 구한 value값을 빼준다.
if arrow_degree > 0:
	precise_point[0] -= pre_cos_val
    precise_point[1] -= pre_sin_val
if arrow_degree < 0:
	precise_point[0] += pre_cos_val
	precise_point[1] += pre_sin_val

이번에 게임을 개발하면서 개발이 내 생각보다 더 재밌다는 것을 깨달았다. 너무 어렵고 정복하지 못할거라고 생각했던 문제를 하나씩 찾아가면서 해결하고 새로운 인사이트를 얻고 내가 발전하는 것을 느끼는 게 너무 즐겁다.

==============================================
2022. 4.30 수정내역

혼자 게임을 개선하기 위해서 생각해보니 계산할 때 높이 값은 모두 -를 해야한다는 것을 간과했다.

if arrow_degree > 0:
	precise_point[0] -= pre_cos_val
    precise_point[1] -= pre_sin_val
if arrow_degree < 0:
	precise_point[0] += pre_cos_val
	precise_point[1] -= pre_sin_val
profile
내 것인 줄 알았으나 받은 모든 것이 선물이었다.

0개의 댓글