코드 에디터 및 플레이어

Pyxen은 코드 에디터와 실행 중인 게임을 같은 창에 둡니다. 코드 패널에서 Pyxen Script를 쓰고, 그 옆의 미리보기에서 게임을 플레이합니다.

코드 에디터

에디터는 Pyxen Script에 색을 입히고, 입력하는 동안 코드를 검사합니다. 문제는 해당 줄에 이유와 함께 표시됩니다.

Mac에서, 그리고 하드웨어 키보드를 연결한 iPad에서 선택, 복사, 붙여넣기, 실행 취소, 실행 복귀 같은 표준 단축키가 작동합니다. 마우스나 트랙패드로 커서를 정확하게 놓을 수 있습니다.

입력 중 매개변수

world.get(이나 hero.tween(처럼 호출의 (를 입력하면 줄 위에 카드가 나타나 그 호출이 받는 것을 보여 줍니다. 매개변수 목록, 지금 입력 중인 매개변수 강조, 그 매개변수의 레퍼런스 설명, 페이지를 여는 **레퍼런스 ›**입니다. 쉼표를 넘어가도, 안쪽 호출로 들어가도 따라오고, 닫는 )를 입력하면 사라집니다. 직접 만든 함수에도 카드가 나타나고 docstring의 첫 줄이 표시됩니다.

줄 아래의 목록은 맞는 것부터 보여 줍니다. world.get(에서는 프로젝트에 쓴 엔티티 이름, ease= 뒤에서는 이징 이름, 아직 넘기지 않은 키워드, 그다음에 평소의 이름입니다. 문자열로 쓴 이름만 알기 때문에 게임 실행 중에 이름을 붙인 엔티티는 나오지 않습니다.

Esc를 한 번 누르면 목록이 닫히고, 두 번 누르면 그 호출의 카드가 숨겨집니다. Cmd+Shift+Space(편집 › 매개변수 보기)로 다시 나타나고, Ctrl+Space(편집 › 자동 완성 보기)로 목록이 열립니다. iPad에서는 카드를 탭하면 레퍼런스가 열립니다. 화면 키보드에서는 호출 안에서 입력 줄의 . 키가 ,를 입력합니다.

입력 중 에셋

Sprite(", Sound(", Music(", Text(…, font=", GridMap(tilemap="처럼 호출이 받는 이름의 따옴표 안에서는, 목록에 프로젝트의 그 종류 에셋이 먼저 나오고 각 에셋 팩의 것이 이어집니다. 모두 그림과 함께입니다. 이미지는 첫 타일(또는 이미지 전체)과 크기, 애니메이션, 폰트는 호출의 텍스트를 그 폰트로, 맵은 작게 그린 모습입니다. animation=" 뒤에서는 같은 호출에서 이름을 지정한 이미지의 애니메이션이 각각 재생되며 나열됩니다. 선택한 것은 목록 옆에 크게 보이고, 스프라이트에서 열기 ›(또는 종류에 맞는 패널)로 열 수 있습니다.

사운드와 음악에는 **▶**가 있습니다. 클릭하거나, 선택한 항목에서 Option+Return(편집 › 선택기 보기)을 누르면 들을 수 있습니다. 목록을 이동하는 동안에는 아무것도 재생되지 않고, Esc로 멈춥니다. 사운드 뱅크의 사운드는 "bank/sound"로 씁니다.

목록은 문자열로 쓴 이름만 압니다. 변수에 담은 이름이나 조합한 이름에는 목록이 나오지 않고, 카드가 게임 실행 중에 정해진다고 알려 줍니다. 시스템의 ‘동작 줄이기’가 켜져 있으면 애니메이션은 멈춰 있습니다.

타일 인수, Sprite("tiles", tile=( 나 맵의 level.set(…, tile=( 에서는 호출이 지정한 이미지가 격자와 함께 줄 아래에 열립니다(타일 선택기). 타일을 클릭하거나 여러 개에 걸쳐 드래그하면 고르는 대로 숫자가 코드에 쓰입니다. 스프라이트는 픽셀로 (x, y, w, h), 맵은 칸으로 (column, row)입니다. 숫자를 직접 입력하면 선택이 따라 움직입니다. Return으로 유지하고(iPad에서는 완료), Esc로 원래 값을 되돌리며, 실행 취소 한 번으로 선택 전체를 되돌립니다. 빈 tile=(에서는 저절로 열립니다. 이미 쓴 타일은 숫자 바로 앞의 작은 그림을 클릭하거나 Option+Return(편집 › 선택기 보기)을 누르고 화살표 키를 쓰세요(Shift로 타일 여러 개). HERO * 16처럼 상수로 계산된 숫자는 점선으로 표시되고, 숫자로 덮어쓰기 전에 선택기가 알려 줍니다. 격자가 없는 이미지는 숫자가 이미 주는 크기로, 없으면 16픽셀 단위로 고릅니다.

Cmd를 누른 채 코드 속 에셋 이름(Sprite("ninja", animation="run")의 "ninja" 등) 위로 포인터를 옮기면, 이름에 밑줄이 그어지고 카드에 에셋의 그림, 크기, 애니메이션이 보입니다. Cmd+클릭하면 호출이 가리키는 곳에서 에셋이 편집기로 열립니다. 스프라이트 편집기는 run 애니메이션에서, tile=(16, 0, 16, 16)이면 그 사각형이 선택된 채로, 뱅크의 사운드(Sound("sfx/coin"))라면 사운드 뱅크에서 그 사운드가 골라진 채로 열립니다. 프로젝트에 없는 이름은 아무것도 열지 않습니다.

반대 방향도 됩니다. 에셋의 창에는 코드에서 사용과 그 에셋을 가리키는 스크립트 줄 수가 표시됩니다. 메뉴에서 줄을 고르면 그 줄로 이동합니다. 창의 막대가 너무 좁으면 창의 ⋯ 메뉴 맨 위에 있습니다.

Sprite("ninjaa")의 "ninjaa"처럼 프로젝트에 없는 이름은 게임을 실행하기 전부터 노란색 밑줄로 표시됩니다. 커서를 올리면 카드에 *프로젝트에 이름이 ‘ninjaa’인 것이 없습니다.*라고 나오고, ‘ninja’ 사용으로 가장 비슷한 이름을 그 자리에 쓰거나 **새 이미지…**로 만들 수 있습니다(종류에 따라 새 타일맵…, 새 폰트…, 새 사운드 뱅크…). 이미지에 없는 애니메이션도 같은 방식으로 밑줄이 그어지며, 같은 Sprite에서 함께 쓸 수 없는 tile=과 animation=도 마찬가지입니다. 이것들은 오류가 아니라 경고입니다. 이름이 나중에 추가하는 에셋 팩에서 올 수도 있으므로 게임은 그대로 실행됩니다. 텍스트로 쓴 이름만 확인합니다.

심볼로 이동

Cmd+Shift+O(편집 › 심볼로 이동…)를 누르면 프로젝트의 함수와 이름, 그리고 레퍼런스 항목이 나열됩니다. 입력해서 걸러 낸 뒤 하나를 선택하면 그곳으로 이동합니다.

정의로 이동

함수나 변수 이름을 Cmd+클릭하거나, 커서를 그 위에 두고 Cmd+J(편집 › 정의로 이동)를 누르면 정의된 곳으로 이동합니다. 프로젝트의 파일을 넘나들며 작동합니다. 함수가 utils.py에 정의되고 main.py에서 호출된다면, Cmd+클릭으로 바로 그곳에 갑니다. 이름의 정의가 여러 개이거나 프로젝트에 없으면, 그 이름으로 심볼로 이동이 열립니다.

단어 단위 이동

Option+화살표 키로 커서를 한 글자가 아니라 한 단어씩 움직입니다. Shift와 함께 쓰면 단어 단위로 선택되어, 변수 이름이나 함수 호출을 빠르게 선택할 때 편리합니다.

텍스트 크기와 테마

**Cmd+=**로 코드를 크게, **Cmd+-**로 작게 할 수 있습니다. 보기 › 텍스트 크게와 텍스트 작게를 선택해도 됩니다. 설정 › 편집기에서 크기를 10~32포인트로 정하고 코드 테마 열 가지 중 하나를 고를 수 있습니다. 자동은 화면 모드에 따라 Pyxen Dark 또는 Pyxen Light를 씁니다. 그 밖에 Pyxen Deep Dark, Pyxen Deep Light, Dracula, GitHub Light, One Dark, One Light, Solarized Dark, Solarized Light가 있습니다.

좁은 iPad 창에서

창의 너비가 900포인트보다 좁을 때(세로 방향의 11인치 iPad, Split View, Slide Over) Pyxen은 패널을 한 번에 하나씩 보여 주고, 나머지는 그 위의 탭이 됩니다. 패널의 도구는 창 아래쪽의 트레이에 있습니다. 손잡이를 탭하면 높이가 바뀌고, 아래로 드래그하면 접힙니다. 코드 패널의 트레이에는 다음이 있습니다.

화면 키보드가 올라와 있을 때는 코드용 키가 키보드 위 줄에 있습니다. 하드웨어 키보드를 쓰면 코드 패널에는 트레이가 없습니다.

게임 실행하기

실행(Cmd+R)을 선택하면 코드를 검사하고 컴파일해서 실행합니다. 게임은 미리보기에서 시작됩니다. 정지(Cmd+.)로 끝내고, 미리보기 막대의 일시 정지로 한 프레임에 멈춥니다.

코드에 오류가 있으면 Pyxen이 해당 줄에 메시지를 표시합니다. 고친 다음 다시 실행하세요.

프레임 인스펙터

실행 중인 게임을 일시정지하면 프레임 인스펙터가 활성화됩니다. 이것이 Pyxen의 내장 디버거입니다.

인스펙터를 통해:

타임 스크러버

Pyxen은 게임 실행 중 최대 300프레임(초당 30프레임으로 10초)의 기록을 녹화합니다. 일시정지 상태에서 시간을 앞뒤로 이동할 수 있습니다.

각 프레임은 엔티티와 그린 내용을 메모리 예산 안에서 보관합니다. 엔티티나 draw가 많은 무거운 게임은 더 적은 프레임을 보관하며, 가장 오래된 프레임부터 사라지고, 얼마나 뒤로 갈 수 있는지는 스크러버에 표시됩니다. 예산은 설정 › 게임 미리보기 › 디버거 › 기록 메모리에서 정합니다. 처음에는 기기 권장값(그 아래에 표시)으로 시작하며, 대부분의 게임에서 300프레임을 보관합니다.

이를 통해:

타임 스크러버는 디버깅을 추측에서 관찰로 바꿉니다. print 문을 추가하고 다시 실행하는 대신, 일시정지하고, 되감고, 관찰하세요.

워크플로우

Pyxen의 일반적인 워크플로우:

  1. 에디터에서 코드 작성 또는 편집
  2. 실행해서 테스트
  3. 무언가 잘못 보이면 게임 일시정지
  4. 시간을 되감아 잘못된 프레임 찾기
  5. 엔티티를 검사하여 예상치 못한 상태 확인
  6. 중지하고, 코드 수정, 반복