이것은 Python 3 및 Pygame을 사용하여 게임을 만드는 방법에 대한 5부 튜토리얼 시리즈 중 네 번째입니다. 3부에서는 Breakout의 핵심을 살펴보고 이벤트 처리 방법을 배웠으며 주요 Breakout 클래스를 살펴보고 다양한 게임 개체를 이동하는 방법을 살펴보았습니다.
이 부분에서는 충돌을 감지하는 방법과 공이 패들, 벽돌, 벽, 천장, 바닥 등 다양한 물체에 부딪힐 때 어떤 일이 일어나는지 알아봅니다. 마지막으로 게임 UI의 중요한 주제, 특히 자체 사용자 정의 버튼을 사용하여 메뉴를 만드는 방법을 검토하겠습니다.
게임에서는 사물이 서로 충돌합니다. 돌파구도 예외는 아닙니다. 대부분의 경우 공이 무언가에 부딪히는 경우가 많습니다. handle_ball_collisions()
方法有一个嵌套函数,名为 intersect()
, 공이 물체에 닿는지 여부와 물체에 닿는 위치를 테스트하는 데 사용됩니다. 공이 물체를 놓치면 "Left", "Right", "Up", "Down" 또는 "None"을 반환합니다.
공이 라켓에 맞으면 튕겨져 나갑니다. 패들 상단에 닿으면 다시 튕겨 나가지만 동일한 수평 속도 구성 요소를 유지합니다.
그러나 패들의 한쪽 면에 부딪히면 반대쪽(왼쪽 또는 오른쪽)으로 튕겨져 바닥에 닿을 때까지 계속 아래쪽으로 움직입니다. 이 코드는 교차 함수()를 사용합니다.
으아악
라켓이 내려가는 도중 공을 놓치면(또는 공이 라켓 측면에 부딪히면) 공은 계속 떨어져 결국 바닥에 부딪히게 됩니다. 이 시점에서 플레이어는 생명을 잃고 공이 다시 생성되어 게임을 계속할 수 있습니다. 플레이어의 생명이 다 떨어지면 게임이 종료됩니다.
으아악
공이 벽이나 천장에 부딪히면 다시 튕겨 나옵니다.
으아악
공이 벽돌에 부딪히는 것은 Breakout의 주요 이벤트입니다. 벽돌이 사라지고, 플레이어가 점수를 얻고, 공이 다시 튀어오르고, 몇 가지 다른 일이 발생합니다(음향 효과 및 특수 효과도 가능). 그건 나중에.
벽돌이 맞았는지 확인하기 위해 코드는 공과 교차하는 벽돌이 있는지 확인합니다.
으아악
대부분의 게임에는 일종의 사용자 인터페이스가 있습니다. Breakout에는 "PLAY"와 "QUIT"라는 두 개의 버튼이 있는 간단한 메뉴가 있습니다. 이 메뉴는 게임이 시작될 때 나타나고 플레이어가 "시작"을 클릭하면 사라집니다. 버튼과 메뉴가 어떻게 구현되고 게임과 어떻게 통합되는지 살펴보겠습니다.
Pygame에는 내장 UI 라이브러리가 없습니다. 타사 확장 기능이 있지만 메뉴용 버튼을 직접 만들기로 결정했습니다. 버튼은 일반, 호버, 누름의 세 가지 상태를 갖는 게임 개체입니다. 일반 상태는 마우스가 버튼 위에 있지 않은 상태이고, 호버 상태는 마우스가 버튼 위에 있지만 마우스 왼쪽 버튼을 누르지 않은 상태입니다. 누른 상태는 마우스가 버튼 위에 있고 플레이어가 마우스 왼쪽 버튼을 누르는 경우입니다.
버튼은 배경색과 텍스트가 표시된 직사각형으로 구현됩니다. 또한 버튼은 버튼을 클릭할 때 호출되는 on_click 함수(기본값은 noop 람다 함수)를 받습니다.
으아악버튼은 자체 마우스 이벤트를 처리하고 이러한 이벤트를 기반으로 내부 상태를 변경합니다. 버튼을 누르면 MOUSEBUTTONUP
事件,表示玩家点击了按钮,并调用 on_click()
기능이 수신됩니다.
배경 직사각형을 그리는 데 사용되는 back_color
속성은 항상 버튼의 현재 상태와 일치하는 색상을 반환하므로 플레이어는 버튼이 활성화되어 있음을 명확하게 확인할 수 있습니다.
create_menu()
函数创建一个带有两个按钮的菜单,其中包含文本“PLAY”和“QUIT”。它有两个嵌套函数,名为 on_play()
和 on_quit()
,它提供给相应的按钮。每个按钮都添加到 objects
列表(待绘制)以及 menu_buttons
필드.
PLAY 버튼을 클릭하면 on_play()가 호출되는데, 이는 objects
列表中删除按钮,这样就不再绘制它们了。此外,触发游戏开始的布尔字段 is_game_running
和 start_level
에서 True로 설정됩니다.
종료 버튼을 클릭하면 True로 설정되어 최종 게임 시퀀스가 시작됩니다. is_game_running
设置为 False
(有效暂停游戏)并且 game_over
으아악
메뉴 표시 및 숨기기는 암시적입니다. 버튼이
목록에 있으면 메뉴가 표시되고 제거되면 메뉴가 숨겨집니다. 그렇게 쉽습니다. objects
버튼과 같은 하위 구성 요소를 렌더링하는 자체 표면이 있는 중첩 메뉴를 만든 다음 해당 메뉴 구성 요소를 추가/제거할 수 있지만 이 간단한 메뉴에는 필요하지 않습니다.
이 섹션에서는 충돌 감지와 공이 패들, 벽돌, 벽, 천장 및 바닥과 같은 다양한 물체에 부딪힐 때 어떤 일이 발생하는지 다룹니다. 또한 명령에 따라 숨기고 표시하는 사용자 정의 버튼이 포함된 자체 메뉴를 만들었습니다.
이 시리즈의 마지막 부분에서는 점수와 라이브, 음향 효과, 음악에 세심한 주의를 기울여 최종 게임을 살펴보겠습니다.
그런 다음 게임에 흥미를 더하기 위해 복잡한 특수 효과 시스템을 개발하겠습니다. 마지막으로 향후 방향과 잠재적인 개선 사항에 대해 논의합니다.
위 내용은 Python 3 및 Pygame을 사용하여 대화형 게임 만들기: 4부의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!