[ English | 中文 | Deutsch | Español | Français | Italiano | 日本語 | 한국어 | Português | Русский ]
Pyxel은 Python을 위한 레트로 게임 엔진입니다.
16가지 색상만 사용하거나 동시에 4가지 소리만 재생하는 등 레트로 게임에 나올 법한 사양으로, Python에서 픽셀 아트 스타일의 게임을 마음껏 만들 수 있습니다.
Pyxel 개발의 동기는 사용자의 피드백입니다. GitHub에서 Pyxel에 별점을 주세요!
Pyxel의 사양 및 API는 PICO-8 및 TIC-80에서 영감을 받았습니다.
Pyxel은 오픈 소스로, 무료로 자유롭게 사용할 수 있습니다. Pyxel과 함께 레트로 스타일의 게임을 만들어보세요!
- Windows, Mac, Linux, Web에서 작동
- Python으로 프로그래밍
- 16색 팔레트
- 256x256 크기의 이미지 뱅크 3개
- 256x256 크기의 타일 맵 8개
- 4개의 사운드 채널 및 64개의 정의 가능한 사운드
- 임의의 사운드를 조합 가능한 8개의 음악
- 키보드, 마우스, 게임패드 입력
- 이미지/사운드 에디터
Python3 (버전 3.7 이상)을 설치한 후, 다음 명령어를 실행합니다.
pip install -U pyxel
공식 설치 프로그램을 사용하여 Python을 설치하는 경우 pyxel
명령을 활성화하려면 Add Python 3.x to PATH
확인란을 선택하십시오.
Python3 (버전 3.7 이상)을 설치한 후, 다음 명령어를 실행합니다.
python3 -m pip install -U pyxel
Mac에 기본적으로 설치되는 Python3를 사용하는 경우 위 명령의 시작 부분에 sudo
를 추가하여 pyxel
명령을 활성화하십시오.
SDL2 패키지 (Ubuntu의 경우 libsdl2-dev
), Python3 (버전 3.7 이상), python3-pip
를 설치한 후, 다음 명령어를 실행합니다.
sudo pip3 install -U pyxel
위의 방법이 작동하지 않으면 Makefile의 지침에 따라 자체 빌드를 시도하십시오.
Pyxel의 웹 버전은 Python 또는 Pyxel 설치가 필요하지 않으며 지원되는 웹 브라우저가 있는 PC는 물론 스마트폰 및 태블릿에서 실행됩니다.
구체적인 지침은 이 페이지를 참조하십시오.
Pyxel 설치 후, 다음 명령어를 사용해 현재 폴더에 Pyxel 예제 파일을 복사할 수 있습니다.
pyxel copy_examples
복사되는 예제 파일은 다음과 같습니다:
01_hello_pyxel.py | 간단한 애플리케이션 | Demo | Code |
02_jump_game.py | Pyxel 리소스 파일을 사용한 점프 게임 | Demo | Code |
03_draw_api.py | Drawing API 데모 | Demo | Code |
04_sound_api.py | Sound API 데모 | Demo | Code |
05_color_palette.py | 색상 팔레트 목록 | Demo | Code |
06_click_game.py | 마우스 클릭 게임 | Demo | Code |
07_snake.py | BGM이 포함된 스네이크 게임 | Demo | Code |
08_triangle_api.py | Triangle drawing API 데모 | Demo | Code |
09_shooter.py | 화면 전환이 있는 슈팅 게임 | Demo | Code |
10_platformer.py | 맵이 있는 횡 스크롤 플랫폼 게임 | Demo | Code |
11_offscreen.py | Image 클래스를 사용한 오프스크린 렌더링 | Demo | Code |
12_perlin_noise.py | 펄린 노이즈 애니메이션 | Demo | Code |
13_bitmap_font.py | 비트맵 글꼴 그리기 | Demo | Code |
99_flip_animation.py | flip 기능이 있는 애니메이션 (웹 플랫폼이 아닌 경우에만 해당) | Demo | Code |
30SecondsOfDaylight.pyxapp | 제 1회 Pyxel Jam 우승 작품 (Adam 제작) | Demo | Code |
megaball.pyxapp | 아케이드 볼 물리 게임 (Adam 제작) | Demo | Code |
8bit-bgm-gen.pyxapp | 배경 음악 생성기 (frenchbread 제작) | Demo | Code |
다음 명령어를 사용하여 예제 파일을 실행할 수 있습니다.
cd pyxel_examples
pyxel run 01_hello_pyxel.py
pyxel play 30SecondsOfDaylight.pyxapp
Python 스크립트에서 Pyxel 모듈을 가져온 뒤 init
함수로 화면 크기를 지정한 후, run
함수로 Pyxel 애플리케이션을 시작합니다.
import pyxel
pyxel.init(160, 120)
def update():
if pyxel.btnp(pyxel.KEY_Q):
pyxel.quit()
def draw():
pyxel.cls(0)
pyxel.rect(10, 10, 20, 20, 11)
pyxel.run(update, draw)
run
함수의 인자로는 프레임 갱신을 처리하는 update
함수와 필요할 때 화면을 그리는 draw
함수가 사용됩니다.
실제 애플리케이션에서는 아래와 같이 클래스에서 Pyxel 코드를 감싸는 것이 좋습니다.
import pyxel
class App:
def __init__(self):
pyxel.init(160, 120)
self.x = 0
pyxel.run(self.update, self.draw)
def update(self):
self.x = (self.x + 1) % pyxel.width
def draw(self):
pyxel.cls(0)
pyxel.rect(self.x, 0, 8, 8, 9)
App()
애니메이션 없이 간단한 그래픽을 만들 때 show
기능을 사용하면 코드를 더 간결하게 만들 수 있습니다.
import pyxel
pyxel.init(120, 120)
pyxel.cls(1)
pyxel.circb(60, 60, 40, 7)
pyxel.show()
생성된 Python 스크립트는 다음 명령어를 사용해 실행할 수 있습니다.
pyxel run PYTHON_SCRIPT_FILE
일반 Python 스크립트처럼 실행할 수도 있습니다.
python3 PYTHON_SCRIPT_FILE
(Windows 환경에서는 python3
대신 python
을 입력해야 합니다)
Pyxel 애플리케이션 실행 중에, 아래의 특수 조작을 사용할 수 있습니다.
Esc
애플리케이션 종료Alt(Option)+1
바탕 화면에 스크린샷 저장Alt(Option)+2
화면 캡처의 녹화 시작 시간 초기화Alt(Option)+3
화면 캡처 파일을 바탕 화면에 저장 (최대 10초)Alt(Option)+0
성능 모니터 (fps, update time, draw time)의 표시/표시 해제Alt(Option)+Enter
전체 화면 전환
Pyxel Editor는 Pyxel 애플리케이션에서 사용되는 이미지와 사운드를 생성할 수 있습니다.
다음 명령어를 사용해 시작할 수 있습니다.
pyxel edit PYXEL_RESOURCE_FILE
지정한 Pyxel 리소스 파일 (.pyxres)이 존재하는 경우에는 해당 파일을 불러오고, 존재하지 않는 경우 지정한 이름으로 새 리소스 파일을 생성합니다.
파일 이름을 생략했을 경우, 기본 파일 이름은 my_resource.pyxres
입니다.
Pyxel Editor 실행 중 다른 리소스 파일을 드래그 앤 드롭하는 것으로 작업 중인 리소스 파일을 변경할 수 있습니다. Ctrl(Cmd)
키를 누르면서 리소스 파일을 드래그 앤 드롭하면, 현재 편집 중인 리소스 유형(Image/Tilemap/Sound/Music)만 불러올 수 있습니다. 이를 통해 여러 개의 리소스 파일을 하나로 결합할 수 있습니다.
만들어진 리소스 파일은 load
함수를 통해 불러올 수 있습니다.
Pyxel Editor에는 다음과 같은 편집 모드가 있습니다.
이미지 편집기:
이미지 뱅크의 이미지를 편집하는 화면입니다.
![](/masahiko-nitanda/pyxel/raw/main/docs/images/image_editor.gif)
이미지 편집기 화면에 이미지 파일(png/gif/jpeg)을 드래그 앤 드롭하면, 이미지를 현재 선택된 이미지 뱅크로 불러올 수 있습니다.
타일 맵 편집기:
이미지 뱅크의 이미지를 타일 모양으로 늘어놓은 타일 맵을 편집하는 화면입니다.
![](/masahiko-nitanda/pyxel/raw/main/docs/images/tilemap_editor.gif)
사운드 편집기:
사운드를 편집하는 화면입니다.
![](/masahiko-nitanda/pyxel/raw/main/docs/images/sound_editor.gif)
음악 편집기:
사운드를 플레이 순서대로 늘어놓은 음악을 편집하는 화면입니다.
![](/masahiko-nitanda/pyxel/raw/main/docs/images/music_editor.gif)
Pyxel의 이미지와 타일 맵은 다음과 같은 방법으로 만들 수도 있습니다.
Image.set
또는Tilemap.set
함수를 사용하여 문자열 리스트에서 이미지 생성Image.load
함수를 사용하여 Pyxel 팔레트 이미지 파일(png/gif/jpeg) 불러오기
Pyxel의 사운드와 음악도 다음과 같은 방법으로 만들 수 있습니다.
Sound.set
또는Music.set
함수를 사용하여 문자열에서 사운드 생성
각 함수의 사용법은 API 레퍼런스를 참조해주세요.
Pyxel은 여러 플랫폼에서 작동하는 전용 애플리케이션 배포 파일 형식 (Pyxel 애플리케이션 파일)을 지원합니다.
Pyxel 애플리케이션 파일 (.pyxapp)은 다음 명령어를 사용해 생성할 수 있습니다.
pyxel package APP_DIR STARTUP_SCRIPT_FILE
응용 프로그램에 리소스 또는 추가 모듈이 포함되어야 하는 경우 응용 프로그램 디렉터리에 배치합니다.
생성된 애플리케이션 파일은 다음 명령어를 사용하여 실행할 수 있습니다.
pyxel play PYXEL_APP_FILE
Pyxel 응용 프로그램 파일은 pyxel app2exe
또는 pyxel app2html
명령을 사용하여 실행 파일 또는 HTML 파일로 변환할 수도 있습니다.
-
width
,height
화면의 가로/세로 크기 -
frame_count
경과한 프레임의 수 -
init(width, height, [title], [fps], [quit_key], [display_scale], [capture_scale], [capture_sec])
Pyxel 애플리케이션을 화면 크기 (width
,height
)로 초기화합니다. 옵션으로title
에 창 제목,fps
에 프레임 속도,quit_key
에 애플리케이션 종료 키,display_scale
을 사용한 디스플레이 크기,capture_scale
에 화면 캡처의 배율,capture_sec
에 화면 캡처의 최대 녹화 시간을 지정할 수 있습니다.
예시:pyxel.init(160, 120, title="My Pyxel App", fps=60, quit_key=pyxel.KEY_NONE, capture_scale=3, capture_sec=0)
-
run(update, draw)
Pyxel 애플리케이션을 실행하며, 프레임 갱신 시update
함수를, 화면 그리기에draw
함수를 호출합니다. -
show()
화면을 표시하고Esc
키를 누를 때까지 기다립니다. -
flip()
화면을 한 프레임씩 새로 고칩니다.Esc
키를 누르면 애플리케이션이 종료됩니다. 이 기능은 웹이 아닌 플랫폼에서만 작동합니다. -
quit()
Pyxel 애플리케이션을 종료합니다.
load(filename, [image], [tilemap], [sound], [music])
리소스 파일 (.pyxres)을 불러옵니다. 리소스 타입 (image/tilemap/sound/music
)에False
를 지정하면, 해당 리소스는 불러오지 않습니다. 동일한 이름의 팔레트 파일(.pyxpal)이 리소스 파일과 동일한 위치에 존재하는 경우 팔레트 표시 색상도 변경됩니다. 팔레트 파일은 줄 바꿈으로 구분된 디스플레이 색상의 16진수 항목입니다. 팔레트 파일은 Pyxel Editor에 표시되는 색상을 변경하는 데에도 사용할 수 있습니다.
-
mouse_x
,mouse_y
마우스 커서의 현재 좌표를 나타냅니다. -
mouse_wheel
마우스 휠의 현재 값을 나타냅니다. -
btn(key)
key
가 눌리고 있으면True
, 눌리고 있지 않으면False
를 반환합니다. (키 정의 리스트) -
btnp(key, [hold], [repeat])
해당 프레임에key
가 눌리면True
, 눌리지 않으면False
를 반환합니다.hold
와repeat
를 지정하면,hold
프레임 이상key
가 눌린 상태인 경우repeat
프레임 간격으로True
를 반환합니다. -
btnr(key)
해당 프레임에key
가 떼어지면True
, 아니면False
를 반환합니다. -
mouse(visible)
visible
이True
인 경우 마우스 커서를 표시하고,False
라면 표시하지 않습니다. 마우스 커서가 보이지 않아도 마우스 커서의 좌표는 갱신됩니다.
-
colors
팔레트의 표시 색상 리스트입니다. 표시 색상은 24-bit 숫자 값으로 지정합니다.colors.from_list
및colors.to_list
를 사용해 Python 리스트의 형태로 직접 색상을 지정하고 적용할 수 있습니다.
예시:old_colors = pyxel.colors.to_list(); pyxel.colors.from_list([0x111111, 0x222222, 0x333333]); pyxel.colors[15] = 0x112233
-
image(img)
이미지 뱅크img
(0-2)를 조작합니다. (이미지 클래스 참조)
예시:pyxel.image(0).load(0, 0, "title.png")
-
tilemap(tm)
타일 맵tm
(0-7)을 조작합니다. (타일 맵 클래스 참조) -
clip(x, y, w, h)
화면의 드로잉 영역을 (x
,y
)로 설정하고, 너비를w
, 높이를h
로 설정합니다.clip()
과 같이 사용하면 드로잉 영역을 초기 상태(전체 화면)으로 돌립니다. -
camera(x, y)
화면의 좌측 상단 좌표를 (x
,y
)로 변경합니다.camera()
로 좌표를 (0
,0
)으로 초기화할 수 있습니다. -
pal(col1, col2)
드로잉 시col1
를col2
로 대체합니다.pal()
과 같이 사용하면 초기 상태로 돌립니다. -
cls(col)
화면을col
색으로 지웁니다. -
pget(x, y)
(x
,y
) 좌표의 색상 값을 가져옵니다. -
pset(x, y, col)
col
색을 사용해 (x
,y
) 좌표에 픽셀을 그립니다. -
line(x1, y1, x2, y2, col)
col
색을 사용해 (x1
,y1
)부터 (x2
,y2
)까지 직선을 그립니다. -
rect(x, y, w, h, col)
가로w
, 세로h
의 크기로col
색을 사용해 직사각형을 (x
,y
) 좌표에 그립니다. -
rectb(x, y, w, h, col)
가로w
, 세로h
의 크기로col
색을 사용해 직사각형 테두리를 (x
,y
) 좌표에 그립니다. (테두리 안쪽에 색상을 채우지 않음) -
circ(x, y, r, col)
반경r
,col
색의 원을 (x
,y
) 좌표에 그립니다. -
circb(x, y, r, col)
반경r
,col
색의 원 테두리를 (x
,y
) 좌표에 그립니다. (테두리 안쪽에 색상을 채우지 않음) -
elli(x, y, w, h, col)
(x
,y
)에서 너비w
, 높이h
및 색상col
의 타원을 그립니다. -
ellib(x, y, w, h, col)
(x
,y
)에서 너비w
, 높이h
및 색상col
의 타원 윤곽선을 그립니다. -
tri(x1, y1, x2, y2, x3, y3, col)
꼭짓점 좌표 (x1
,y1
), (x2
,y2
), (x3
,y3
)를 기준으로col
색상의 삼각형을 그립니다. -
trib(x1, y1, x2, y2, x3, y3, col)
꼭짓점 좌표 (x1
,y1
), (x2
,y2
), (x3
,y3
)를 기준으로col
색상의 삼각형 테두리를 그립니다. (테두리 안쪽에 색상을 채우지 않음) -
fill(x, y, col)
(x
,y
)에서 너비w
, 높이h
및 색상col
의 줄임표를 그립니다. -
blt(x, y, img, u, v, w, h, [colkey])
이미지 뱅크img
(0-2)의 (u
,v
)로부터 크기 (w
,h
)까지의 영역을 (x
,y
) 좌표에 복사합니다.w
,h
의 값을 음수로 설정하면, 각각 수평, 수직 방향으로 반전됩니다.colkey
로 색을 지정하면 투명 색상으로 처리됩니다.
bltm(x, y, tm, u, v, w, h, [colkey])
타일 맵tm
(0-7)의 (u
,v
)로부터 크기 (w
,h
)까지의 영역을 (x
,y
) 좌표에 복사합니다.w
,h
의 값을 음수로 설정하면, 각각 수평, 수직 방향으로 반전됩니다.colkey
로 색을 지정하면 투명 색상으로 처리됩니다. 타일 하나의 크기는 8x8 픽셀이며(tile_x, tile_y)
의 튜플로 타일 맵에 저장되어 있습니다.
text(x, y, s, col)
col
색을 사용해 문자열s
를 (x
,y
) 좌표에 그립니다.
-
sound(snd)
사운드snd
(0-63) 를 조작합니다. (사운드 클래스 참조)
예시:pyxel.sound(0).speed = 60
-
music(msc)
음악msc
(0-7) 를 조작합니다. (음악 클래스 참조) -
play_pos(ch)
채널ch
(0-3)의 사운드 재생 위치를(sound no, note no)
형태의 튜플로 가져옵니다. 재생 중이 아닐 경우None
을 반환합니다. -
play(ch, snd, [tick], [loop])
채널ch
(0-3)에서 사운드snd
(0-63)를 재생합니다.snd
가 리스트일 경우, 순서대로 재생됩니다. 재생 시작 위치는tick
(1 tick = 1/120초)으로 지정할 수 있습니다.loop
에True
를 지정하면 계속 반복합니다. -
playm(msc, [tick], [loop])
음악msc
(0-7)을 재생합니다. 재생 시작 위치는tick
(1 tick = 1/120초)으로 지정할 수 있습니다.loop
에True
를 지정하면 계속 반복합니다. -
stop([ch])
지정된 채널ch
(0-3)의 재생을 중지합니다.stop()
을 사용해 모든 채널의 재생을 중지할 수도 있습니다.
-
ceil(x)
x
보다 크거나 같은 가장 작은 정수를 반환합니다. -
floor(x)
x
보다 작거나 같은 가장 큰 정수를 반환합니다. -
sgn(x)
x가 양수이면 1, 0이면 0, 음수이면 -1을 반환합니다. -
sqrt(x)
x
의 제곱근을 반환합니다. -
sin(deg)
deg
각도의 사인을 반환합니다. -
cos(deg)
deg
각도의 코사인을 반환합니다. -
atan2(y, x)
y
/x
의 아크탄젠트를 도 단위로 반환합니다. -
rseed(seed: int)
난수 생성기의 시드를 설정합니다. -
rndi(a, b)
a
보다 크거나 같고b
보다 작거나 같은 임의의 정수를 반환합니다. -
rndf(a, b)
a
보다 크거나 같고b
보다 작거나 같은 임의의 소수를 반환합니다. -
nseed(seed)
Perlin 노이즈의 시드를 설정합니다. -
noise(x, [y], [z])
지정된 좌표에 대한 Perlin 노이즈 값을 반환합니다.
-
width
,height
이미지의 가로, 세로 크기 -
set(x, y, data)
(x
,y
)에 문자열 리스트를 사용해 이미지를 설정합니다.
예시:pyxel.image(0).set(10, 10, ["0123", "4567", "89ab", "cdef"])
-
load(x, y, filename)
(x
,y
)에 이미지 파일(png/gif/jpeg)을 불러옵니다. -
pget(x, y)
(x
,y
)에서 픽셀 색상을 가져옵니다. -
pset(x, y, col)
(x
,y
)에 색상col
의 픽셀을 그립니다.
-
width
,height
타일 맵의 가로/세로 크기 -
refimg
타일 맵이 참조하는 이미지 뱅크 (0-2) -
set(x, y, data)
(x
,y
)에 문자열 리스트를 사용해 타일 맵을 설정합니다.
예시:pyxel.tilemap(0).set(0, 0, ["0000 0100 a0b0", "0001 0101 a1b1"])
-
pget(x, y)
(x
,y
)에서 타일을 가져옵니다. 타일은(tile_x, tile_y)
의 튜플 형태입니다. -
pset(x, y, tile)
(x
,y
)에tile
을 그립니다. 타일은(tile_x, tile_y)
의 튜플 형태입니다.
-
notes
음정 리스트 (0-127). 숫자가 높을수록 피치가 높아지며 33에서는 'A2'(440Hz)가 됩니다. 쉼표는 -1입니다. -
tones
음색 리스트 (0:Triangle / 1:Square / 2:Pulse / 3:Noise) -
volumes
음량 리스트 (0-7) -
effects
효과 리스트 (0:None / 1:Slide / 2:Vibrato / 3:FadeOut) -
speed
재생 속도. 1이 가장 빠르며 숫자가 커질수록 재생 속도가 느려집니다. 120에서는 한 음의 길이가 1초가 됩니다. -
set(notes, tones, volumes, effects, speed)
문자열을 사용해 음정, 음색, 음량 및 효과를 설정합니다. 음색, 음량, 효과의 길이가 음정보다 짧으면 처음부터 반복됩니다. -
set_notes(notes)
'CDEFGAB'+'#-'+'01234' 또는 'R' 문자열로 음정을 설정합니다. 대소문자를 구분하지 않으며 빈칸은 무시됩니다.
예시:pyxel.sound(0).set_notes("G2B-2D3R RF3F3F3")
-
set_tones(tones)
'TSPN' 문자열로 음색을 설정합니다. 대소문자를 구분하지 않으며 빈칸은 무시됩니다.
예시:pyxel.sound(0).set_tones("TTSS PPPN")
-
set_volumes(volumes)
'01234567' 문자열로 음량을 설정합니다. 대소문자를 구분하지 않으며 빈칸은 무시됩니다.
예시:pyxel.sound(0).set_volumes("7777 7531")
-
set_effects(effects)
'NSVF' 문자열로 효과를 설정합니다. 대소문자를 구분하지 않으며 빈칸은 무시됩니다.
예시:pyxel.sound(0).set_effects("NFNF NVVS")
-
snds_list
채널 수가 포함된 2차원 사운드 목록(0-63). -
set(snds0, snds1, snds2, snds3)
모든 채널의 사운드 (0-63) 리스트를 지정합니다. 빈 리스트가 지정되면 해당 채널은 재생에 사용되지 않습니다.
예시:pyxel.music(0).set([0, 1], [2, 3], [4], [])
Pyxel에는 "사용자를 혼란스럽게 할 수 있거나", "사용하는 데 전문 지식이 필요함"의 이유로 여기에 언급되지 않은 "고급 사용자용 API"가 존재합니다.
이러한 것을 다루는 데 능숙하시다면, 여기를 참고해 깜짝 놀랄 만한 작품 만들기에 도전해보세요!
오류 제보나 기능 건의는 이슈 트래커에서 받고 있습니다. 새 이슈를 작성하기 전에 비슷한 내용의 이슈가 없는지 확인 부탁드립니다.
코드를 테스트해 주시고, 이슈 트래커 페이지에서 오류 제보나 개선 제안을 해주시는 분들을 환영합니다!
패치나 수정 요청은 풀 리퀘스트(PR)로 받고 있습니다. 제출하기 전에 문제가 이미 해결되지 않았는지 이슈 트래커 페이지에서 확인 부탁드립니다.
제출한 풀 리퀘스트는 MIT 라이선스에 따라 게시하는 데 동의한 것으로 간주합니다.
Pyxel은 MIT 라이선스를 따릅니다. 소프트웨어의 모든 사본 또는 그 상당 부분에 MIT 라이선스 조항의 사본 및 저작권 통지가 포함되어 있다면 독점 소프트웨어 내에서 재사용할 수 있습니다.
Pyxel은 GitHub Sponsors에서 스폰서를 모집하고 있습니다. Pyxel의 유지 보수 및 기능 추가를 위해 스폰서가 되는 것을 고려해보세요. 스폰서가 되면 혜택으로 Pyxel에 대한 상담을 받을 수 있습니다. 자세한 내용은 여기를 참조하세요.