세그먼트 이동 알고리즘을 chase-following에서 path-following으로 변경#60
Conversation
Summary of ChangesHello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! 이 풀 리퀘스트는 지렁이 게임에서 세그먼트가 머리의 경로를 정확히 따라가지 못하고 코너를 자르는 문제를 해결하기 위해 지렁이 세그먼트의 이동 알고리즘을 근본적으로 개선합니다. 기존 방식은 스프린트나 급회전 시 오차가 누적되어 시각적 결함이 발생했지만, 새로운 '경로-따라가기' 방식은 머리의 실제 이동 경로를 기록하고 세그먼트들이 이 경로를 따라 정확히 배치되도록 함으로써 이러한 문제를 해결합니다. 이는 게임의 시각적 일관성과 플레이 경험을 크게 향상시키며, 메모리 및 CPU 사용량 측면에서도 효율성을 고려하여 구현되었습니다. Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Changelog
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Code Review
지렁이 세그먼트 이동 로직을 기존의 chase-following에서 path-following으로 개선한 점이 인상적입니다. PR 설명에 작성해주신 것처럼, 새로운 방식은 특히 스프린트나 급회전 시의 정확도를 크게 향상시켜 사용자 경험을 개선할 것으로 기대됩니다. 전체적인 코드 변경은 새로운 로직을 잘 반영하고 있으며, 관련 함수들에게 positionHistories를 전달하는 방식도 일관성 있게 적용되었습니다. 코드 품질을 더욱 높이기 위해 몇 가지 리팩터링 제안을 포함했습니다.
| } | ||
|
|
||
| // 머리의 새 위치를 경로 기록에 추가 (배열 끝 = 최신) | ||
| const head = worm.segments[0]; |
@konempty |
BEYONDWORM-122: 지렁이 세그먼트 Path-Following 구현
문제
지렁이가 회전할 때 세그먼트가 머리의 경로를 정확히 따라가지 않고 코너를 자르는 현상.
기존 방식의 문제점
기존 chase-following은 각 세그먼트가 앞 세그먼트의 현재 위치를 향해 직선으로 이동한다.
이 방식은 이동량이 작을 때는 path-following과 거의 동일한 결과를 내지만, 다음 조건에서 오차가 발생한다:
1. 스프린트 시 틱당 이동량 > 세그먼트 간격
2. 오차 누적
3. 급회전 시 오차 증폭
4. deltaTime 변동
setTimeout은 정확한 타이밍을 보장하지 않음 (GC, 서버 부하 등)Chase-Following vs Path-Following
Chase-Following (기존)
각 세그먼트가 이전 세그먼트의 현재 위치를 향해 직선으로 이동하는 방식.
경로를 기록하지 않고, 매 틱마다 앞 세그먼트가 지금 어디 있는지만 보고 쫓아감.
일반 속도(~11.67px/tick)에서는 이동량이 작아 path-following과 거의 동일하게 보이지만,
스프린트(~18.33px/tick)나 지렁이가 길어지면 오차가 누적되어 눈에 띔.
Path-Following (변경 후)
매 틱마다 머리 위치를 배열에 기록하고, 각 세그먼트를 기록된 경로 위의 정확한 지점에 배치하는 방식.
경로를 역순(최신→과거)으로 걸어가며 거리를 누적하고,
i × SEGMENT_SPACING거리 지점을 보간(interpolation)으로 계산.속도나 deltaTime 변동에 관계없이 항상 정확한 경로를 따라감.
성능
메모리
{x, y}배열, 세그먼트 100개 기준 약 120개 기록 ≈ ~2KBCPU
pushO(1),unshiftO(H)를 회피하기 위해 배열을[과거 → 최신]순서로 저장