/VPython_skate_game

⛸️ VPython으로 개발한 물리법칙 기반 미니게임

Primary LanguagePython

스케이트 게임

캐릭터가 장애물들을 피하며 빙판 위를 달리는 게임입니다.

다양한 물리법칙을 기반으로 개발되었습니다.



플레이 링크

https://www.glowscript.org/#/user/thgee/folder/MyPrograms/program/skategame



게임설명

빙판위에 떠다니는 장애물과 충돌하면 게임이 종료됩니다.

브레이크와 점프를 이용하여 장애물을 피하세요.

게임 중간에 나오는 아이템들은 점프를 이용하여 획득할 수 있습니다.

아이템 효과 지속시간은 3초입니다.


조작법

← → 방향키 : 플레이어가 좌 우로 이동합니다.

↑ 방향키 : 플레이어가 점프합니다.

Spacebar : 플레이어가 빙판위를 미끄러지며 정지합니다.



아이템


위성 아이템 점프 아이템 브레이크 아이템
플레이어 주변에 4개의 위성이 생성되고,
플레이어를 중심으로 공전합니다.
공전하는 위성에 충돌하는
장애물들을 날려버립니다.
점프력이 강화됩니다. 브레이크 성능이 강화됩니다.


기능구현

  • 캐릭터가 달려가는 모습을 캐릭터의 시계, 반시계 회전을 반복하는 방식으로 구현하였습니다.

  • 브레이크 시 캐릭터가 옆으로 돌면서 미끄러지고, 스키드마크가 생기도록 구현하였습니다.

    Untitled 3


  • 플레이어가 장애물과 충돌하여 게임이 종료되면 “Game Over” 텍스트가 화면에 3D로 출력됩니다. 또한 캐릭터의 색깔이 빨간색으로 변하며 빙판 위에 쓰러집니다.

    Untitled 4


  • 아이템을 먹으면 아이템 지속시간동안 플레이어의 색깔이 아이템 색깔과 같아지도록 구현했습니다.

  • 아이템 지속시간 동안은 다른아이템을 획득할 수 없도록, 다른 아이템들은 일시적으로 화면에서 사라지도록 구현했습니다.

  • 위성아이템을 획득하면 위성 4개가 플레이어 주변을 등속원운동 하고, 위성과 장애물이 닿으면 장애물을 날려버립니다. 위성아이템의 지속시간이 끝나면 각 위성들은 사방으로 퍼지며 장애물들을 밀어내고 사라집니다.

    Untitled 5


  • 점프 아이템을 획득하면 점프력이 강화되는데, 이 때 카메라도 플레이어와 함께 높이 점프하도록 하여 역동적인 움직임을 강조했습니다.

    Untitled 6

  • 진행방향이 정방향으로 되어있으면 플레이어와 장애물의 거리가 감이 잘 잡히지 않기 때문에, 진행방향을 사선으로 기울여서 더 수월하게 장애물을 피할 수 있도록 하였습니다.

  • 방향키를 꾹 눌렀을 때 키 재입력시간 때문에 플레이어의 움직임이 부자연스러웠던 현상을 키보드 입력 로직을 수정하여 자연스럽게 움직일수 있도록 구현하였습니다.



물리법칙

  • 플레이어가 빙판을 달리고 있을 때는 중력과 수직항력의 합력이 0이 되어 플레이어의 y좌표가 변동되지 않도록 하였습니다. 플레이어가 점프하면 수직항력은 사라지고, 플레이어에 작용하는 힘은 중력밖에 없으므로, 중력에 의해 빙판으로 떨어지게 하였습니다.

  • 점프 시 플레이어가 빙판을 미는 힘에 의한 운동량이 속도로 바뀌어 플레이어 속도의 y성분이 증가됩니다. 그 이후 중력에 의해서 점차적으로 속도의 y성분이 줄어들고, 플레이어의 y좌표가 최고점에 도달했을 때 속도의 y성분은 0이 됩니다. 다시 중력에 의해서 빙판의 표면까지 플레이어가 떨어지며 등가속도 운동을 하게 됩니다. 플레이어가 착지하여 빙판에 닿는 순간 빙판과 완전 비탄성 충돌을 한다고 가정하여, 플레이어의 속도의 y성분은 0이 됩니다.

  • 점프아이템 획득 시 플레이어가 빙판을 미는 힘을 증가시켰습니다.

  • 브레이크시 플레이어와 빙판 사이에 마찰력이 작용하여 멈추게 되는데, 마찰계수를 0.5로 설정하고 마찰력을 플레이어의 진행방향의 반대방향으로 작용하게 하였습니다.

  • 브레이크 아이템 획득 시 마찰계수를 증가시켜 마찰력이 강해지고, 플레이어가 더 빠르게 멈출 수 있도록 하였습니다.



시행착오

  • 물체의 크기들을 초기에는 1, 2, 3 처럼 구현했는데, 게임의 특성상 많은 물체들의 이동이 필요하다 보니 버벅임이 발생하여, 물체의 크기를 1/10 비율로 모두 축소시켰습니다.

  • 브레이크 도중에 방향키를 누르면 브레이크가 중단되는 현상이 발생하였습니다. 이는 브레이크를 잡기 위해 스페이스바를 꾹 누르면 실제로는 스페이스바가 연속으로 입력되는 것인데, 스페이스바를 꾹 누른 상태에서 다른 키를 입력하게 되면 스페이스바 입력이 중단되어서 발생하는 현상이었습니다. 위 현상은 브레이크를 스페이스바를 누를 때 마다 작용하도록 하지 않고, 스페이스바를 누르는 순간 브레이크 모드로 바뀌게 하고, 시뮬레이션 내에서 브레이크모드인 경우 마찰력이 작용하도록 하여 해결하였습니다.

  • 일반적으로 카메라는 플레이어가 점프를 할 때에도 y좌표가 움직이지 않도록 구현하였습니다. 이렇게 한 이유는 카메라가 플레이어와 함께 위아래로 움직이면, 플레이어가 점프를 하고있다는 느낌이 잘 들지 않기 때문입니다. 하지만 점프아이템을 먹은 이후에는 카메라를 함께 움직여주지 않으면 높아진 점프력때문에 플레이어가 카메라 밖으로 나가버립니다. 따라서 점프아이템을 먹었을 경우에만 플레이어가 점프할 때 카메라도 함께 움직이도록 구현하였는데, 이 때 해결해야하는 예외처리들이 너무 많았습니다. 캐릭터가 점프하는 도중 아이템 제한시간이 풀리는경우, 캐릭터가 빙판에서 달리고있을 때 제한시간이 풀리는 경우, 캐릭터가 점프아이템을 먹으려고 점프했을 때 그 점프는 기본점프인데, 해당 기본점프까지는 착지한 후 높은점프를 구현해야 하는 등 계속 버그가 발생했고, 오랜 시간을 소요한 끝에 해결하였습니다.

  • 위성아이템 획득 시 위성 4개가 플레이어 주변을 등속 원운동 하도록 구현하였습니다. 위성의 초기속도를 설정하고 구심가속도를 구하여 원운동을 완성시켰습니다. 위성이 플레이어를 공전하며, 장애물에 닿으면 반발계수 = 1 에 의해 탄성충돌하며 장애물을 날려버립니다.

    이때, 게임의 특성상 위성은 날아가지 않고 계속해서 장애물을 없앨 수 있도록 장애물에만 충돌처리를 했습니다.

    또한, 장애물과 위성의 충돌처리 시에 위성의 속도에 플레이어가 달리고 있는 속도까지 반영하여 충돌 처리 하였습니다.