변경 이력 (Ren'Py 7.x 이후)
별도로 호환되지 않는 변경 사항도 정리되어 있습니다.
8.5.4
Live2D의 베지어 곡선 해석을 Live2D SDK와 동일한 Cardano 방식으로 변경했습니다. Live2D()의 old_beziers 매개변수나 config.live2d_old_beziers 변수로 동작을 바꿀 수 있습니다.
수정 사항
플레이어의 텍스트 속도가 즉시 표시로 설정되어 있어도 텍스트 셰이더가 cps 태그를 반영합니다.
8.5.3
의존 항목 업데이트
이제 Live2D 5.3을 지원하며 필수로 요구합니다. Ren'Py 8.5.3 이상에서 계속 사용하려면 Live2D를 업데이트해야 할 수 있습니다.
Python 패키지로 취급하는 Ren'Py 스토어
문서에는 명시되어 있었지만 구현되지 않았던 동작으로, 이제 Ren'Py 스토어를 Python 패키지로 취급합니다. 따라서 다른 스토어에서도 가져올 수 있습니다. 예를 들면 다음과 같습니다.
init python in store.substore1:
A = 42
init python in store.substore2:
B = 37
init python:
from store.substore1 import A
from store.substore2 import B
이 import는 이름에 값을 대입할 뿐 별칭을 만들지는 않습니다. 메인 스토어의 A를 변경해도 substore1의 값은 바뀌지 않으며 그 반대도 같습니다.
구문 분석 오류 개선
구문 분석 오류는 이제 우선순위 단계별(libs, 게임, mods 순) 종료 시 보고합니다. 같은 단계에서는 01statement.rpy나 01lib/statement.rpy처럼 숫자로 시작하는 파일의 오류를 문자로 시작하는 파일보다 먼저 보고합니다.
이 변경은 제작자 정의 문을 정의하는 파일의 구문 분석 오류를 먼저 보고하기 위한 것입니다. 문이 제대로 정의되지 않은 상태에서 이를 사용하면 게임 스크립트에도 구문 분석 오류가 발생하는데, 정의 파일의 오류가 먼저 나타나므로 제작자가 정의한 문의 문제를 더 쉽게 찾아 수정할 수 있습니다.
수정 및 변경 사항
renpy.pause()는 이제 항상 최소 한 프레임 동안 일시 정지합니다. 이전에는 롤백 후 정지하지 않을 수 있었습니다.
뷰포트 드래그를 개선하여 마우스 버튼을 누르지 않아도 끌리던 상황을 해결했습니다.
macOS의 자동 언어 감지가 더 많은 상황에서 작동하도록 개선했습니다.
새 config.mesh_oversample 변수로 메시 텍스처의 오버샘플링 배율을 조절하여 확대 시 추가 흐려짐을 방지할 수 있습니다. 이 버전의 기본값은 1.0(비활성화)이지만 Ren'Py 8.6에서는 바뀔 예정입니다.
새 함수 목록 config.say_menu_text_filters가 기존 config.say_menu_text_filter 함수를 보완합니다.
매우 특정한 상황에서 데이터가 손상될 수 있던 문제를 수정했습니다. 불러오기 후 스택을 풀면서 Python finally나 except 블록이 실행되어 이전 데이터를 잘못 복원하던 문제입니다. 발생 가능성은 작지만 Python을 많이 사용하는 게임에서는 나타날 수 있었습니다.
드물게 발생하는 여러 충돌과 메모리 누수를 수정했습니다.
nearest_neighbor 샘플링을 사용하면 이제 이방성 필터링을 꺼 흐려짐을 방지합니다.
다른 채널의 대기 음악이 재생될 때까지 기다릴지 제어하는 renpy.audio.register_channel()의 synchro_start 기본값이 이제 항상 해당 채널의 기본 loop 값입니다.
게임 메뉴에서 나오면 mouse_visible 값을 올바르게 복원합니다.
대사에 사용하는 say 동작은 드래그 중인 뷰포트 등 다른 디스플레이어블이 화면 입력을 잡고 있으면 더 이상 대사를 넘기지 않습니다.
camera 문이 트랜스폼 상태를 전달한다는 점을 문서화했습니다. (원래도 그랬지만 설명이 없었습니다.)
nestled와 nestled-close 진행 표시기가 이제 오른쪽에서 왼쪽으로 쓰는 언어를 감지하여 반영합니다.
nestled와 nestled-close 진행 표시기를 이제 모든 상황에서 너비 0으로 렌더링합니다. NVL 모드, 유지된 말풍선 등의 구성에서 발생하던 문제를 막습니다. 진행 표시기 없이 텍스트를 렌더링한 뒤 끝 옆에 CTC 표시기를 배치하는 것과 같습니다. ({w}, {p}, extend의 기존 처리와 비슷합니다.)
번역
Ren'Py 튜토리얼의 포르투갈어 번역을 추가했습니다.
Ren'Py 튜토리얼의 이탈리아어 번역을 추가했습니다.
Ren'Py 튜토리얼의 페르시아어 번역을 업데이트했습니다.
기능
루비 텍스트나 스타일 텍스트 태그의 스타일을 정의할 때 부모 텍스트의 값을 사용하도록 None으로 설정할 수 있는 속성이 늘었습니다. 이 버전부터 다음 속성에 None을 지정할 수 있습니다. antialias, axis, black_color, bold, color, font, font_features, hinting, instance, italic, size, textshader.
따라서 루비 텍스트에서 font None을 설정하면 글꼴을 상속할 수 있습니다. 예를 들면 다음과 같습니다.
style ruby_style is default:
size 12
yoffset -20
color None # Use the same color as the parent text.
font None # Use the same font as the parent text.
mouse_visible에 마우스를 항상 표시하는 새 값 "always"를 추가했습니다. 미니게임 등에서 마우스를 강제로 표시해야 할 때 유용합니다.
시스템에 설치한 VSCodium 텍스트 편집기를 지원합니다. Visual Studio Code와 같은 소스 코드로 만든 자유 소프트웨어 빌드입니다.
트랜스폼을 고유 객체로 표시하는 Transform.unique() 메서드를 추가했습니다. 디스플레이어블에 추가할 때 복사하지 않으므로 여러 번 사용해도 상태를 유지하거나 function 인수 밖에서 참조할 수 있습니다.
8.5.2
수정 사항
롤백 가능 여부를 확인할 때마다 롤백 단계 하나를 소모하던 문제를 수정했습니다.
8.5.1
수정 사항
다음처럼 기다리지 않기({nw}) 태그로 끝나는 텍스트 뒤에 extend가 오면 이제 자동 진행 시간을 올바르게 계산합니다.
e "이 문장 뒤에 {nw}"
extend "글이 더 이어집니다."
롤백이나 불러오기 전에 호출 스택을 먼저 풉니다. 롤백 이후 except와 finally 블록이 실행되어 되돌린 데이터를 변경하던 문제를 방지합니다.
파일 시스템 검색 시 .hidden.rpy처럼 점으로 시작하는 파일과 디렉터리를 건너뜁니다. 이런 이름은 unix와 Mac 플랫폼에서 특수한 의미가 있는 경우가 많습니다.
말풍선 대사는 매번이 아니라 연속된 일시 정지가 끝날 때만 유지됩니다.
마우스 변경 및 수정
사용할 커서를 정할 때 가능한 여러 마우스 커서 이름을 차례로 확인합니다. 디스플레이어블(예: button), 스크린 종류(예: gamemenu), 기본 커서가 포함됩니다.
MouseDisplayable에서 마우스 커서에 None을 지정하여 시스템 커서를 사용할 수 있습니다.
빠르게 연속 발생한 MOUSEMOTION 이벤트를 더 낮은 수준에서 병합합니다. 프레임마다 이벤트를 많이 보내는 마우스에서도 게임 반응성이 향상됩니다.
기타 변경 사항
config.safe_text가 설정되면 태그 오류가 있는 텍스트도 표시하는 안전 모드가 생겼습니다. 기본값은 배포 게임에서 True, 개발자 모드에서 False입니다.
brotli Python 모듈의 축소 버전을 포함합니다. decompress 메서드와 Decompressor 객체를 지원하지만 Compressor는 제외합니다. requests가 brotli로 압축된 응답을 처리하도록 마련한 기능입니다.
음성 대사를 재생하면 진행 중인 자동 읽기를 멈춥니다.
새 config.tlid_only_considers_say 변수는 voice 등 say 이외의 문이 번역 식별자에 영향을 주지 않도록 합니다. (번역 식별자는 말풍선 추적 등에도 사용됩니다.) 기본값은 False지만 Ren'Py 8.6에서는 True로 바뀔 예정입니다. voice 문을 사용하는 게임에서 true로 설정하면 번역 식별자가 달라질 수 있습니다.
말풍선 영역을 대사에 전달하는 방식을 제어하는 bubble.area_property 변수를 문서화했습니다. 더 세밀하게 제어할 수 있도록 영역을 bubble 스크린의 인수로 전달하는 방법도 설명합니다.
각 상호 작용 종료 후 호출하는 새 "interact_done" 캐릭터 콜백을 추가했습니다.
8.5.0
웹의 Live2D
웹 플랫폼에서 Live2D 모델을 지원합니다. 런처에서 Cubism SDK for Web을 설치하고 웹 환경의 Ren'Py에서 Live2D 모델을 로드할 수 있습니다.
자동화 테스트
Ren'Py에는 이제 게임과 Ren'Py 자체의 자동화 테스트를 정의하고 실행하는 테스트 프레임워크가 포함됩니다. 이 프레임워크는 자동 기능 테스트를 위해 설계되었습니다. 예를 들어 미리 정한 대사와 선택지 순서를 따라 클릭하면서, 게임이나 엔진이 변경되어도 충돌 없이 게임 끝까지 도달하는지 확인할 수 있습니다.
전체 엔진과 게임 렌더링 부분을 모두 시험하므로 GUI가 정상 작동하는 환경에서 실행해야 하며, 특히 작동하는 OpenGL이 필요합니다.
런처나 명령줄의 test 명령으로 실행할 수 있습니다. 게임에 테스트 케이스가 하나 이상 있어야 “테스트 케이스 실행(Run testcases)” 명령이 나타납니다. Tutorial 프로젝트에서 자동화 테스트의 실제 동작을 살펴보기 좋습니다.
지역 레이블
지역 레이블 제약을 완화하여 어느 전역 레이블과도 함께 선언할 수 있습니다. 이제 chapter_1_part_1.rpy에 다음을 쓰고:
label chapter_1:
label chapter_1.part_1:
# ...
chapter_1_part_2.rpy에 다음을 쓸 수 있습니다.
label chapter_1.part_2:
# ...
Steam 지원
이제 Steamworks SDK 1.62를 사용하며 필수로 요구합니다.
config.automatic_steam_timeline이 설정되면 save_name으로 게임 진행 단계를 설정합니다. (save_name은 장 이름으로 생각하는 것이 좋습니다.) 이전에는 진행 단계 대신 타임라인 상태에 주석을 달았습니다.
글꼴과 Unicode 지원
최신 고압축 글꼴 형식인 WOFF2를 지원합니다. 이전 WOFF 형식의 지원도 공식화했습니다. TrueType 글꼴을 WOFF2로 바꾸려면 config.font_name_map과 config.font_replacement_map이 유용할 수 있습니다.
Unicode 17 문자를 지원하도록 업데이트했습니다.
이모지 글꼴에 글리프 435개를 추가하고 기존 글리프도 업데이트했습니다. (Unicode 16 이모지는 대부분 포함하지만 Unicode 17 이모지는 포함하지 않습니다.)
GUI default 변경
문서에 설명한 동작과 일치하도록 gui 네임스페이스와 default 문의 상호 작용을 변경했습니다. 이 릴리스부터 default로 설정한 gui 변수는 다음과 같이 동작합니다.
게임 시작 또는 재시작 시 설정됩니다.
python 블록에서 변경할 수 있습니다.
언어가 바뀌어도 마지막 설정값을 유지합니다.
다른 변수처럼 저장하고 불러옵니다.
처음 default로 설정한 변수에만 적용됩니다. gui 네임스페이스의 모든 변수는 default 또는 define으로 설정해야 합니다.
Pygame_SDL2 제거
Ren'Py는 더 이상 pygame_sdl2 프로젝트에 의존하지 않습니다. SDL3 이식 등 향후 개발을 위해 대부분을 renpy.pygame 패키지로 통합했습니다. 호환성을 위해 pygame이나 pygame_sdl2로 가져올 수 있지만:
import renpy.pygame as pygame
이제 pygame 유사 기능은 위 방식으로 가져오는 것을 권장합니다.
빌드 과정이 단순해졌습니다. Linux에서는 uv 도구로 개발용 Ren'Py를 빌드할 수 있습니다.
기타 변경 사항
32비트 ARM 지원을 이제 16 KB 페이지로 빌드하여 Play Console의 경고를 방지합니다.
여러 줄 입력 디스플레이어블에서 위아래 방향키로 이전 및 다음 줄에 커서를 옮길 수 있습니다. 문자 오프셋으로 이동하므로 고정폭 글꼴에서 가장 잘 작동합니다.
thumb_align이 키워드 속성에서 스타일 속성으로 바뀌어 스타일에서 지원됩니다.
대사 내보내기 시 특수 캐릭터 extend를 감지하여 이전 캐릭터의 이름을 해당 줄에 포함합니다.
xmaximum과 ymaximum으로 컨테이너가 제공한 크기보다 큰 크기를 디스플레이어블에 제공할 수 있습니다.
screen 문에는 이제 블록이 필수입니다. 원래 문서에 명시된 요구 사항이지만 강제하지 않았습니다.
config.tracesave_screenshot으로 트레이스백 저장 시 스크린샷을 촬영할지 제어할 수 있습니다.
새 before_load 특수 레이블과 config.before_load_callbacks로 불러오기 도중 표시할 내용과 재생할 소리를 바꿀 수 있습니다.
새 config.locale_to_language_map은 로캘 문자열을 언어 이름에 대응시키는 딕셔너리로, config.enable_language_autodetect를 더 쉽게 사용자 지정할 수 있습니다.
Movie() 디스플레이어블은 이제 동영상을 재생할 때 채널을 동적으로 할당합니다. 이전에는 Movie를 생성할 때마다 채널을 할당했으므로, 채널과 연결된 버퍼를 보관하는 데 많은 메모리가 사용될 수 있었습니다.
renpy.register_statement()의 init_priority에 정수 대신 초기화 우선순위를 반환하는 함수를 지정할 수 있습니다.
유닉스 계열의 숨김 파일인 .hidden.rpy처럼 점으로 시작하는 .rpy 파일은 더 이상 로드하지 않습니다.
제작자 정의 문의 execute_init이나 execute_default를 실행할 때 renpy.get_filename_line()이 해당 문의 파일명과 줄 번호를 반환합니다.
renpy.filename_line_override() 컨텍스트 관리자로 renpy.get_filename_line()의 반환 파일명과 줄 번호를 재정의할 수 있습니다.
config.images_directory를 이미지 검색 디렉터리 목록인 config.image_directories로 대체했습니다.
새 config.context_callbacks로 새 컨텍스트 진입 시 호출할 콜백을 여러 개 정의할 수 있습니다.
웹 플랫폼의 game.zip에 이제 .py 파일을 포함하지 않습니다.
업그레이드 전에 실행 중인 다른 Ren'Py 게임을 종료하도록 안내합니다. Windows에서 실행 중인 게임이 런처 파일을 사용하여 생기는 문제를 해결합니다.
RTL 언어 지원이 기본으로 활성화되어 config.rtl을 설정할 필요가 없습니다.
새 config.adjust_audio_amplitude로 Ren'Py가 재생하는 모든 오디오의 진폭을 전역 조정할 수 있습니다.
수정 사항
잘못 저장된 동영상 텍스처로 발생하던 충돌을 수정했습니다.
이미지 기반 글꼴에 알파 사전 곱셈을 올바르게 적용하여 정상적으로 알파 혼합합니다.
인터랙티브 디렉터와 call에 from 추가 명령에서 나타나던 여러 스크립트 편집 문제를 수정했습니다.
오버샘플링한 동영상의 크기 조절 문제를 수정했습니다.
8.4.1
수정 사항
경우에 따라 잘못 발생하던 "Leaking texture: 0" 경고를 더 이상 표시하지 않습니다.
웹에서 브라우저 창 크기를 바꾸면 텍스처를 다시 로드하여 투명하거나 검게 보이는 현상을 방지합니다.
웹에서 동영상을 재생할 때 경고가 계속 발생하던 문제를 해결했습니다.
gui.SetPreference()가 환경설정 적용 후 다시 스타일을 재구성합니다.
자식 크기가 다른 AlphaDissolve와 AlphaBlend()의 이전 호환성을 제공하는 config.dissolve_shrinks가 의도대로 작동합니다.
게임 간 번역 복사가 올바르게 작동합니다. 특히 런처의 번역을 새 게임에 전달하여 영어 이외의 언어로 만든 게임을 올바르게 구성하는 데 중요합니다.
웹에서 동영상 재생 시 나타날 수 있던 진단 출력문을 제거했습니다.
pixellate 화면 전환이 예상대로 작동합니다.
기능
프로젝트 디렉터리의 하위 디렉터리에서도 템플릿을 검색합니다.
Python의 importlib.resources를 지원합니다. Python 패키지가 RPA 아카이브, Android APK 또는 에셋 팩 안에 있어도 패키지의 리소스를 로드할 수 있습니다.
기타 변경 사항
번역 함수에 잘못된 수의 인수를 전달하는지 검사하는 Lint 기능이 너무 느려 일시적으로 제거했습니다.
오른쪽에서 왼쪽으로 쓰는 언어 지원이 기본으로 활성화됩니다.
디스크에서 Python 모듈이나 패키지를 로드하면 Ren'Py가 __file__ 속성에 해당 모듈이나 패키지의 절대 경로를 설정합니다. 이는 Ren'Py 8.4.0에서 __file__을 게임 디렉터리 기준 상대 경로로 설정하도록 했던 변경을 되돌린 것입니다. RPA 아카이브나 Android APK에서 로드할 때는 $game으로 시작하는 상대 경로를 사용합니다. 더 많은 순수 Python 패키지가 Ren'Py에서 작동하도록 하기 위한 변경이지만, 게임 코드에서는 __file__ 속성에 의존하지 말고 importlib.resources를 사용하는 것이 좋습니다.
8.1의 일정 출력 패닝 변경으로 생긴 오디오 볼륨 감소를 되돌릴 수 있습니다. (믹서 볼륨 조정으로도 해결할 수 있습니다.)
8.4.0
요구 사항 및 의존 항목 변경
이제 Windows 10 이상이 필요하며 Windows 7, 8, 8.1에서는 실행되지 않습니다.
Ubuntu 20.04를 대상으로 하며 Steam Linux Runtime의 "soldier" 버전도 대상으로 합니다.
32비트 ARM Linux용 빌드를 중단하여 Raspberry Pi 3와 매우 오래된 Chromebook의 지원이 종료됩니다. 32비트 ARM Android 빌드는 계속합니다. Raspberry Pi 같은 ARM Linux에서는 gles2 렌더러를 우선 사용합니다.
향후 16 KB 페이지 지원이 필수인 Android 기기를 위해 Android 버전을 16KB 페이지로 빌드합니다.
Python 3.12
모든 플랫폼에서 Python 3.12를 사용하여 지난 수년간의 개선을 이용할 수 있습니다. 전체 내용은 다음을 참조하세요.
눈에 가장 잘 띄는 변화 중 하나는 Python 오류의 위치를 줄 단위보다 더 세밀하게 알려 준다는 점입니다. Ren'Py는 이제 트레이스백에서 해당 줄 중 오류와 관련된 부분에 색을 입히거나 밑줄을 표시합니다.
성능 개선
스크립트 로드 기본값과 다른 데이터만 표현하도록 게임 스크립트 내부 형식을 바꾸어 메모리 사용량과 로딩 시간을 줄였습니다. 초기 시작에서 스크립트 로딩이 대부분을 차지하는 대형 게임은 스크립트 로딩 시간이 50% 개선되었습니다.
영구 데이터 영구 데이터 형식을 변경하여 방문한 스크립트 위치 전체 대신 해당 위치의 숫자 해시를 저장합니다. 이 해시는 훨씬 빠르게 저장하고 불러올 수 있으므로 영구 데이터가 클 때 게임 성능이 향상됩니다.
OpenGL 그리기 Ren'Py의 OpenGL 그리기 코드에서 행렬 객체 할당을 제거하고, 여러 상황에서 필요한 수학 연산의 양을 줄였습니다. 그리기 작업이 많은 장면은 CPU가 병목이 될 수 있으므로 이러한 장면의 성능이 개선될 수 있습니다.
마찬가지로 셰이더 변수가 들어 있는 딕셔너리를 반복 할당하지 않도록 개선했습니다.
Live2D 보이지 않는 레이어나 사용하지 않는 마스크의 Render를 만드는 불필요한 작업을 피합니다. 레이어가 많은 모델의 성능을 개선할 수 있습니다.
셰이더
GLSL 셰이더의 uniform 자료형으로 기존 float, vec2, vec3, vec4, mat2, mat3, mat4, sampler2D 외에 int, bool, ivec2, ivec3, ivec4, bvec2, bvec3, bvec4를 지원합니다.
스칼라와 벡터 uniform의 1차원 배열을 지원하지만 행렬이나 샘플러의 배열은 지원하지 않습니다.
모델에서 월드(u_model), 월드에서 카메라 뷰(u_view), 카메라 뷰에서 뷰포트(u_projection)로 가는 별도 행렬을 uniform으로 제공합니다. u_projectionview는 u_projection과 u_view를 합치며 기존 u_transform은 세 행렬을 모두 합친 것입니다. 분리된 행렬로 OpenGL 셰이더에서 조명을 구현할 수 있습니다.
uniform에 전달하기 전에 원본 데이터에 연산을 적용할 수 있습니다. RGBA uniform이 u_color이면 u_color__premul은 알파 채널을 미리 곱한 색입니다. 다른 접미사로 텍스처 해상도를 구하거나 행렬의 역행렬, 전치, 역전치를 계산할 수 있습니다.
Transform 안에서 sampler2D uniform을 지원합니다. 텍스처를 샘플링하도록 준비된 텍스처이며, 디스플레이어블 또는 디스플레이어블로 변환되는 문자열을 전달할 수 있습니다.
GLTF 모델 로드
Open Asset Importer 라이브러리로 GLTF 형식의 3D 모델을 로드하는 최소한의 기능을 제공합니다. GLTFModel 디스플레이어블로 로드합니다.
현재 GLTFModel은 모델의 메시와 텍스처만 로드합니다. 애니메이션이나 GLTF의 다른 기능은 지원하지 않습니다. 또한 Ren'Py의 기본 셰이더는 기본 색만 표시하므로, GLTF가 지원하는 물리 기반 렌더링(PBR)의 다른 부분을 처리하려면 사용자 지정 셰이더가 필요합니다.
게임에 3D 배경을 사용하려는 제작자에게 유용하지만 3D 공간에서 모델을 배치하려면 숙련된 개발자가 필요할 수 있습니다. 실험 결과와 개발 내용을 Ren'Py에 기여하려는 개발자를 위한 기능이기도 합니다. 향후 릴리스에서 3차원 객체를 다루는 도구를 더 제공할 예정입니다.
선택적 밉맵
밉맵은 이미지 축소 시 사용하는 작은 이미지입니다. 축소 시 계단 현상을 방지하지만 생성에 시간이 걸리고 메모리를 더 사용할 수 있습니다.
이제 밉맵 생성 여부는 게임에서 이미지를 축소할지 알고 있는 개발자가 결정할 수 있습니다. 기본적으로 Ren'Py는 로드하는 모든 이미지의 밉맵을 생성합니다. 새 모드에서는 화면이 가상 창 크기의 75% 미만으로 축소될 때만 밉맵을 생성합니다. 이미지 자체를 축소하지는 않지만 실제 창이 가상 창보다 작아질 수 있는 게임에 적합한 모드입니다.
새 모드를 활성화하려면 config.mipmap을 "auto"로 설정하세요.
Live2D나 GLTFModel용 이미지는 축소될 가능성이 높아 자동으로 밉맵을 생성합니다. Image()의 mipmap 매개변수에 True를 지정하면 특정 이미지에 생성할 수 있습니다.
라이브러리와 모드
외부 라이브러리와 모드를 각각 넣을 특수 디렉터리 game/libs와 game/mods를 지원합니다.
game/libs/libs.txt가 있으면 game/libs의 스크립트 경로에서 첫 디렉터리를 제거한 뒤(있는 경우) 해당 경로의 Unicode 순서로 로드합니다. 마찬가지로 game/mods/mods.txt가 있으면 그 디렉터리의 스크립트를 첫 디렉터리를 제외한 경로의 Unicode 순서로 로드합니다.
Ren'Py에서는 로드 순서의 중요도가 낮으며 주로 제작자 정의 문에서 사용합니다. 초기화 우선순위 권장 범위가 게임은 -99~99, 라이브러리와 모드는 -999~-100 및 100~999로 바뀌었습니다.
libs와 mods 디렉터리가 있으면 런처에 표시합니다. libs는 게임 생성 시 자동으로 만들며, 모드를 지원하려는 제작자는 mods를 직접 만들 수 있습니다.
외부 라이브러리와 모드의 배포를 쉽게 하기 위한 변경입니다. 사용자 스크립트에 병합하는 대신 game/libs 아래에 넣으면 모든 기능을 제공합니다.
libs 디렉터리에서는 .rpe와 .rpe.py도 검색합니다.
레이어 이미지
임의의 값을 받고 초기화 시에만 문자열로 평가하던 variant와 prefix는 이제 따옴표 없는 이미지 이름 구성 요소를 받습니다. 숫자, 문자, 밑줄을 쓸 수 있고 숫자로 시작해도 되지만 공백이나 하이픈은 안 됩니다.
at 키워드를 허용하는 곳에서 at transform: 블록도 허용합니다.
디스플레이어블이 필요한 곳에서 image: 블록으로 익명의 ATL 블록을 가진 image 문처럼 ATL 이미지를 정의할 수 있습니다.
새 when 속성은 더 직접적인 불리언 조건 구문으로 if_any, if_all, if_not을 대체합니다. 이전 속성은 호환성을 위해 계속 지원합니다. 새 구문에는 목록과 따옴표가 필요 없습니다. 다음을:
if_any ["a", "b"]
if_all ["c", "d"]
if_not ["e", "f"]
더 간결한 다음 구문으로 바꾸세요.
when (a or b) and c and d and not (e or f).
multiple 그룹을 익명으로 만들 수 있으며, 앞으로는 그룹 이름 자리에 multiple 키워드를 놓아 정의해야 합니다. 동작이 더 일관되고 이해하기 쉬워집니다. 이름 있는 multiple 그룹의 동작은 같지만 앞으로 사용하지 않는 것이 좋습니다.
attribute 문은 이제 variant를 받습니다. 단, variant가 있는 그룹 안에 있거나 디스플레이어블이 직접 지정된 경우는 제외합니다. 이전에 variant를 가진 multiple 그룹이나 attribute_function 조작이 필요하던 경우를 직접 지원합니다.
자동 오버샘플링
이미지의 오버샘플링 버전을 자동 검색하여 게임 확대 시 사용합니다.
예를 들어 "eileen happy.png"를 로드할 때 게임이 가상 크기의 100%보다 크게 확대되어 있으면 "eileen happy@2.png"도 찾아 있으면 로드합니다. 200%보다 크면 "eileen happy@4.png", "eileen happy@3.png", "eileen happy@2.png"를 찾습니다. 모두 없으면 "eileen happy.png"를 사용합니다.
Movie와 renpy.movie_cutscene()로 재생하는 동영상의 오버샘플링과 자동 오버샘플링도 지원합니다. 파일명 처리 방식은 이미지와 비슷합니다.
접근성
Shift+A 접근성 메뉴를 새로 디자인했습니다. 크기를 줄여 게임 아래쪽(대개 대사 포함)이 보이므로 변경 효과를 즉시 확인할 수 있습니다. 새 옵션을 추가할 수 있도록 여러 페이지로 나눴습니다.
오디오를 강제로 모노로 만들어 왼쪽이나 오른쪽 채널에만 있는 소리도 양쪽에서 들을 수 있습니다. Shift+A 접근성 메뉴, "force mono" Preference(), preferences.force_mono로 활성화합니다.
글꼴 커닝을 조정하는 환경설정을 추가했습니다. 접근성 메뉴, "font kerning" Preference(), preferences.font_kerning으로 제공합니다.
런처
게임을 접고 펼칠 수 있는 폴더로 정리할 수 있습니다. 프로젝트 디렉터리 아래에 디렉터리를 만들고 게임을 옮기세요.
런처의 “콘솔 출력(Console output)”이 Macintosh에서도 작동합니다.
업데이트를 빌드하면 이제 외부에 공개해도 되는 키 정보가 들어 있는 public_key.pem 파일을 생성합니다. 다운로더 게임을 만들 때는 이 파일을 다운로더 게임의 기본 디렉터리에 복사해야 합니다. 다운로드 검증에 사용할 공개 키입니다.
새 게임 생성 시 기본 제외 파일 목록이 있는 .gitignore를 포함합니다.
클릭할 파일과 디렉터리를 선택하도록 Ren'Py 런처를 사용자 지정할 수 있습니다.
텍스트
합자 등의 설정을 제어하는 OpenType 글꼴 레이아웃 기능을 지원합니다. font_features 스타일 속성과 features 태그로 제어합니다.
합자의 부호 위치 문제를 수정했습니다. 주로 아랍어에 영향을 주었지만 모든 텍스트에 적용됩니다. Harfbuzz 셰이퍼를 사용할 때만 제공되는 수정입니다.
config.rtl이 True일 때 방향 선호도를 지정하는 reading_order 속성을 추가했습니다. "wrtl"(약한 오른쪽→왼쪽)이면 방향 중립적인 줄을 오른쪽에서 왼쪽으로 표시합니다. 이전에는 항상 반대였습니다. RTL 게임과 번역의 문장 부호만 있는 대사를 주로 지원합니다.
마지막으로, 8.3.7에서 도입된 Harfbuzz 텍스트 셰이퍼의 양방향 텍스트 임베딩 처리 회귀 문제를 수정했습니다. LTR 문자 구간과 RTL 문자 구간이 섞인 텍스트는 이제 각 구간이 다시 올바른 방향으로 렌더링됩니다.
트레이스백 저장
처리되지 않은 예외가 발생하면 가능한 경우 게임 상태와 트레이스백을 저장합니다. 슬롯 이름은 _tracesave-1부터 _tracesave-10이며 JSON 메타데이터로 트레이스백에 접근할 수 있습니다.
새 renpy.get_save_data()로 저장 데이터를 불러오지 않고 슬롯의 데이터를 가져올 수 있습니다. 트레이스백 저장에서 오류 상태로 들어가지 않고 게임 데이터를 가져오는 데 활용할 수 있습니다.
기능
nearest가 문서대로 작동하여 False이면 최근접 이웃 텍스처 보간을 끌 수 있습니다.
새 HasSideImage()는 사이드 이미지가 확정되기 전에 존재 여부를 반환하므로 say 스크린 배치에 사용할 수 있습니다.
새 config.web_unload_music으로 점진적 다운로드에서 받은 음악을 메모리에서 해제할지 제어합니다.
새 config.clear_history_on_language_change으로 언어 변경 시 기록을 지울지 제어합니다.
MixerValue()가 step과 force_step을 지원합니다.
config.lint_show_names를 True로 설정하면 Lint 보고서에서 캐릭터 별칭을 이름으로 확장합니다.
config.voice_callbacks로 음성 재생과 정지 시 콜백을 정의합니다.
Grid가 채우기 순서를 제어하는 right_to_left와 bottom_to_top을 지원합니다.
Character의 ctc_position에 screen-variable을 추가했습니다. 진행 표시기를 스크린 변수에 넣어 스크린 안에 배치할 수 있습니다. 말풍선에서 말풍선 안에 진행 표시기를 배치하기 위한 기능입니다.
새 renpy.lex_string()으로 임의의 문자열에 대한 Lexer를 만들 수 있습니다.
SpriteManager와 SnowBlossom()에 다시 표시할 때 초기화를 방지하는 animation을 추가했습니다.
SnowBlossom()의 distribution으로 입자 생성 분포를 제어하여 화면 중앙이나 양쪽에 생성할 수 있습니다.
Gallery가 이미지 묶음 진입, 이미지 간 이동, 묶음 종료에 각각 별도 화면 전환을 지원합니다.
스크린 블록 첫 줄의 문자열을 Python 방식 독스트링으로 지원합니다. 직접 사용하는 기능은 없지만 renpy.get_screen_docstring()으로 원문을 가져올 수 있습니다.
Confirm과 renpy.confirm()이 _로 시작하지 않는 추가 키워드 인수를 confirm 스크린에 전달합니다.
스크린 언어의 use 문이 as 절을 받아 스크린의 main 변수를 가져올 수 있습니다. 디스플레이어블을 변수에 넣는 스크린 언어 디스플레이어블의 as 절과 비슷한 용도입니다.
사용자 정의 스크린 언어 문도 as 절을 지원합니다.
reset 트랜스폼은 이제 모든 Transform 속성을 재설정합니다.
Transform의 새 reset 속성은 사용 시 재설정할지, 같은 태그의 다른 트랜스폼에서 속성을 받을지 제어합니다.
새 renpy.seen_translation(), renpy.mark_translation_seen(), renpy.mark_translation_unseen()으로 번역을 본 적이 있는지 확인하고 표시할 수 있습니다.
오디오 파일명에 "<volume 0.5>sunflower-slow-drag.ogg" 같은 볼륨 절을 넣을 수 있습니다. play와 queue의 volume 절처럼 트랙의 상대 진폭을 설정합니다.
새 config.keep_screenshot_entering_menu로 메뉴 진입 시 FileTakeScreenshot의 스크린샷을 유지할지 정합니다.
thumb_offset에 바 양쪽의 서로 다른 오프셋을 튜플로 지정할 수 있습니다. 새 thumb_align은 손잡이와 바의 정렬을 제어합니다.
input의 arrowkeys는 방향키를 입력 커서 이동에 쓸지 디스플레이어블 사이의 포커스 이동에 쓸지 제어합니다.
config.translate_additional_strings_callbacks로 게임이 외부 라이브러리나 데이터 파일의 문자열 등 번역 파일에 넣을 추가 문자열을 제공할 수 있습니다.
___()(밑줄 세 개) 함수로 문자열을 번역한 뒤 그 결과에 텍스트 보간을 적용할 수 있습니다. 보간은 이 함수를 호출한 범위에서 수행합니다. 또한 밑줄 세 개 함수는 내부에 지정된 문자열을 번역 대상으로 표시합니다.
config.persistent_callback으로 로드한 영구 데이터를 갱신할 수 있습니다. 이 릴리스부터 새 영구 데이터의 persistent._version은 현재 게임 버전으로 설정됩니다. 콜백과 함께 데이터 이전에 활용할 수 있습니다.
변경 사항
renpy.get_renderer_info()는 가능한 경우 사용자 GPU와 그래픽 드라이버 정보가 담긴 딕셔너리를 반환합니다.
Lint가 번역 함수 _(), __(), ___(), _p()의 잘못된 인수 수를 보고합니다.
game/에서 Python 모듈을 로드하면 __file__에 상대 경로를 설정합니다.
같은 Live2D를 여러 레이어나 여러 태그, 또는 둘 다 사용하여 표시할 수 있습니다.
Transform에 function 호출 전 자식을 나타내는 original_child 속성을 추가했습니다.
왼쪽이나 위쪽 패딩이 있을 때 mesh_pad의 동작을 바꿨습니다. 이전에는 자식을 패딩만큼 이동했지만 이제 같은 위치에 두고 왼쪽과 위쪽에 패딩을 더합니다.
Python typing 모듈의 Callable, Any, Self, Literal, cast, overload, final, override를 네임스페이스에 가져옵니다. Ren'Py 예약 이름이 되므로 새 프로젝트에서 이름으로 사용하면 안 됩니다.
“call에 from 추가(Add From to Calls)”가 작동하지 않던 회귀 문제를 수정했습니다.
웹에서는 자동 음성을 미리 로드하여 기기에 완전히 캐시되지 않아도 즉시 재생되도록 합니다.
텍스트 입력(renpy.input()과 input)에서 필수가 아닌 합자를 꺼 커서 이동 시 합자 형태가 바뀌지 않도록 합니다.
자동 진행 모드에서는 화면 보호기와 그에 따른 시스템 절전 진입을 막습니다.
레이블을 정의하는 제작자 정의 문은 실행 시 config.label_callbacks를 호출합니다.
일부 웹 플랫폼의 "Click to play the video." 스크린을 번역할 수 있습니다.
플레이어가 대사를 넘기면 유지된 말풍선의 CTC 표시기를 제거합니다.
일부 상황에서 float, int, bool, complex, str, bytes와 다른 불변 튜플 등 불변 값으로 된 튜플을 재사용하여 메모리와 성능을 개선합니다. 이전에는 달랐던 불변 튜플의 객체 식별성이 같아질 수 있습니다.
이제 기본적으로 화면이 가상 창의 .75 미만으로 축소될 때만 텍스처 밉맵을 만듭니다. 이미지를 축소하지 않는 게임에 적합합니다. 다시 활성화하려면 config.mipmap을 True로 설정하세요.
없던 파일이 생겨도 이제 자동 다시 로드를 하지 않습니다. 이전 동작은 상황마다 달랐고 존재하지 않는 파일을 검색하느라 시간이 들었습니다.
같은 번역 식별자의 문을 본 적이 있으면 해당 대사도 본 것으로 간주합니다.
크기를 줄이기 위해 읽은 대사와 번역 목록에 문 이름이나 번역 ID의 64비트 정수 해시를 저장합니다.
show expression이 바뀌어 show expression "bg washington"은 show bg washington과 같습니다. 이전에는 표현식을 태그로 사용하여 대부분 잘못된 결과를 냈습니다. 문자열 대신 디스플레이어블을 주면 태그를 생성합니다.
웹에서 renpy.emscripten은 emscripten 모듈이므로 import 없이 사용할 수 있습니다. 사용 전에는 여전히 renpy.emscripten이 참인지 확인해야 합니다.
config.nearest_neighbor가 true이면 이미지 글꼴을 기본 양선형 대신 최근접 이웃 방식으로 확대합니다.
“이미지 속성(Image Attributes)” 스크린에 레이어의 트랜스폼 적용 여부도 표시합니다. 다른 방식으로는 알아보기 어려울 수 있기 때문입니다.
새 libs 디렉터리에서도 .rpe와 .rpe.py를 검색합니다.
renpy.get_renderer_info()에 GPU 제조사, 기기 이름, 드라이버 버전도 포함됩니다.
8.3.7 / 7.8.7
Live2D
페이드아웃 시간이 0인 Expression이 제대로 숨겨지지 않던 문제를 수정했습니다.
Live2D 클리핑 마스크 크기를 잘못 정하던 문제를 수정했습니다. 클리핑 레이어에만 영향을 주어 주로 눈이 사라지는 현상으로 나타났습니다.
Live2D 페이드에 Cubism Native SDK처럼 코사인 이징을 사용합니다.
아랍어 텍스트 형태 처리
(Harfbuzz 텍스트 셰이퍼가 필요하므로 Ren'Py 8에서만 사용할 수 있습니다.)
config.rtl이 True이고 Harfbuzz가 활성화되면 아랍어 표시형을 원래 문자로 되돌려 Harfbuzz가 전체 형태를 처리합니다. 표시형을 직접 포함하지 않고 합자로 구현하는 글꼴도 사용할 수 있습니다.
Harfbuzz의 세로 위치 조정 문제를 수정했습니다. 합자가 텍스트의 세로 배치를 제어하는 경우 위치가 개선됩니다. 일부 아랍어 글꼴에 영향을 주는 수정이지만, 다른 글꼴에서도 부호의 위치가 개선될 수 있습니다.
변경 사항
renpy.register_shader()의 정점 및 프래그먼트 함수를 셰이더 변수 뒤에 배치하여 함수에서 uniform을 사용할 수 있습니다.
느리게 표시하는 텍스트에 삽입된 디스플레이어블(특히 nestled 진행 표시기)의 시간 기준이 텍스트 블록 표시 시점에서 해당 요소가 나타나는 시점으로 바뀌었습니다. CTC 애니메이션의 첫 프레임이 항상 보입니다.
수정 사항
새로 만든 최대화 창의 위치를 더 이상 변경하지 않습니다.
오디오 채널을 두 번 이상 등록할 때 생기던 문제를 수정했습니다.
동시 대사 say 문도 다른 say 문처럼 이미지 속성을 포함할 수 있습니다. 임시 이미지 속성은 동시 대사 묶음의 마지막 say 문에서만 지원합니다.
Ren'Py 8.0과 8.1로 만든 게임은 원래의 컴파일 방식과 같도록 from __future__ import annotations를 적용합니다.
SpriteManager가 트랜스폼처럼 내부 상태를 유지하는 디스플레이어블 인스턴스를 병합하지 않습니다. 조금 덜 효율적이지만 더 올바른 동작입니다.
게임 시작이나 불러오기 시 언어를 설정하여 translate python 블록을 항상 게임 컨텍스트에서 실행합니다.
텍스트 셰이더가 slow_cps_multiplier를 반영합니다.
8.3.6 / 7.8.6
수정 사항
일부 저장 파일을 불러오지 못하게 하던 변경을 되돌렸습니다.
8.3.5 / 7.8.5
변경 사항
사용 중인 OpenDyslexic 버전의 일부 키릴 문자가 잘못되어 접근성 모드에서 키릴 문자에 이 글꼴을 사용하지 않습니다.
텍스트 배치 시 끝에 있지 않은 nestled CTC는 크기 0으로 간주하여 텍스트가 튀는 현상을 막습니다.
nestled CTC가 있는 텍스트를 배치할 때 extend를 고려합니다.
모달 스크린은 숨기기 시작하면 모달 상태가 해제됩니다.
외곽선이 있는 텍스트에 적용한 경우뿐 아니라 모든 텍스트 셰이더에 가상 글리프를 생성합니다.
빈 창 표시 시 동시 대사를 고려합니다.
arm-linux에서는 OpenGL이 있어도 기본 렌더러로 Gles2를 사용합니다.
기본 디렉터리에 no_launcher_links.txt가 있으면 외부 사이트 직접 링크가 부적합한 환경을 위해 런처의 모든 renpy.org 링크를 끕니다.
이미지맵의 디스플레이어블을 렌더링할 때 화면 전체 공간을 제공합니다. 이전에는 크기가 정의되지 않았습니다.
itch butler 도구를 itch의 새 CDN에서 다운로드합니다.
수정 사항
MoveTransform의 움직이지 않는 자식을 감싸 자식의 시간 흐름이 일관되게 유지되도록 했습니다.
말풍선 편집기 표시 중 다시 로드할 때의 충돌을 수정했습니다.
텍스트 셰이더에서 모든 외곽선 오프셋을 표시합니다.
웹에서 오디오 필터 변경 시 충돌하던 문제를 수정했습니다.
번역 디렉터리의 글꼴이 game 디렉터리의 글꼴을 대체할 수 있습니다.
웹 동영상 재생 중 충돌을 수정했습니다.
텍스트에 삽입된 디스플레이어블에 올바른 마우스 좌표를 전달합니다.
8.3.4 / 7.8.4
수정 사항
문자열 보간 시 len 같은 Python 내장 함수를 항상 사용할 수 있습니다.
문서대로 애니메이션 프리스플래시가 정적 프리스플래시보다 우선합니다.
뷰포트와 Drag 디스플레이어블의 드래그 관련 문제를 여러 건 수정했습니다.
컨텍스트에서 채널로 돌아올 때 동영상을 멈춥니다.
자동 저장이 상호 작용을 다시 시작하여 성능을 떨어뜨리던 문제를 수정했습니다.
nvl hide에서 이전 창 종류를 사용합니다.
키보드 포커스를 지원하지 않는 디스플레이어블은 포커스 계산에서 무시합니다.
입력 내용이 공백일 때 Input 마스킹이 잘못되던 문제를 수정했습니다.
창이 비어 있으면 Android와 iOS 키보드가 나타나지 않던 문제를 수정했습니다.
이미지 캐시 관리가 잘못될 수 있던 문제를 수정했습니다.
7.8.3의 잘못된 빌드로 웹 버전이 정상 작동하지 않던 문제를 수정했습니다.
기타 변경 사항
이미지맵 디스플레이어블에 임의의 크기 대신 (config.screen_width, config.screen_height) 픽셀을 제공합니다. 이미지에는 영향이 없겠지만 다른 요소의 동작이 일관됩니다.
드물게 발생하던 ATL "update" 이벤트를 제거했습니다.
새 renpy.get_statement_name()은 현재 Ren'Py 문의 이름을 반환합니다. config.statement_callbacks에 전달하는 이름과 같습니다.
SpriteManager를 현대화하여 저장할 수 있습니다.
8.3.3 / 7.8.3
수정 사항
빈 마스킹 입력에 마스크 글리프 하나가 나타나지 않습니다.
Movie의 image나 show_image가 트랜스폼이면 표시할 때마다 재설정합니다.
config.nvl_adv_transition이 대사 창을 강제로 숨기지 않습니다.
첫 렌더링 전 상호 작용이 재시작되어도 다른 스크린에서 사용하는 스크린을 올바르게 갱신합니다.
achievement.steam.get_session_ticket()이 문서대로 작동합니다.
다시 로드 직후 오디오 필터 변경을 적용합니다.
config.skip_sounds가 문서대로 작동합니다.
텍스처가 없을 때 Model이 문서대로 메시를 만듭니다.
이미지 속성 스크린에서 이미지와 디스플레이어블 이름에 따옴표를 붙입니다.
롤백 시 음악이 다시 시작되지 않던 문제를 수정했습니다.
Harfbuzz 형태 처리에서 밑줄과 취소선이 끊어지지 않습니다.
게임 시작 시 프리스플래시 창 대신 기본 창에서 IME를 활성화합니다.
키보드나 컨트롤러로 조절해도 바의 selected_hover 접두사가 유지됩니다.
픽셀 단위 텍스트 배치의 반올림 오류를 수정했습니다. 디졸브 중 텍스트가 1 픽셀 이동할 수 있었습니다.
드물게 사용하는 gl_anisotropic이 작동합니다.
keyboard_focus_insets가 문서대로 작동합니다.
bar_invert가 작동하지 않을 수 있던 반올림 문제를 수정했습니다.
box_wrap이 True이면 디스플레이어블을 다시 렌더링하여 두 번째 줄에 올바른 공간을 제공합니다. 드물게 배치가 달라질 수 있습니다.
컨트롤러 이벤트도 default_focus 디스플레이어블에 포커스를 줄 수 있습니다. 이전에는 포커스 시스템이 입력으로 인식하지 않았습니다.
버튼으로 채운 뷰포트의 드래그 처리 문제를 여러 건 수정했습니다.
Drag 안에 드래그 가능한 뷰포트를 넣어 창을 더 직접적으로 구현할 수 있습니다.
기타 변경 사항
Android 번들에 fast-follow 대신 install-time 에셋 팩을 사용하여 실행 시 모든 에셋을 사용할 수 있도록 합니다.
AlphaMask는 표시할 때마다 마스크 트랜스폼을 다시 시작합니다.
0 픽셀 크기로 축소한 디스플레이어블에는 포커스가 가지 않습니다.
_renpysteam.keyboard_mode의 "always"를 지원하지 않습니다. 지정하면 "once"를 사용하여 필요할 때 플레이어가 Steam Deck 키보드를 명시적으로 요청해야 합니다.
컴포지터에 프레임이 제때 전달되도록 절전 모드 진입 전 렌더링 파이프라인에 보내는 프레임 수를 12로 늘렸습니다.
이미지 캐시 잠금을 줄여 이미지 로드 시 일부 프레임 저하를 방지합니다.
명시적으로 요청하지 않으면 movie 채널에서 오디오/동영상 시작을 동기화하지 않습니다.
반복 Movie가 표시되던 지점으로 롤백하면 멈췄던 반복 동영상을 다시 재생합니다.
Movie는 연결 채널의 모든 동영상이 아니라 자신이 재생한 동영상만 멈춥니다.
renpy.set_audio_filter()에서 immediate가 false이면 불확실한 미래 시점 대신 대기 파일 재생 시 필터를 적용합니다.
Frame을 더 이상 픽셀에 맞추어 조정하지 않아 시각적 오류를 방지합니다.
외곽선이 있는 텍스트에 텍스트 셰이더를 사용하면 각 줄의 시작과 끝을 덮는 가상 글리프를 만들어 외곽선이 표시되도록 합니다.
8.3.2 / 7.8.2
수정 사항
8.3.1과 7.8.1의 Android 빌드 문제로 정상 시작되지 않아 게임을 플레이할 수 없던 문제를 수정했습니다.
8.3.1 / 7.8.1
수정 사항
이미지 키워드(zorder, behind, at, onlayer, transform)는 at 뒤 목록 같은 표현식 안에 올 수 없습니다.
{shader} 태그에서 지역 셰이더 변수를 이름으로 사용할 수 있습니다.
매우 큰 크기나 많은 문자에도 텍스트 셰이더가 작동합니다.
Lint가 파일이 아닌 항목을 파일로 검사하지 않습니다.
show_done 캐릭터 콜백을 호출하고 문서화했습니다.
웹 버전은 화면이 .33초 동안 유휴 상태이면 영구 데이터를 저장합니다.
생성된 index.html에서 웹 빌드의 game.zip 경로를 설정할 수 있습니다.
웹 버전에서 FS.syncfs 호출을 지연시켜 빠른 파일명 변경으로 생기던 오류를 방지합니다.
기본적으로 music 같은 반복 채널에서만 오디오 시작을 동기화합니다. renpy.music.register_channel()에 synchro_start를 전달하여 채널별 기본값을 바꿀 수 있습니다.
기타 변경 사항
새 renpy.stop_skipping()은 일반 및 빠른 건너뛰기를 취소합니다.
일반 건너뛰기 중 빠른 건너뛰기를 시작하거나 그 반대로 하면 건너뛰기가 취소됩니다.
PC에서 URL을 열면 전체 화면을 해제합니다.
부모 기준 음수 오프셋에 배치된 디스플레이어블도 클립 사각형을 벗어나지 않는 한 올바르게 자릅니다.
AudioData가 동영상과 <from 1.0 to 6.0> 같은 꺾쇠 속성을 명시적으로 지원합니다.
접근성용 새 글꼴 트랜스폼을 정의하는 config.font_transforms를 문서화했습니다.
Character의 multiple 인수를 캐릭터 콜백에 전달합니다.
8.3.0 / 7.8.0
오디오 필터
오디오 채널 출력을 처리하는 오디오 필터 시스템을 추가했습니다. webaudio 기반이며 다음 필터를 제공합니다.
Biquad: Lowpass, Highpass, Notch, Peaking, Lowshelf, Highshelf, Allpass 필터를 구현합니다.
Comb: 필터링과 피드백이 있는 지연선입니다.
Delay: 피드백 없는 지연선입니다.
Mix: 두 오디오 스트림을 혼합합니다.
Sequence: 여러 필터를 적용합니다.
WetDry: 원음과 효과음 비율을 조절하여 필터링합니다.
Reverb: 인공 잔향을 적용합니다.
텍스트 셰이더
이 릴리스에서는 텍스트 셰이더를 지원합니다. 렌더링 시스템이 제공하는 정보를 사용하여 텍스트에 적용하는 OpenGL 셰이더입니다. 가장 큰 장점은 Ren'Py가 텍스트를 천천히 나타내는 방식을 다른 방식으로 바꿀 수 있다는 것입니다. 예를 들어 dissolve 텍스트 셰이더는 문자를 한꺼번에 표시하는 대신 왼쪽에서 오른쪽으로 서서히 나타나게 합니다.
알파 채널을 포함한 텍스트 색을 처리하고 위치도 조절할 수 있습니다. 예를 들어 jitter는 텍스트를 이리저리 흔듭니다.
{shader} 태그, textshader 스타일, config.default_textshader로 적용합니다. 한 텍스트 블록에서는 셰이더 사용 여부를 통일해야 하며 혼합은 지원하지 않습니다.
renpy.register_text_shader()로 사용자 지정 텍스트 셰이더를 지원합니다. 텍스트 표시에 맞는 새 uniform과 attribute를 사용할 수 있습니다.
기타 셰이더 변경
셰이더 부분 간 변수 충돌을 피하는 셰이더 부분 지역 변수를 사용할 수 있습니다. 주로 텍스트 셰이더에 쓰지만 모든 셰이더에서 지원합니다.
새 config.shader_part_filter로 사용할 셰이더 부분을 걸러 내어 필요에 따라 부분을 켜고 끄는 환경설정을 구현할 수 있습니다.
모델 uniform u_drawable_size와 u_virtual_size를 추가하여 셰이더의 gl_Positions를 Ren'Py 다른 부분의 좌표로 더 쉽게 투영합니다.
Visual Studio Code
Ren'Py Language Visual Studio Code 확장을 이제 Ren'Py 프로젝트에서 관리합니다. Visual Studio Code가 설치되어 있으면 런처에서 새 확장 설치를 안내합니다.
런처 변경
스크립트 탐색(Navigate Script)의 TODOs 버튼 옆에 개수를 표시합니다.
스크립트 탐색(Navigate Script)의 파일 보기에서 체크박스로 번역 파일을 걸러 낼 수 있습니다.
window 문 변경
window 문이 다음과 같이 바뀌었습니다.
window show와window hide는 자동 창 관리를 끄지 않고 창을 즉시 표시하거나 숨기기만 합니다.새
window auto False로 자동 창 관리를 끄고window auto True로 다시 켭니다. (기존window auto도 작동하지만window auto True를 권장합니다.)
자동 창 관리를 끄지 않고 효과 연출용으로 창을 숨길 수 있게 하여 window hide를 더 유용하게 만드는 것이 목적입니다.
window hide 뒤의 window show는 이전 say 문 대신 다음 say 문을 보고 표시할 창 종류를 정합니다.
스크린샷과 페이퍼 돌
스크린샷 촬영 시 notify 스크린을 숨겨 이전 스크린샷 경로가 다음 촬영에 노출되지 않도록 합니다. config.pre_screenshot_actions로 제어합니다.
새 renpy.render_to_file()과 renpy.render_to_surface()로 레이어 이미지 같은 디스플레이어블 트리를 포함하여 디스플레이어블을 캡처하고 파일이나 pygame_sdl2 Surface로 저장할 수 있습니다.
Steam
Steam 지원을 최신 Steam DLL로 업데이트했습니다.
Steam 게임 녹화의 타임라인을 지원합니다. config.automatic_steam_timeline이 기본값 true이면 save_name과 메뉴/플레이 상태를 타임라인에 반영합니다. achievement.steamapi.add_timeline_event로 추가 이벤트를 넣을 수 있습니다. (호출 전 achievement.steam이 None이 아닌지 확인하세요.)
래핑한 Steamworks API 메서드를 도전 과제 페이지에 문서화했습니다.
Android
Android 15(API 수준 35)를 대상으로 하지만 Android 5까지도 작동할 수 있습니다.
기능
새 anymod keysym 접두사로 meta, alt, ctrl 조합 키를 무시하고 키에 바인딩할 수 있습니다.
Shift+D로 여는 번역 식별자 스크린을 번역 정보 스크린으로 변경했습니다. 이제 실행 중인 줄에 관한 정보도 포함합니다. 언어가 선택되어 있으면 번역 대상 줄과 번역 중인 say 문의 텍스트도 표시합니다.
제작자 정의 문이 ATL 블록을 받아 execute에 ATL 트랜스폼 키워드 인수로 전달할 수 있습니다. 선택적으로 ATL 블록이나 스크립트 문 블록을 받는 문도 정의할 수 있습니다.
renpy.display_menu()에 메뉴 인수를 전달할 수 있고, 새 renpy.Choice로 각 선택지에도 인수를 전달합니다.
말풍선 레이어를 bubble.layer와 bubble.retained_layer로 제어합니다.
다른 say, menu, call screen 문 실행 시 유지된 말풍선을 자동 제거합니다. bubble.clear_retain_statements로 제어합니다.
최상위나 레이어에 적용 중인 화면 전환을 반환하는 renpy.get_ongoing_transition()을 추가했습니다.
config.translate_ignore_who로 번역에서 특정 캐릭터를 무시할 수 있습니다.
Hide와 renpy.hide_screen()에 immediately를 추가하여 스크린의 on hide 처리를 막을 수 있습니다.
캐릭터 콜백에 표시 중인 대사 줄과 그 구간 정보를 제공합니다.
renpy.call_in_new_context()와 renpy.invoke_in_new_context()의 선택적 _clear_layers로 새 컨텍스트 진입 시 비울 레이어를 제어합니다.
믹서 기본 볼륨을 preferences.volume.<mixer>의 default 문으로 설정합니다. 예를 들어 music은 default preferences.volume.music = 0.5입니다. 제작자 정의 믹서도 지원합니다. 믹서 기본값을 참조하세요.
ui.adjustment의 새 raw_changed는 범위 제한 전의 adjustment와 새 값을 받습니다. 스크롤이 범위를 벗어나면 액션을 수행하는 데 활용합니다.
행렬을 비선형으로 변환하는 SplineMatrix를 추가했습니다.
Input의 action은 입력 활성 상태에서 Enter를 누르면 실행할 액션입니다.
루비/후리가나 텍스트의 color를 None으로 설정하여 부모 색을 상속할 수 있습니다.
Transform의 fps로 내부 시간을 특정 초당 프레임 수에 맞게 양자화합니다.
해당하는 BarValue에 min과 max를 추가하여 0으로 시작하지 않는 범위를 정의할 수 있습니다.
기타 변경 사항
스크린샷 촬영 전에 알림 스크린을 숨깁니다.
crop은 자를 대상보다 커도 항상 자르기 상자 크기를 사용합니다.
hspace와 vspace 텍스트 태그가 창 배율을 반영합니다.
Lint가 폐기된 이미지 조작기를 보고합니다.
renpy.open_file()은 encoding이 None이면 io.BufferedReader를 반환하여 .peek을 사용할 수 있습니다.
config.renpy_base와 프로젝트 game 디렉터리의 .rpe.py를 로드하여 게임 시작 전에 실행합니다.
프로젝트 game 외에 config.renpy_base에서도 .rpe를 로드합니다.
빌드에서 .rpe와 .rpe.py 파일을 제외합니다.
디렉터리 단위로 이미지 오버샘플링을 지정할 수 있습니다.
ATL 극좌표에서 음수 반지름을 지원합니다.
디스플레이어블 검사기(Shift+Alt+I)에 ID가 있으면 표시합니다.
디스플레이어블의 id 필드에 스크린 언어에서 지정한 ID를 저장합니다. 새 config.clear_log로 시작할 때마다 대사 로그(config.log)를 비울지 제어합니다.
__로 시작하는 이름을 문자열 안에서도 변형하여 치환에 사용할 수 있습니다. 대부분 별도 조치 없이 작동하지만 영향은 호환되지 않는 변경 사항을 참조하세요.
renpy.fetch()에 사용자 지정 HTTP/HTTPS 요청 헤더를 전달할 수 있습니다.
값을 설정하는 BarValue(DictValue, FieldValue, VariableValue, ScreenVariableValue, LocalVariableValue 등)에 min과 max를 추가하여 바의 끝값을 직접 지정합니다.
keyboard_focus_insets로 키보드 포커스 계산 시 버튼 크기를 인위적으로 줄여 겹침을 제거하므로 겹치는 버튼도 탐색할 수 있습니다.
renpy.music.play()에 설명된 synchro_start의 기본값이 해당 함수와 play에서 True가 되었습니다. 동기화 시작 구현을 더 이해하기 쉽게 바꿨으며 대부분의 동작은 같습니다.
웹에서 동영상 서버가 허용하면 게임과 다른 출처의 동영상을 로드할 수 있습니다.
8.2.3 / 7.7.3
8.2.2와 7.7.2가 올바르게 빌드되지 않던 문제를 수정했습니다.
8.2.2 / 7.7.2
접근성
터치스크린에서 큰 ⋀ 제스처로 접근성 메뉴를 엽니다. 누른 상태로 오른쪽 위로 크게 이동한 다음 오른쪽 아래로 크게 이동하고 손을 떼세요.
Android와 iOS에서 제한적인 자동 읽기를 지원합니다. 주로 터치 포커스 특성으로 제약됩니다. 대사와 포커스된 인터페이스를 읽지만 현재는 요소를 실행하지 않고 포커스하기가 어렵습니다.
NVL 모드와 창
window auto와 nvl, 특히 config.nvl_adv_transition과 config.adl_nvl_transition의 상호 작용을 개선했습니다. 창을 이미 표시하거나 숨겼으면 해당 전환이 발생하지 않아 중복 상호 작용을 막습니다.
드물게 쓰는 nvl hide와 nvl show가 이제 window auto 플래그를 설정하여 창을 연속으로 두 번 표시하지 않습니다.
수정 사항
Android에서 창 포커스를 잃으면 멈출 수 있던 문제 두 가지를 수정했습니다.
renpy.alt()의 force가 문서대로 작동합니다.
xfill과 yfill로 창 크기가 줄어들지 않습니다.
줄 높이가 잘못된 글꼴이 Harfbuzz에서 작동하지 않던 문제를 수정했습니다.
문자열 보간 안에서 목록 슬라이싱을 허용합니다. 예를 들어 The first ten are: [long_list[:10]]가 작동합니다.
_ren.py 파일의 문자열도 번역을 생성합니다.
도전 과제 이름이 문자열인지 검사합니다.
Ren'Py 7의 weakref 피클링 문제를 수정했습니다.
rpy 문은 항상 도달 가능한 것으로 간주합니다.
런처가 실행 중에 무음 스트림을 재생하지 않습니다.
작은 게임을 Android App Bundle로 빌드할 때 fast-forward 패키지가 잘못 포함되던 문제를 수정했습니다.
기타
중국어 번체 및 간체 번역을 업데이트했습니다.
디스플레이어블에 기본 포커스를 지정하면 hovered 처리를 실행합니다.
Live2D의 attribute_filter를 항상 실행합니다.
sound 채널도 music처럼 16ms 동안 페이드아웃합니다.
같은 모델을 쓰되 default_fade가 다른 Live2D 두 개를 사용할 수 있습니다.
새 config.log_events로 디버깅용 pygame 방식 이벤트 기록을 제어합니다.
새 config.python_exit_callbacks에 종료 직전 Python 모듈을 정리할 콜백 목록을 지정합니다.
이미지 이름이 없을 때 예외를 발생시킬지 경고를 표시할지 정하는 config.raise_image_exceptions를 문서화했습니다.
config.raise_image_load_exceptions는 이미지 로드 실패 시 예외를 발생시킬지 경고를 표시할지 제어합니다.
플레이어가 오류를 무시하면 config.raise_image_load_exceptions와 config.raise_image_exceptions를 False로 설정합니다.
config.log_event가 true이거나 RENPY_LOG_EVENTS 환경 변수가 있으면 대부분의 pygame 수준 이벤트를 기록합니다.
renpy.filter_text_tags() 등 텍스트 태그 필터링에서 axis를 올바르게 처리합니다.
문 콜백 시스템(config.statement_callbacks)을 문서화했습니다.
renpy.mode, config.mode_callbacks 등의 모드 시스템을 문서에서 제외했습니다. 사용한 게임이 거의 없을 것으로 보이며 config.statement_callbacks로 대체되었습니다. 모드 콜백은 작동하지만 새 게임에 사용하지 마세요.
8.2.1 / 7.7.1
텍스트
Harfbuzz 셰이퍼가 Harfbuzz에서 더 많은 정보를 읽습니다. 대체로 결과는 같지만 밑줄 위치가 조금 달라지는 등의 차이가 있습니다.
Harfbuzz 세로쓰기를 수정하여 올바르게 배치합니다. freetype으로 이식할 수 없어 freetype 셰이퍼의 세로쓰기 지원은 중단합니다.
자세한 내용은 vertical을 참조하세요.
업데이터
Windows에서 업데이트 서명에 실패하던 문제를 수정했습니다.
웹 서버가 identity 인코딩을 사용하도록 하여 호환성을 개선합니다. 요청에 10초 이내 응답하지 않으면 시간 초과로 처리합니다.
Live2D
Live2D 텍스처 크기를 자동 추정하여 라이브러리의 최대 텍스처 크기를 조정합니다.
Live2D 표시 시 많은 텍스처 렌더링 작업을 생략합니다.
Fetch
renpy.fetch()가 상호 작용 밖뿐 아니라 이미지 단계와 상호 작용 중에도 작동합니다.
renpy.fetch()의 params로 URL에 추가할 매개변수를 지정합니다.
기타 변경 사항
{w}로 텍스트 상자를 교체하면 hide 대신 replaced 이벤트를 생성합니다.
default_focus가 설정된 요소를 추가하면 키보드나 게임패드 사용 시 상호 작용 재시작 없이도 포커스됩니다.
rapt(Android 지원) 없이 명령줄에서 iOS 앱을 빌드할 수 있습니다.
이름을 바꾸고 문서화한 config.max_texture_size로 최대 텍스처 크기를 설정합니다. 2D에는 유용하지 않지만 Model 텍스처에는 의미가 있을 수 있습니다.
템플릿 프로젝트에 표준 프로젝트와 같은 파일이 모두 있을 필요가 없습니다.
기타 수정 사항
Android에서 일시 중단 후 재개하면 검은 화면이 나올 수 있던 문제를 수정했습니다.
Linux 등 허용하는 플랫폼에서는 이름에 :가 있는 디렉터리에서도 실행됩니다.
config.layer_transforms 사용 시 camera나 show layer at의 시간 흐름을 재설정하지 않습니다.
LayeredImage에 미설정 변수를 사용해도 Lint가 충돌하지 않습니다.
blur가 0보다 작을 때 값을 제한하여 충돌을 막습니다.
드래그 때문에 저장할 수 없던 문제를 수정했습니다.
8.2.0 / 7.7.0
Harfbuzz 통합
텍스트 형태 처리에 Harfbuzz를 사용합니다. 모든 Ren'Py 버전에서 freetype 자동 힌터에 추가 정보를 제공합니다.
Ren'Py 8에서는 Harfbuzz로 텍스트 형태도 처리합니다. 글리프의 문맥과 지정된 텍스트 언어에 따라 글리프를 재정렬하고 선택합니다. 브라흐미계나 인도계 문자처럼 복잡한 형태 처리가 필요한 문자 체계를 지원하려면 이 기능이 필요합니다. (해당 언어를 지원하는 글꼴을 제공해야 합니다.)
새 shaper로 사용할 셰이퍼를 제어하여 이전 버전과 호환할 수 있습니다.
가변 글꼴
Ren'Py는 이제 OpenType 가변 글꼴을 지원합니다. 하나 이상의 가변 축을 사용하여 글꼴의 렌더링 형태를 바꾸는 글꼴입니다. 예를 들어 글꼴에 굵기를 제어하는 "weight" 축과 너비를 제어하는 "width" 축이 있을 수 있습니다.
가변 글꼴에는 Ren'Py 8과 Harfbuzz 셰이퍼가 필요합니다.
가변 글꼴 지원을 위해 instance와 axis 스타일 속성, instance와 axis 텍스트 태그, renpy.variable_font_info()를 추가했습니다.
자세한 내용은 가변 글꼴 문서를 참조하세요.
글꼴 힌팅
새 hinting 모드 "auto-light"는 세로 방향에만 자동 힌팅을 적용합니다.
새 config.font_hinting으로 글꼴별 힌팅을 켜고 스타일로 사용 위치별 힌팅을 제어할 수 있습니다. 예를 들어:
define config.font_hinting["MyFont.tff"] = "bytecode"
MyFont.ttf에 바이트코드 힌팅을 활성화합니다.
텍스트 보간 개선
문자열 보간을 단순 필드가 아닌 Python 표현식으로 처리합니다. 같지는 않지만 Python f-string 사용자에게 익숙한 개념입니다. 간단한 로직을 직접 넣을 수 있습니다.
default exp = 1000
label start:
e "제 레벨은 [exp // 225]이에요!" # Will show "I am level 4!"
변수를 문자열에 보간할 때 interpolation 네임스페이스가 있으면 그곳에서 값을 찾습니다. 예를 들면 다음과 같습니다.
define t = "표시되지 않습니다."
define interpolate.t = "표시됩니다."
label start:
e "[t]" # Will show "Shown."
말풍선 개선
Ren'Py 8.1에서 추가한 말풍선 기능에 말풍선을 유지하는 새 방식을 도입했습니다. 모션 코믹스의 대사처럼 말풍선이 하나씩 나타나며, 명시적으로 지울 때까지 화면에 계속 표시됩니다. 자세한 내용은 말풍선 문서를 참조하세요.
새 bubble.properties_callback에 화자의 이미지 태그에 따라 말풍선 속성 이름 목록을 거르는 함수를 지정하여 특정 캐릭터 전용 말풍선을 만들 수 있습니다.
여러 변경을 통해 말풍선 표시와 숨기기를 애니메이션하는 트랜스폼을 적용할 수 있습니다. 말풍선 스크린에 예제가 있습니다.
위치 자료형과 ATL 보간
linear 1. xpos .6 같은 ATL 보간(텍스트 보간과는 무관함)에서 서로 다른 자료형의 위치 사이도 보간할 수 있습니다. 이전에 문서에서 금지하고 작동하지 않던 다음이 가능합니다.
transform mixed:
xycenter (520, 300)
easein 3. align (.0, .0)
label muxed:
show a at Transform(pos=(.5, .6))
"..."
show a at Transform(pos=(520, 150))
이 새 기능을 구현하면서 위치 자료형에 position을 추가했습니다. 디스플레이어블의 위치나 크기를 지정할 때 절대 성분과 상대 성분을 함께 제공할 수 있습니다. 예를 들어 xsize position(-10, .5)를 지정하면 제공된 가로 공간의 절반에서 10 픽셀을 뺀 너비를 사용합니다.
개발자 도구
런처 환경설정의 옵션에 “스플래시 화면 건너뛰기(Skip splashscreen)”를 추가했습니다. 선택하면 실행한 게임의 splashscreen 레이블을 건너뜁니다.
Shift+D 개발자 메뉴에 “파일명과 줄 표시(Show Filename and Line)”를 추가했습니다. 현재 문의 파일명과 줄 번호를 표시하며 클릭하면 가능할 경우 기본 편집기의 해당 줄을 엽니다.
데이터 액션
데이터 액션을 더 간결하게 설명합니다. 작업을 나타내는 데이터 관리자(Set-, Toggle-, Cycle-, Increment-)와 대상 종류를 나타내는 접근자(-Variable, -ScreenVariable, -LocalVariable, -Field, -Dict)로 다시 구현했습니다.
새 관리자는 두 가지입니다.
Cycle- 액션(CycleVariable, CycleLocalVariable, CycleField 등)은 값 목록을 받아 실행할 때마다(버튼을 클릭할 때마다) 대상을 목록의 다음 값으로 설정합니다.
Increment- 액션(IncrementVariable, IncrementDict, IncrementField 등)은 대상에 지정한 값(기본값 1)을 더합니다. 감소에도 사용할 수 있습니다.
기능의 완결성을 위해 LocalVariableValue와 LocalVariableInputValue를 추가했습니다.
HTTPS/HTTP 요청
새 renpy.fetch로 HTTPS/HTTP Fetch를 개선했습니다. 데스크톱과 모바일에서는 Requests도 계속 지원하며 내부적으로 사용합니다. 새 fetch의 기능은 다음과 같습니다.
HTTPS와 HTTP URL의 GET, POST, PUT 요청을 지원합니다.
웹 플랫폼 규칙 안에서 웹에서도 가져올 수 있습니다.
다운로드 중 게임을 막지 않습니다.
바이트나 JSON으로 인코딩 가능한 객체를 데이터로 받습니다.
바이트, 문자열, JSON에서 디코딩한 객체로 반환할 수 있습니다.
접근성
스크린 언어의 새 group_alt는 관련 디스플레이어블 그룹에서 처음 하나를 읽을 때 읽을 문구를 지정합니다.
새 extra_alt는 ? 키를 누르면 읽을 추가 설명을 지정합니다.
자식에서 더 구체적인 값을 재정의하지 않으면 두 속성 모두 상속됩니다.
새 renpy.alt()로 자동 읽기 시스템에서 텍스트를 읽을 수 있습니다.
Python의 __future__
Ren'Py의 Python 코드에 __future__ 컴파일러 지시문을 전달할 수 있습니다. 적용할 .rpy 파일 맨 위에 rpy python xxx를 쓰며 xxx는 future 기능 이름입니다. 예를 들면 다음과 같습니다.
rpy python annotations
번역 개선
대부분의 대사에서 번역 지원 객체 수를 3분의 1로 줄여 시작 시간과 메모리 사용량을 줄입니다.
필요할 때까지 번역 로딩을 미룰 수 있어 게임이 크고 언어가 많으면 시작 시간이 개선됩니다.
기본적으로 꺼져 있습니다. 활성화 방법과 주의 사항은 번역 지연 로딩을 참조하세요.
scene, show, hide 화면 전환
scene, show, hide 문 뒤에 with 문이나 window show 전환이 없으면 자동으로 화면 전환을 적용하는 기능입니다.
새 _scene_show_hide_transition으로 제어하며 scene, show, hide 뒤의 자동 화면 전환에 설명합니다.
Android
Android 빌드 시스템을 최신 Gradle과 Android Gradle Plugin으로 업데이트했습니다. 따라서 최신 장기 지원 버전인 Java 21을 지원하며 필수로 요구합니다.
2GB보다 큰 게임을 Android나 iOS 기기에 다운로드할 수 있도록 Ren'Py의 여러 부분을 변경했습니다. 사용 방법은 대용량 모바일 게임용 다운로더에 설명되어 있습니다. 기본적으로 게임 두 개를 만듭니다. 하나는 기기에 처음 다운로드할 매우 짧은 게임이고, 다른 하나는 짧은 게임을 실행할 때 기기에 다운로드할 큰 게임입니다.
Android의 사용자 표시 버전은 이제 build.version을 사용하며 기본값은 config.version입니다.
rapt/prototype에 넣은 에셋을 빌드 프로젝트에 포함합니다.
Android 출력 파일명에 버전을 넣어 빌드를 구별하기 쉽게 했습니다.
웹
웹 전체 화면 진입 방식을 바꾸어 데스크톱 및 모바일 브라우저 호환성을 개선했습니다.
시작 시 투명 div로 게임을 덮어 브라우저가 클릭을 감지하고 소리 재생을 허용하도록 합니다. 클릭을 게임에 전달하고 감지가 끝나면 div를 숨깁니다.
웹에서도 HTTPS/HTTP Fetch를 지원하여 다른 웹 페이지와 같은 CORS 규칙 아래 HTTP/HTTPS 요청을 보낼 수 있습니다.
업데이터
Ren'Py 업데이터를 새 형식으로 다시 작성하고 Ren'Py만으로 구현했습니다. 더 많은 웹 호스트와 호환되며 처음으로 https를 지원합니다.
업데이터는 처음 실행할 때 서명 키를 만들고, 그 키로 생성된 업데이트에 서명합니다. 업데이트를 실행할 때도 해당 키로 확인합니다. 따라서 안전한 업데이트를 만들기 위해 추가 작업을 할 필요가 없습니다.
번역
런처와 The Question의 덴마크어 번역을 추가했습니다.
그 밖의 여러 번역을 업데이트했습니다.
기능
새 config.layer_transforms로 각 레이어나 config.layers의 전체 조합에 적용할 트랜스폼 목록을 제공합니다.
새 Continue가 마지막 저장을 불러옵니다. 기본적으로 자동 및 빠른 저장도 포함합니다. 특히 선형 비주얼 노벨에서 메인 메뉴의 이어하기에 사용합니다.
새 ruby_line_leading은 루비(후리가나)가 있는 줄에 추가하는 행간을 제어하며 보통 line_leading보다 공간을 적게 사용합니다.
Preference()에 "reset"을 전달하여 환경설정을 기본값으로 초기화할 수 있습니다.
기본 네임스페이스의 새 defaultdict는 collections.defaultdict와 비슷하지만 롤백을 지원합니다.
새 MultiRevertable로 롤백 가능한 객체이면서 list, set, dict 같은 롤백 가능한 자료구조인 클래스를 정의합니다.
새 config.pass_controller_events와 문서화한 config.pass_joystick_events로 컨트롤러와 조이스틱 이벤트에 직접 접근합니다.
새 renpy.get_screen_variable과 renpy.set_screen_variable로 특히 Action 하위 클래스에서 스크린 변수에 접근할 수 있습니다.
새 build.time에 게임 빌드 시각을 저장합니다.
새 build.info로 빌드 시 정보를 저장하고 배포 게임에서 읽습니다.
프리스플래시의 왼쪽 위 픽셀이 투명하면 1비트 투명 창에 표시합니다.
새 EditFile()로 편집기에서 파일의 특정 줄을 열려고 시도합니다.
Image()의 새 dpi로 SVG 가상 dpi를 설정합니다.
새 CopyToClipboard()로 텍스트를 클립보드에 복사합니다.
새 renpy.confirm()으로 Python에서 확인 스크린을 사용합니다.
새 renpy.reset_all_contexts()는 스택의 모든 컨텍스트를 없애고 다음 문에서 계속하는 새 컨텍스트를 만듭니다. 불러오기나 오류 시 게임 전체 초기화에 사용합니다.
새 renpy.last_say()로 마지막 say 문 정보를 반환합니다.
새 iap.request_review()로 Google Play와 Apple App Store의 게임 리뷰를 요청합니다.
새 gui.history_spacing은 새 게임의 기록 항목 간격을 제어합니다.
nw에 자동으로 대사를 넘기기 전 기다릴 초를 지정할 수 있습니다. "{w=2}{nw}"를 "{nw=2}"로 쓸 수 있습니다.
Movie의 keep_last_frame이 true이면 반복하지 않는 동영상 종료 후 마지막 프레임을 표시합니다.
jump expression에 ".local_name" 형식의 지역 레이블을 쓸 수 있습니다. 이전에는 "global_name"이나 "global_name.local_name"만 허용했습니다.
제작자 정의 스크린 언어 문이 다른 스크린 언어 문의 모든 속성을 복사할 수 있습니다.
새 renpy.invoke_in_main_thread()로 Python 스레드에서 메인 Ren'Py 스레드의 함수를 호출합니다. (대부분의 Ren'Py 함수는 메인 스레드에서만 호출할 수 있습니다.)
런처 변경
런처는 이제 템플릿 프로젝트를 지원합니다. 기본 GUI를 대체하는 프로젝트를 위한 기능입니다. 새 프로젝트 생성 시 템플릿 프로젝트를 선택하면 Ren'Py가 해당 프로젝트를 복사하고 이름과 번역을 갱신합니다. 그 밖의 스크립트 파일과 이미지는 변경하지 않습니다.
일부 화면에 더 많은 옵션을 표시하면서 번역 공간을 확보하도록 여백을 줄여 런처를 조금 바꿨습니다.
명령줄에서 프로젝트를 빌드하는 명령줄 인터페이스를 문서화했습니다.
기타 변경 사항
nearrect의 preferred_side로 위아래 외에 좌우도 지정합니다. 공간 부족으로 반대편을 쓰면 새 invert_offsets가 오프셋을 반전합니다.
스크린에 적용된 hide와 replace 트랜스폼 이벤트는 같은 스크린을 다시 표시해도 항상 끝까지 실행됩니다. 따라서 say나 bubble 스크린처럼 즉시 다시 표시될 수 있는 스크린에도 트랜스폼 이벤트를 사용할 수 있습니다.
fixed, hbox, vbox, side, grid, viewport, vpgrid 등의 컨테이너가 hover, idle, insensitive, selected_hover, selected_idle을 자식에게 전달하여 버튼의 자식도 자체 트랜스폼으로 반응할 수 있습니다.
persistent._clear()가 영구 변수를 설정하는 default를 다시 실행하여 완전히 미초기화 상태가 되지 않도록 합니다.
focus_mask의 투명도 검사는 불투명 픽셀의 경계 상자 안에서만 GPU를 사용하여 일부 상황의 성능을 개선합니다.
Ren'Py는 이제 모든 플랫폼에서 기본적으로 GL2 렌더러를 사용하며 config.gl2 변수를 무시합니다. 이전 GL 렌더러에는 있지만 GL2에는 없는 문제들 때문입니다. 매우 오래된 하드웨어에서는 여전히 Shift+G를 누르고 직접 활성화하여 GL 렌더러를 사용할 수 있습니다.
PC(Windows, Mac, Linux)에서는 창 이동 시 위치를 저장합니다. 다음 조건이면 재실행 시 복원합니다.
사용자 모니터 배치가 바뀌지 않았습니다.
창 전체가 모니터 안에 들어갑니다.
그렇지 않으면 기본 모니터 중앙에 놓습니다.
Steam Deck 등의 컨트롤러 B는 이제 게임 메뉴 표시/숨기기입니다. 버튼의 보조 기능을 선택하던 기존 동작은 X로 옮겼습니다.
Android와 iOS에서 기본값이 아니던 하드웨어 동영상 재생 경로를 제거했습니다. 일부 형식만 지원하여 2020년부터 기본값이 아니었습니다.
Ren'Py는 이제 angle과 anchorangle 속성에 지정한 각도를 0도 이상 360도 미만으로 제한합니다. 0은 포함하고 360은 포함하지 않습니다. 이전에는 범위 밖 각도의 동작이 정의되지 않았지만, 이제는 해당 범위로 제한됩니다. 360도 변화는 더 이상 움직임을 일으키지 않고 0도 변화로 처리됩니다.
ATL의 angle과 anchorangle에 방향이 없으면 0을 지나더라도 가장 짧은 호를 사용합니다.
빈 ATL 블록이면 오류를 발생시킵니다. 예를 들어 show eileen happy: 뒤에 들여쓴 줄이 없는 경우입니다.
RTL 언어 배치에 유용하도록 box_reverse를 두 가지 면에서 바꿨습니다.
box_reverse에서 역순이 아니라 스크린의 나열 순서대로 공간을 제공하므로 일부 크기가 달라질 수 있습니다.box_wraphbox는 아래→위 대신 위→아래로,box_wrapvbox는 오른쪽→왼쪽 대신 왼쪽→오른쪽으로 줄바꿈합니다.
자동 다시 로드 시 해당 파일의 디렉터리와 모든 상위 디렉터리에서 git 잠금 파일을 확인합니다. git 작업이 끝나 잠금이 제거될 때까지 기다립니다.
지원하지 않던 색 공간 변환이 있는 AV1 동영상의 충돌을 수정하여 정상 재생합니다.
Ren'Py 8에 websockets를 포함하여 데스크톱과 모바일에서 해당 API에 연결할 수 있습니다. 웹은 제외합니다. Python 3이 필요하여 Ren'Py 7에는 포함하지 않습니다.
8.1.3 / 7.6.3
변경 사항
macOS에서 config.gl2를 true로 취급합니다. 최신 macOS의 창 크기 변경 수정이 gl에는 없고 gl2에만 있기 때문입니다.
Windows와 Linux의 동영상 MMX 가속을 다시 켰습니다.
Steam Deck 키보드의 표시 방식을 변경했습니다. 텍스트 입력이 표시될 때 키보드를 한 번 띄웁니다. 기본 위치는 화면 위쪽이며 한 번만 표시됩니다. 예를 들어 Steam 버튼을 눌러 키보드를 숨겼다면 플레이어가 Steam+X를 눌러 다시 표시해야 합니다. Steam Deck 관련 문제를 우회하기 위한 변경입니다.
Ren'Py 7에 32비트 Windows Live2D 라이브러리를 설치합니다. 받으려면 Live2D를 재설치해야 할 수 있습니다.
수정 사항
"K_r" 대신 "r" 같은 텍스트 keysym에 바인딩하지 못하던 문제를 수정했습니다.
문서를 여러 곳 수정했습니다.
게임 시작 시 롤백이 작동하지 않던 문제를 수정했습니다.
8.1.2 / 7.6.2
변경 사항
문서를 여러 곳 개선했습니다.
renpy.classify()의 디렉터리는 이제 /로 끝나지 않는 패턴에도 일치합니다. 예를 들어 "renpy.app"은 renpy.app 디렉터리와 일치합니다.
ATL이 깊은 비교로 트랜스폼의 계속/재시작을 판단합니다. 사용하는 전역 변수가 바뀌면 다시 시작합니다.
뷰포트가 드래그 포커스를 얻어도 자식 스타일은 바뀌지 않습니다. 거의 사용되지 않았으며 스타일 변경으로 드래그가 느려지거나 실패할 수 있었습니다.
불러오기는 마지막 사용자 상호 작용 문 다음 문으로 롤백합니다. 이전에는 현재 문의 시작으로 돌아갔습니다. 다른 롤백과 동작을 맞춥니다.
_autosave가 종료나 선택 메뉴의 강제 자동 저장보다 우선합니다.
런처에서 프로젝트를 실행할 때 환경의 PYTHON* 변수를 걸러 냅니다.
자동 읽기 알림 창이 사라져도 가능한 한 알림 전체를 읽습니다.
자동 읽기에서 가까운 스크린을 먼 스크린보다 먼저 읽습니다.
Frame()의 프레임은 가로세로 최소 1 픽셀입니다.
renpy.pause()가 스크린의 call과 jump로 롤포워드할 수 있습니다.
웹의 "display" : "window" 환경설정이 전체 화면을 끕니다.
마우스 버튼에 건너뛰기를 바인딩할 수 있습니다.
수정 사항
웹의 전체 화면 진입 문제를 수정했습니다.
Ren'Py 경로가 Windows 시스템 인코딩으로 표현되지 않아도 Ren'Py 8 런처에서 게임을 실행합니다.
game/의 Python 가져오기를 개선하여 PEP 302를 더 잘 준수합니다.
GamepadExist()가 문서대로 작동합니다. 수정에 따라 개발자 모드의 도움말에 게임패드 스크린도 표시됩니다.
스크린 중첩 컴프리헨션 분석을 수정하여 default 변수를 사용할 수 없던 상황을 해결했습니다.
애니메이션 중 상호 작용이 다시 시작되어도 뷰포트 관성을 유지합니다.
play와 renpy.music.play()의 if_changed가 반복 여부를 고려하고 유지합니다.
Linux의 VS Code 실행을 수정했습니다.
Ren'Py 7 웹 버전의 여러 충돌을 수정했습니다.
동영상 함수는 재생 전 채널 존재를 확인하여 저장 파일에서 Movie를 로드할 때의 문제를 해결할 수 있습니다.
8.1.1 / 7.6.1
Android
Android 키 생성 시 APK와 Play Bundle에 같은 키를 사용합니다. 새 게임에서는 별도 키가 필요 없습니다. (기존 게임은 별도 키를 유지합니다.)
Google Play 번들의 APK가 키 불일치로 거부된다는 보고가 있었습니다. 이전 Ren'Py가 번들에 APK 키를 사용한 것이 원인이며 해결법은 호환되지 않는 변경 사항에 있습니다.
수정 사항
"system cursor" Preference()가 config.mouse만 끄던 것에서 config.mouse_displayable에도 적용됩니다.
웹 오디오가 종료 시간을 지속 시간이 아닌 시각으로 처리합니다.
오디오 볼륨과 패닝이 롤백에 참여하지 않던 문제를 수정했습니다.
필요한 속성이 모두 없어도 Live2D 이미지를 선택하던 문제를 수정했습니다.
동영상의 시작, 종료, 반복 시간 지원을 복원했습니다.
이미지맵의 이미지가 상수가 아니면 핫스폿도 상수가 될 수 없습니다.
macOS의 크기 조절 불가능 창 문제를 수정했습니다.
font 디렉터리의 글꼴 Lint 문제를 수정했습니다.
object 상속 클래스가 더 이상 상속하지 않게 바뀌면 일부 경우 충돌했습니다. 이제 오류로 진단하며 config.ex_rollback_classes로 억제할 수 있습니다. 개발자에게만 표시하고 그 밖에는 조용히 무시합니다.
기타 변경 사항
동기화 스크린에 sync 접두사 스타일을 사용하여 스크린 편집 없이 기본 외형을 바꿀 수 있습니다.
텍스트 편집이 불가능하면 입력기를 꺼 공백을 사용하는 입력기가 켜져 있어도 Space로 게임을 진행할 수 있습니다.
ATL 전환이 애니메이션 시간 기준을 사용합니다. 대체로 같지만 상호 작용 재시작 시 전환이 잘못 다시 시작되던 문제가 해결됩니다.
환경설정 자체의 기본값을 없애 모든 항목을 default로 바꿀 수 있습니다.
절대 픽셀 수를 나타내는 absolute() 자료형은 이제 정수나 실수와 수학 연산을 수행해도 결과가 절대값으로 유지되도록 보장합니다. absolute에 연산을 적용했을 때 잘못된 자료형이 생성되어 배치 문제가 생기던 여러 상황을 해결합니다.
Live2D가 attribute_filter 평가 후 모션을 확인하며 새 모션이 있으면 이전 모션을 유지하지 않습니다.
8.1 / 7.6
문서 개선 및 수정
변경 이력에 나열하지 않은 내용을 포함하여 문서를 많이 개선하고 수정했습니다.
다크 모드를 포함한 새 문서 테마를 적용했습니다.
Ren'Py Sync
Ren'Py 프로젝트가 운영하는 서버로 기기 간 저장 파일을 쉽게 옮기는 새 기능입니다. 외출 전 컴퓨터에서 “동기화 업로드(Upload Sync)”를 눌러 저장을 올리고 짧은 코드를 받습니다. 휴대전화 게임에서 “동기화 다운로드(Download Sync)”를 선택하고 코드를 입력하면 이동 중에도 계속 플레이할 수 있습니다.
개인정보를 고려하여 저장을 암호화하고 게임 제목은 해시만 전송합니다.
새 UploadSync와 DownloadSync로 활성화합니다.
말풍선 대사
Ren'Py에 새 말풍선 대사 시스템을 추가했습니다. 만화 같은 말풍선 안에 대사를 표시하는 종합적인 시스템입니다. 말풍선 위치를 옮기고 외형을 대화형으로 변경하는 편집기도 포함합니다.
기존 게임에는 파일과 스크립트를 추가해야 합니다. 필요한 변경은 말풍선 문서를 참조하세요.
플랫폼 개선
웹
Ren'Py 8.1로 브라우저 게임을 만들 수 있습니다. 웹에서는 Python 3.11을 사용하며 다른 모든 플랫폼은 3.9를 사용합니다.
Ren'Py 8.1에서는 브라우저 안에서 실행되는 프로그레시브 웹 앱을 만들 수 있습니다. 브라우저와 플랫폼에 따라 웹 게임을 네이티브 애플리케이션과 비슷한 방식으로 기기에 설치할 수 있습니다. 다른 플랫폼에서는 웹 앱을 홈 화면에 고정할 수 있습니다.
새 "web cache preload" Preference()를 켜면 서버의 모든 데이터를 기기에 다운로드합니다. 온라인에서는 확인 후 필요할 때만 새 데이터를 받고, 오프라인에서는 받은 데이터를 사용합니다.
웹에서 브라우저가 지원하는 동영상을 재생할 수 있습니다.
Macintosh
Intel과 Apple Silicon에서 모두 네이티브 실행되는 유니버설 바이너리를 사용합니다.
Android
Android에서 android.keystore와 bundle.keystore 파일을 rapt 디렉터리 대신 프로젝트의 기본 디렉터리에서 찾도록 변경했습니다. 프로젝트마다 다른 키로 빌드할 수 있으며, 여러 Android 버전에서 같은 키를 사용하도록 보장하는 데도 도움이 됩니다.
새 “키 생성(Generate Keys)”을 누를 때 이전 키스토어가 있으면 프로젝트로 복사할지 묻습니다.
설정 파일을 .android.json에서 android.json으로 바꿨습니다. 이전 파일이 있으면 자동 생성합니다.
고정 레이어
고정 레이어에 태그를 표시하면 숨기거나 다른 고정 레이어에 표시할 때까지 해당 태그의 기본 레이어로 취급합니다.
따라서 기본 레이어 이외의 고정 레이어에 태그를 표시하면 이후 show나 say로 속성을 갱신할 때 레이어를 다시 지정할 필요가 없습니다.
다음 예제는 eileen의 기본 레이어가 master이고 near가 고정 레이어라고 가정합니다.
show eileen onlayer near
eileen happy "안녕하세요!" # will now work, where previously it would not
show eileen excited # implicit onlayer near
hide eileen # implicit onlayer near
show eileen # implicit onlayer master, eileen's default
기본적으로 master와 renpy.add_layer()로 만든 레이어는 고정됩니다. 새 sticky=False를 전달하면 제외합니다.
분리 레이어와 Layer 디스플레이어블
분리 레이어는 장면에 자동 추가되지 않는 제작자 정의 레이어입니다. 대신 다른 레이어에 표시할 수 있는 새 Layer로 표시합니다.
이 기능을 도입한 주요 이유 중 하나는 태그 그룹에 셰이더나 다른 트랜스폼 효과를 적용하면서도 show와 say 문 같은 시스템을 정상적으로 사용할 수 있게 하기 위해서입니다. 또한 같은 레이어를 여러 번 표시할 수 있습니다. 예를 들어 반사 효과나 같은 채널을 표시하는 여러 TV에 활용할 수 있습니다.
일반 레이어와 장면 구성 방식이 달라 add_layer() 대신 config.detached_layers에 직접 정의하며 항상 고정 레이어입니다.
새 이미지 형식과 오버샘플링
두 가지 새 이미지 형식을 지원합니다.
AV1 Image File Format(AVIF)은 최신 압축으로 JPEG, PNG, WebP보다 작은 파일을 만듭니다. 많은 경우 화질 저하 없이 크기를 줄일 수 있습니다.
SVG는 웹에서 사용하는 벡터 그래픽 형식입니다. Ren'Py는 SVG 기능 중 일부를 포함하는 SVG 파일을 지원합니다. (특히 SVG 안의 텍스트는 지원하지 않습니다.) 게임 크기를 조절하면 텍스트와 비슷하게 SVG를 자동으로 오버샘플링하거나 언더샘플링하여 모든 해상도에서 선명하게 유지합니다. 따라서 선명도를 유지해야 하는 인터페이스 요소에 SVG가 적합합니다.
이 Ren'Py 릴리스에서는 PNG, JPEG, WebP, AVIF 같은 래스터 이미지의 오버샘플링도 지원합니다. 파일명에 @와 숫자를 넣어 지정합니다. 예를 들어 "eileen happy@2.png"는 2배로 오버샘플링됩니다. 따라서 코드를 최소한으로 수정하면서 게임의 리마스터 버전을 더 쉽게 만들 수 있습니다. 지금은 폐기되었지만 이전 게임에 흔히 쓰인 이미지 조작기도 오버샘플링 이미지를 지원합니다.
래스터 이미지를 오버샘플링하면 파일을 전체 해상도로 로드하되, 오버샘플링 배율만큼 작은 이미지로 취급합니다. 예를 들어 1000x1000 이미지를 2배 오버샘플링하면 배치할 때는 500x500 이미지로 취급합니다. 게임을 확대하면 전체 이미지 데이터를 사용할 수 있어 선명도를 유지할 수 있습니다.
새 config.physical_width와 config.physical_height를 함께 사용하면 배치 변경 없이 게임 해상도를 높일 수 있습니다.
AV1 동영상
WEBM과 MKV 컨테이너의 최신 AV1을 지원합니다. 이전 최선의 코덱 VP9과 같은 화질에서 약 30% 작습니다.
AV1 디코딩에는 더 많은 CPU가 필요합니다. VP9을 원활하게 재생하던 일부 하드웨어도 AV1은 어려울 수 있습니다.
오디오
믹서는 이제 오디오 장비나 컴퓨터의 볼륨 조절처럼 데시벨 단위의 출력을 사용합니다. 빈 믹서 슬라이더는 최대 볼륨보다 -40 dB 낮은 값을, 가득 찬 바는 최대 볼륨인 0 dB를 나타냅니다. 따라서 믹서가 더 역동적으로 작동합니다. 이전에는 슬라이더를 맨 아래에 가깝게 내려야 효과가 뚜렷했지만, 이제는 사람이 소리 크기를 느끼는 방식에 맞춰 볼륨이 증가하고 감소합니다.
config.default_music_volume, config.default_sfx_volume, config.default_voice_volume는 0.0=-40 dB, 1.0=0 dB 척도를 사용합니다. SetCharacterVolume()과 새 preferences.set_mixer(), preferences.get_mixer()도 같습니다.
오디오 페이드인과 페이드아웃 함수도 출력을 기준으로 동작합니다. 따라서 끝부분에서만이 아니라 페이드 전체 과정에서 변화를 느낄 수 있습니다. 매우 짧은 페이드도 허용하도록 구현을 다시 작성했습니다. 이전에는 페이드 시간이 너무 짧으면 오류가 발생했습니다.
config.fade_music에서 이름을 바꾼 config.fadeout_audio는 정지나 play로 변경할 때 기본 페이드아웃을 제어합니다. queue에는 사용하지 않습니다. 기본값 0.016초로 갑작스러운 정지의 튀는 소리를 없앱니다.
패닝(renpy.music.set_pan())이 일정 출력을 사용하여 패닝해도 볼륨이 바뀌지 않습니다.
드래그 가능한 뷰포트
내부 버튼 등에 포커스가 있어도 뷰포트를 드래그할 수 있습니다. 드래그를 감지하면 포커스를 뷰포트로 옮겨 이동합니다.
viewport와 vpgrid의 draggable에 "touch" 같은 스크린 변형을 지정할 수 있습니다. 이 경우 터치가 활성화되었을 때만 드래그됩니다.
_ren.py 파일: Python으로 작성하는 Ren'Py
새 _ren.py 형식은 유효한 Python 파일에 Ren'Py 스크립트를 넣습니다. 예를 들어:
"""renpy
init python:
"""
flag = True
다음과 같습니다.
init python:
flag = True
Python이 많은 스크립트를 Python 전용 도구로 편집하면서 Ren'Py 스크립트로 실행하는 것이 목적입니다.
상수 스토어
이름 있는 스토어의 _constant를 true로 설정하면 상수 스토어가 됩니다. 변수는 저장되지 않고 해당 스토어에서만 접근 가능한 객체는 롤백하지 않습니다.
롤백 지원에는 스토어와 변수마다 작은 오버헤드가 있습니다. 상수 스토어는 이를 없앨 수 있습니다.
기본적으로 다음 스토어가 상수입니다.
_errorhandling _gamepad _renpysteam _sync _warper audio achievement build director iap layeredimage updater
상수 스토어 변수는 초기화 중에만 변경하고 초기화가 끝나면 바꾸지 않아야 합니다.
겹낫표 루비 텍스트
발음이나 번역을 위해 본문 위에 작은 글씨로 쓰는 루비 텍스트를 이제 전각 겹낫표(【】)로 감싸 작성합니다. 전각/반각 세로줄(| 또는 |)로 아래 본문과 위 루비를 구분합니다. 예를 들면 다음과 같습니다.
e "루비는 후리가나를 표기하는 데 쓸 수 있어요(【東|とう】 【京|きょう】)."
e "번역을 표시하는 데도 쓰여요(【東京|도쿄】)."
일부 문맥에서는 【가 루비 시작으로 해석되지 않게 "【【"로 두 번 써야 합니다. 예를 들면 다음과 같습니다.
e "【【이것은 | 루비 텍스트가 아닙니다.】"
접근성
새 config.tts_substitutions로 자동 읽기 치환 규칙을 제공하여 음성 합성기가 잘못 발음하는 단어를 조절할 수 있습니다.
예를 들어:
define config.tts_substitutions = [
("Ren'Py", "Ren Pie"),
]
자동 읽기에서 "Ren'Py"를 항상 "Ren Pie"로 발음하게 합니다.
자동 읽기가 voice 볼륨 믹서를 반영합니다.
저장 토큰 보안
저장 파일을 기기 간 옮길 때 토큰으로 경고하여 보안 문서에 설명한 실수를 막습니다.
이 기능은 컴퓨터에서 Ren'Py를 처음 실행할 때 토큰을 생성하는 방식으로 작동합니다. 토큰은 저장 파일과 영구 데이터에 포함됩니다. 저장 파일에서 다른 컴퓨터의 토큰을 발견하면 사용자에게 경고하고 계속할지 묻습니다. 사용자가 계속하기를 선택하면 그 컴퓨터에서 온 모든 저장 파일을 자동으로 수락할지도 묻습니다.
현재 컴퓨터나 승인한 토큰의 컴퓨터에서 온 영구 데이터만 로드합니다.
저장 토큰을 지원하는 Ren'Py 버전으로 게임을 처음 실행하면 해당 게임의 기존 저장 파일을 모두 확인합니다. 토큰이 없는 파일에는 토큰을 추가합니다. 따라서 Ren'Py 8.1/7.6 이상으로 업그레이드할 때 확인 질문이 나타나는 것을 방지할 수 있습니다.
사용자에게 가능한 한 보안 문제를 알려야 하므로 의도적으로 끄는 방법은 제공하지 않습니다.
새 검색 경로
game에서 못 찾으면 오디오는 game/audio, 글꼴은 game/fonts에서 찾습니다. 이미지는 계속 game/images에서 찾지만 다른 파일은 그곳에서 찾지 않습니다.
새 3D 스테이지 속성
3D 스테이지에 영향을 주는 새 속성이 있습니다.
point_to카메라가 바라볼 지점을 선택하거나 스프라이트가 지점 또는 카메라를 바라보게 합니다.
xrotate,yrotate,zrotate지정 축을 중심으로 스프라이트나 카메라를 회전합니다.
orientation구면의 최단 경로로 세 축을 동시에 회전합니다.
Live2D
Live2D Cubism Editor 4.2의 새 기능을 지원합니다. 사용하려면 Cubism 4 SDK for Native R6_2 이상이 필요합니다.
x86_64 Android에서 Live2D를 지원합니다.
Live2D.blend_opacity로 update_function에서 모델 불투명도를 변경합니다.
런처 및 엔진 번역
가능한 경우 기계 번역으로 런처와 엔진의 문자열을 갱신하여 수년간 갱신되지 않은 번역을 업데이트했습니다.
개선하려면 launcher/game/tl/language의 .rpy를 편집하여 보내 주세요. “Automatic translation” 줄은 제거하세요.
자동 업데이트한 언어는 다음과 같습니다.
핀란드어
프랑스어
독일어
그리스어
인도네시아어
이탈리아어
일본어
한국어
폴란드어
포르투갈어
러시아어
중국어 간체
튀르키예어
우크라이나어
다음 번역은 직접 업데이트했습니다.
프랑스어
포르투갈어
스페인어
일본어
우크라이나어
충돌하는 속성
xalign과 pos, 또는 ycenter와 yanchor처럼 충돌하는 속성을 동시에 설정한 동작은 원래 정의되지 않았습니다. 실제 동작은 버전마다, 특히 Python 2와 3 사이에서 달라졌습니다.
새 config.check_conflicting_properties로 충돌 감지 시 오류를 발생시킵니다. 이전 기본 input의 실수 때문에 새 프로젝트에만 켜져 있지만, 모든 프로젝트에서 True로 정의하고 드러난 충돌을 모두 고친 뒤 계속 True로 둘 것을 강하게 권장합니다.
그 밖의 새 기능
input에서 여러 줄을 입력할 수 있습니다.
새 JSONDB로 스크립트와 함께 보관할 JSON 파일에 데이터를 저장합니다. 말풍선 정보가 사용 사례입니다.
새 areapicker로 도구에서 플레이어가 화면 영역을 선택하게 할 수 있습니다.
Movie의 group을 지원합니다. 같은 그룹의 다른 Movie가 직전 프레임에 표시되었고 현재 Movie가 시작되면 이전 Movie의 마지막 이미지를 표시하여 동영상 스프라이트를 매끄럽게 전환합니다.
새 config.file_slotname_callback으로 슬롯 이름 생성 방식을 바꿉니다. DLC 여부별 접두사 등에 사용할 수 있습니다. 새 autosave_prefix_callback으로 자동 저장에도 비슷한 접두사를 지정합니다.
개발자 메뉴(Shift+D)에 영구 데이터 보기 도구를 추가했습니다.
인터랙티브 디렉터에서 이미지 속성을 제거하는 문을 만들 수 있습니다.
show screen, hide screen, call screen이 expression, as, onlayer, zorder, with를 받습니다. show와 hide의 해당 절과 뜻이 같습니다.
renpy.include_module()로 rpym의 init 블록을 게임의 나머지 블록 사이에 우선순위에 맞게 끼워 넣어 로드합니다.
새 "voice after game menu"는 게임 메뉴 표시 후 음성을 계속 재생할지 제어합니다.
제작자 정의 문에서 default와 같은 시점에 함수를 실행할 수 있습니다. 초기화 후 게임 시작 전, 불러오기, 롤백 후, Lint 전과 기타 가능한 시점입니다.
새 config.after_default_callbacks로 default 실행 직후 콜백을 실행합니다.
인터랙티브 디렉터에서 속성 이름을 오른쪽 클릭하여 부정할 수 있습니다.
Text()의 새 tokenized가 true이면 사용자 정의 텍스트 태그의 토큰 목록을 받습니다.
Ren'Py에 새 레이어 두 개를 추가했습니다. "top" 레이어는 다른 모든 레이어 위에 표시되며 화면 전환에 참여하지 않습니다. 따라서 항상 표시해야 하는 정보를 보여 주기에 유용합니다. "bottom" 레이어는 다른 모든 레이어 아래에 표시됩니다. 항상 활성 상태로 키를 처리할 때 유용합니다.
Ren'Py는 태국어 글꼴의 C90 인코딩을 지원합니다. Unicode 전용 영역을 사용하여 기본 문자, 모음 부호, 성조 부호를 조합한 글리프를 제공하는 방식입니다. C90을 지원하는 태국어 글꼴을 선택하고 language를 "thaic90"으로 설정하면 활성화됩니다.
마우스 keysym에 마우스 버튼을 누를 때의 키보드 조합 키 상태를 나타내는 수식자를 지정할 수 있습니다. 예를 들어 "shift_mouseup_1"은 Shift 키를 누른 상태에서 마우스 버튼 1을 놓을 때만 발생합니다.
Num Lock이 꺼졌을 때 숫자 키패드의 방향키나 Home에 바인딩하도록 keysym을 개편하고 키맵도 키패드를 더 잘 활용하게 했습니다.
보통 숨기는 중인 요소와 같은 태그나 이름을 표시하면 이전 요소를 제거하고 hide 트랜스폼을 취소합니다. 새 show_cancels_hide로 제어합니다.
Shift+O 콘솔의 help에 표현식을 전달하면 해당 함수나 클래스의 pydoc을 표시합니다.
새 renpy.get_translation_identifier()가 있으면 현재 대사의 고유 식별자를 반환합니다.
새 config.scene_callbacks는 scene 문이나 renpy.scene() 호출 시 실행할 함수 목록입니다.
size 태그에 배율을 지정할 수 있습니다.
"{size=*2}이 글자는 두 배 크기{/size}이고, {size=*0.5}이 글자는 절반 크기{/size}입니다."
dismiss의 keysym으로 넘기기를 발생시키는 키를 지정합니다.
새 config.autosave_callback을 백그라운드 자동 저장 완료 후 실행합니다.
새 renpy.music.pump()는 다음 상호 작용 시작 대신 즉시 오디오 변경을 적용합니다. 소리를 재생한 뒤 페이드아웃하는 데 주로 사용합니다. (기본적으로 play 직후 stop이면 재생되지 않아 페이드아웃도 하지 않습니다.)
새 renpy.clear_attributes() 함수로 이미지 태그에 연결된 모든 속성을 지울 수 있습니다. 이전에는 이미지를 숨겼다가 다시 표시해야 했으므로 화면상의 배치도 초기화되었습니다. 이 함수는 이미지의 배치를 초기화하지 않습니다.
새 config.font_name_map으로 글꼴 파일이나 글꼴 그룹에 이름을 붙여 {font}에서 쉽게 사용합니다. 이전에는 {font}에 글꼴 그룹을 사용할 수 없었습니다.
Scroll의 delay로 짧은 시간 동안 스크롤을 애니메이션합니다.
새 preferences.audio_when_unfocused로 다른 창 전환 시 오디오를 일시 정지할 수 있습니다.
스크린의 for가 continue와 break를 지원합니다.
파일 맨 위에 rpy monologue none을 넣어 대사의 독백 모드를 끌 수 있습니다.
기타 변경 사항
극좌표 속성 around, radius, angle이 타원이 아닌 원 운동을 합니다. 상대 거리는 사용 가능 너비와 높이 중 작은 값으로 조절합니다. 새 anchoraround, anchorradius, anchorangle로 기준점도 극좌표로 배치합니다.
Lint가 도달 불가능한 문을 검사하고 보고합니다.
Lint가 사용하지 않는 번역을 검사하고 보고합니다.
build.itch_channels로 itch.io 업로드 채널을 설정합니다.
일반 문자열을 쓸 수 있는 대부분의 곳, 특히 스크린에 삼중 따옴표 문자열을 쓸 수 있습니다. 예를 들어:
screen example():
text """\
첫 번째 줄
두 번째 줄
세 번째 줄"""
텍스트 디스플레이어블 하나에 세 줄을 만듭니다.
최대화 상태를 환경설정에 저장하여 종료 시 최대화였으면 재실행 때도 최대화합니다.
스크린 언어 디스플레이어블의 첫 줄에 at transform을 쓸 수 있습니다.
text "빙글빙글 도는 글자" at transform:
rotate 0.0
linear 2.0 rotate 360.0
repeat
at 속성이 먼저 오면 at transform 블록과 함께 쓸 수 있습니다.
__ 접두사의 지역 변수를 f-string에서 쓸 수 있습니다.
자동 읽기에서 {nw}는 읽기 완료를 기다립니다.
selected_insensitive 스타일 접두사를 생성하며 해당하는 경우 selected와 selected_insensitive 이벤트를 전달합니다.
id 속성이 있는 디스플레이어블에 prefer_screen_to_id를 지정할 수 있습니다. 스크린에서 제공한 속성이 디스플레이어블 식별자로 제공한 속성보다 우선할지 제어합니다. 기본적으로는 여전히 디스플레이어블 식별자의 속성이 스크린의 속성보다 우선합니다.
오디오 대기 시 fadein 절을 사용할 수 있습니다.
Steam Deck에서 BOverlayNeedsPresent 호출을 제한하여 멈춤을 방지합니다.
대사 문이 끝나야 기록에 들어가던 것에서 표시 중에도 기록 목록과 스크린에 들어가도록 바꿨습니다.
config.steam_appid가 없으면 game의 steam_appid.txt를 삭제하여 잘못된 앱 ID를 방지합니다.
음소거해도 볼륨을 유지하여 0으로 떨어지지 않습니다.
자체 닫힘이 아닌 태그를 텍스트 블록 끝에서 닫는다고 명시했습니다. 여러 버전에서 실제로 그랬지만 Lint 경고가 났습니다. 이제 다음이 명시적으로 유효합니다.
e "{size+=20}글자가 커요!"
자동 읽기와 자동 진행을 동시에 켤 수 있습니다. 이 경우 대사에 포커스가 있을 때만 자동 진행합니다.
grid와 vpgrid가 가득 차지 않아도 필요한 만큼 null로 채웁니다.
renpy.register_statement()의 execute_init이 init_priority를 반영합니다. 이전에는 모든 execute_init이 0에서 실행되었습니다.
config.label_callback을 config.label_callbacks로 바꾸고 함수 목록을 받습니다.
여러 함수, 클래스, 액션의 문서 서명(받는 인수)을 바로잡아 더 안전하게 사용할 수 있습니다.
모든 공백을 일반 공백으로 정규화하던 것에서 전각 공백 \u3000 같은 비표준 공백도 지원합니다.
8.0.3 / 7.5.3
보안
모드와 저장 파일 공유의 보안 영향을 알리는 보안 문서를 추가했습니다.
모달 스크린, 일시 정지, 타이머
제작자 피드백을 바탕으로 모달 스크린과 일시 정지 및 타이머 사이의 동작 변경을 다시 설계했습니다. 이 버전에서는 모달 스크린이 표시되는 동안 일시 정지가 끝나지 않습니다. 반면 타이머 위에 모달 스크린이 표시되어 있어도 타이머는 발생합니다.
이러한 동작을 원하지 않는 경우도 있습니다. 이를 위해 timer 디스플레이어블과 renpy.pause()에 새 modal 속성 또는 매개변수를 추가했습니다. modal이 True이면 일시 정지는 끝나고, 타이머는 모달 스크린을 반영하여 스크린이 사라질 때까지 발생하지 않습니다. false이면 모달 스크린을 반영하지 않으므로 스크린이 계속 표시되어 있어도 일시 정지가 끝나고 타이머가 발생합니다.
변경 및 수정 사항
Google Play 새 게임 등록을 위해 Android 13의 API 수준 33을 대상으로 합니다. Play Billing은 5로 업데이트했습니다.
renpy.load_module() 모듈의 init을 우선순위순으로 실행합니다.
Lint가 config.adjust_attributes를 반영합니다.
블러가 투명해질 수 있던 문제를 해결했습니다.
대사를 설명으로 쓰는 메뉴에서 언어를 바꾸면 해당 대사를 추가한 say 시작으로 돌아가 다시 번역합니다.
개발 중 gui.preference() 첫 사용에 기본값이 없으면 오류를 표시하여 실행 시 발생할 문제를 명확히 합니다.
문서를 여러 곳 개선했습니다.
Matrix 동등성 문제로 행렬 트랜스폼 속성이 제대로 애니메이션되지 않던 문제를 수정했습니다.
람다에 바인딩된 변수를 올바르게 분석합니다.
Tutorial과 The Question을 우크라이나어로 번역하고 런처 번역을 업데이트했습니다.
8.0.2 / 7.5.2
수정 사항
자동 다시 로드(Shift+R)의 동작을 여러 부분 변경했습니다. 오류 후 Ren'Py가 잘못된 상태에 있을 때 자동 다시 로드로 잘못된 저장 파일을 만드는 일을 방지하기 위한 변경입니다. 변경 전의 저장 파일을 보존하고 이를 재사용하는 것이 목표입니다.
Ren'Py는 이제 0.68초보다 짧은 오디오 페이드인과 페이드아웃을 수행할 수 있습니다. 이전에는 이렇게 짧은 페이드에 언더플로가 발생하여 페이드가 적용되지 않았습니다. 이 릴리스에서는 페이드인과 페이드아웃의 정확한 지속 시간을 엄밀히 보장하지는 않습니다.
achievement.steam(또는 _renpysteam)을 achievement.steamapi로 다시 구현하면서 생긴 여러 회귀를 수정했습니다.
빌드 배포판이 aarch64에서 실행되지 않던 문제를 수정했습니다.
변수가 많은 스토어에서 과도한 CPU와 메모리를 쓰던 문제를 수정했습니다.
현재와 다른 언어로 저장한 슬롯을 불러와도 config.after_load_transition이 정상적으로 발생합니다.
Ren'Py 8에서 인앱 구매(IAP)가 작동하지 않던 여러 문제를 수정했습니다.
영어 이외의 언어에서 튜토리얼 예제가 작동하지 않던 문제를 수정했습니다.
소스 배포판에 Tinydialogs를 포함합니다.
기본 포커스 변경
버튼과 바 등의 default_focus를 변경했습니다. 요소를 추가하거나 제거할 때 기본 포커스를 받을 요소를 선택하는 속성입니다.
새 규칙은 다음과 같습니다.
마우스를 사용하면 포커스는 마우스를 따르고 default_focus는 무시합니다.
다른 모든 요소보다 default_focus가 높은 요소를 표시하면 포커스됩니다.
가장 높은 default_focus를 숨기면 다음으로 높은 0이 아닌 default_focus에 포커스됩니다.
마우스 사용을 방해하지 않으면서 일반적인 키보드/컨트롤러 탐색을 지원하는 것이 목표입니다.
기타 개선 사항
문자열, 스타일, python을 번역하지 않는 명시적 translate None에 경고합니다.
대사 뒤의 특수 캐릭터 extend를 예측하고 반드시 실행됨을 확인하면 확장 텍스트까지 고려하여 줄바꿈과 간격을 정합니다.
문서의 문구를 다듬고 여러 곳 개선했습니다.
콘솔에서 더 많은 Python 3 자료형을 표시합니다.
MouseDisplayable()이 설정된 default_mouse를 반영합니다.
Ren'Py 8의 Python 블록을 from __future__ import annotations가 있는 것처럼 컴파일합니다.
모달 스크린이나 dismiss 문이 pause와 renpy.pause`()의 종료를 막습니다. 이전에는 동작이 미정이고 버전마다 달랐습니다.
macOS에서 배율이 다른 모니터 사이로 창을 옮기면 올바르게 조정합니다.
macOS의 Command-C와 Command-V로 복사/붙여넣기가 됩니다.
기본 input의 vbox에서 xalign과 xpos 충돌을 막도록 xalign을 xanchor로 바꿨습니다.
개발자 모드에서도 사운드 카드 없이 시작합니다. 하드웨어 오류는 log.txt에 기록합니다.
일본어 번역을 업데이트했습니다.
새 게임은 루비/후리가나 태그를 걸러 내지 않습니다.
8.0.1 / 7.5.1
개선 사항
Matias B.가 제공한 우크라이나어 런처 번역을 추가했습니다.
웹에서 반복 재생 시 오디오 데이터를 재사용하여 메모리를 줄입니다.
MouseDisplayable()의 ATL을 마우스 변경 때마다 재설정합니다. 이전 동작은 미정이었습니다.
콘솔의 추적 스크린을 프레임마다 갱신합니다.
문서를 대폭 개선했습니다.
수정 사항
대체 텍스트를 처음부터 끝 순서로 읽습니다. 8.0에서 역순이 되었던 문제를 수정했습니다.
CropMove의 반올림 오류를 수정했습니다.
zoomin과 zoomout이 작동하지 않던 문제를 수정했습니다.
Movie에 단일 파일명 외에 동영상 목록도 다시 전달할 수 있습니다.
Android 빌드 문제를 수정했습니다.
Function() 인수를 객체 식별성으로 비교합니다. 빈 목록 두 개처럼 값은 같아도 다른 객체인데 액션을 잘못 재사용하던 문제를 막습니다.
Steam 통계 읽기/설정 문제를 수정했습니다.
dismiss가 올바르게 모달로 작동합니다.
8.0 / 7.5
Python 3 지원(Ren'Py 8.0)
Ren'Py 8.0은 Python의 최신 주 버전인 Python 3에서 실행됩니다.
이름과 플래그 저장 등 Python을 조금만 사용하면 이전과 같이 작동할 것입니다. 그 밖의 경우에는 계속 읽어 주세요.
Python 3으로 전환하면서 Ren'Py 개발자도 10년 넘게 이루어진 Python 언어와 라이브러리 개선을 이용할 수 있습니다. Python의 새로운 기능 문서에 설명되어 있습니다. Python 3의 변경 사항은 너무 많아 여기에 모두 포함할 수 없으므로 해당 문서와 다른 Python 웹 사이트를 참조하세요.
게임에서 사용할 수 있게 된 몇 가지 기능은 다음과 같습니다.
함수의 키워드 전용 매개변수입니다. 레이블, 트랜스폼, 스크린 매개변수 목록도 지원합니다.
함수 인수와 반환값의 자료형 어노테이션입니다. Python에서만 지원합니다.
형식 문자열 리터럴을 사용할 수 있습니다.
f"characters/{character}.chr"처럼 중괄호를 Python 변수의 형식화 값으로 바꿉니다. 대사 보간과 비슷하지만 Python에서만 가능하고 대부분의 순수 Ren'Py 문에서는 안 됩니다.
2.7부터 3.9까지 열 번의 주 릴리스에 매우 많은 개선이 있으므로 위 문서와 다른 Python 문서를 읽어 전체 내용을 확인하세요.
가장 큰 장점 중 하나는 Python Software Foundation의 지원이 끝난 Python 2.7에서 벗어난다는 것입니다. 따라서 Ren'Py 8.0으로의 전환은 Ren'Py의 미래를 확보하는 데 도움이 됩니다.
고급 Python을 사용했다면 일부 변환이 필요할 수 있습니다.
Python 3의 나눗셈은 항상 실수입니다.
3 / 2는 1이 아니라 1.5입니다. 정수 나눗셈은//를 사용합니다. 실수와 정수를 구별하는 Ren'Py 위치에 영향을 줄 수 있습니다.Python 3에서는 딕셔너리의 keys, items, values 메서드가 목록 대신 뷰를 반환합니다. iterkeys, iteritems, itervalues 메서드는 지원하지 않습니다. xrange 메서드는 제거되었고 range도 더 이상 목록을 반환하지 않습니다.
except는
except Exception as e:로 써야 하며except Exception, e:는 지원하지 않습니다.모든 문자열은 기본 Unicode이며(Ren'Py는 수년간 강제했습니다), 파일은 기본 텍스트 모드입니다. 다만
renpy.file()은 이진 모드입니다.renpy.open_file()로 이름을 바꿨고 기본 인코딩을 받습니다.여러 Python 모듈의 이름이 바뀌었습니다.
이는 전체 목록이 아닙니다.
Ren'Py는 Python 표준 라이브러리의 축소 버전을 제공하므로 모든 Python 모듈을 사용할 수 있는 것은 아닙니다. 필요한 용도가 있는 모듈이 빠져 있다면 알려 주세요. 특히 별도 라이브러리에 의존하지 않는 모듈이라면 더욱 좋습니다. async와 await는 사용할 수 있지만 Ren'Py가 코루틴을 직접 지원하지는 않습니다.
8.0에는 Python 3.9.10이 포함되며 Windows, macOS, Linux, Android, iOS를 지원합니다. 웹은 향후 지원할 예정입니다.
Ren'Py 8에서는 Python -O에 해당하는 플래그 없이 실행하여 독스트링과 assert를 사용할 수 있습니다.
경험상 많은 게임, 특히 Ren'Py API로 상태를 관리하는 게임은 변경 없이 Python 3에서 실행됩니다. 2006년 게임도 Ren'Py 8에서 수정 없이 실행한 사례가 있습니다.
Python 2.7 지원 유지(Ren'Py 7.5)
아직 Python 2.7이 필요한 개발 중 또는 출시 후 유지 중인 게임을 위해 8.0과 동시에 2.7 기반 7.5를 출시합니다.
이 릴리스에서 7.5는 아직 8.0이 지원하지 않는 웹도 지원합니다.
이번 7.5와 8.0은 같은 기능 집합을 지원할 것입니다.
커뮤니티가 8.x로 이동하거나 Python 생태계 변화로 Python 2 지원이 불가능해질 때까지 7.x를 지원할 계획입니다.
Ren'Py 8에서 테스트해 주세요. 많은 게임은 수정이 거의 필요 없거나 전혀 없습니다. 이식할 수 없다면 이유를 알려 주세요.
플랫폼 지원 변경
64비트 ARM Linux(linux-aarch64)를 추가했습니다. Ubuntu 20.04 기반이며 Chromebook에서 테스트했고 64비트 ARM에서도 작동할 것입니다.
ARM Linux에서 Ren'Py 게임을 실행하는 권장 방식은 새 ARM Linux SDK 패키지를 다운로드하고, 프로젝트 디렉터리에 게임을 넣은 뒤 이를 통해 실행하는 것입니다. Linux 배포판을 만들 때 ARM Linux SDK의 파일이 있으면 함께 포함되므로 ARM에서도 실행할 수 있는 게임이 만들어집니다. 다만 크기 때문에 기본적으로 포함하지는 않습니다.
Ren'Py 8에서 다음 플랫폼 지원을 제거합니다.
32비트 x86 Windows(i686)
32비트 x86 Linux(i686)
32비트 x86의 노후화를 반영한 결정입니다. 7.5에서는 지원하지만 8에서는 지원하지 않습니다.
웹과 ChromeOS
웹은 현재 7.5에서만 지원합니다.
Safari와 Chrome 웹 브라우저의 변경으로 Ren'Py 메모리 사용량이 약 50배 증가하여, 브라우저의 스택 메모리가 부족해지면 RangeError가 발생했습니다. Ren'Py 7.5에는 브라우저 내부의 메모리 사용량을 줄이는 변경이 포함됩니다. 그 결과 iOS 기기를 포함하여 Chrome과 Safari에서 다시 Ren'Py가 실행됩니다.
새 config.webaudio_required_types 변수에 게임에서 사용하는 오디오 파일의 MIME 형식 목록을 지정할 수 있습니다. 브라우저가 모든 형식을 지원할 때만 내장 Web Audio 시스템으로 재생합니다. 그렇지 않으면 webasm으로 재생하며, 이 경우 컴퓨터가 느리면 소리가 끊길 가능성이 더 높습니다.
config.webaudio_required_types 변수는 ogg나 opus 오디오를 사용하는 게임도 Safari에서 실행할 수 있도록 마련되었습니다. 게임에서 mp3 오디오만 사용한다면 이 값을 변경할 수 있습니다.
웹에 저장 파일을 가져오면 재시작 없이 목록을 갱신합니다.
ChromeOS에서 Android 앱으로 실행하면 "chromeos" 변형을 선택합니다.
ARM Chromebook에서 SDK를 실행할 수 있습니다.
Android와 iOS
Android 구성 과정에서 인앱 구매에 사용할 스토어를 다시 묻습니다. 아무 스토어도 선택하지 않으면 구매 지원 라이브러리를 프로젝트에 포함하지 않습니다. 이 라이브러리에는 결제 권한이 포함되어 있어, 실제로 구매 기능을 사용하지 않아도 게임이 인앱 구매를 지원하는 것으로 표시되었기 때문입니다.
하위 라이브러리 문제로 Android의 renpy.input()과 input이 IME 기반 비알파벳 입력을 지원하지 않는다고 명시했습니다.
iOS에서 OpenGL ES를 네이티브 Metal로 변환하여 최신 Apple 기기 호환성을 높이고 Apple Silicon의 iOS 시뮬레이터 문제를 해결합니다.
Steam, Steam Deck, Epic Games Store
이 릴리스에서는 Steam 지원을 다시 구현했습니다. 새 ctypes 기반 바인딩으로 콜백을 포함한 Steamworks API 전체에 접근할 수 있습니다. achievement 모듈을 통해 사용하는 Steam 기능은 그대로지만, 고급 Python 프로그래머는 더 많은 Steam 기능을 사용할 수 있습니다.
Steam이 활성화되면 "steam" 변형을 켭니다.
이 릴리스에는 Steam Deck 하드웨어 지원이 내장되어 있습니다. renpy.input() 호출 시 화면 키보드를 자동 표시하는 기능도 포함됩니다. Steam Deck에서는 Ren'Py의 "steam_deck", "steam", "medium", "touch" 변형도 활성화됩니다.
플랫폼 인증에 도움이 되는 Steam Deck용 Ren'Py 안내서가 있습니다. 테스트용 Steam Deck을 제공한 Valve에 감사드립니다.
“스토어용 Windows, Mac 및 Linux(Windows, Mac, and Linux for Markets)” 배포판은 이제 생성한 zip의 내부 경로 앞에 디렉터리 이름과 버전을 붙이지 않습니다. 따라서 Steam에 출시할 때마다 실행 구성을 갱신할 필요가 없습니다. 처음 한 번은 실행 구성을 업데이트해야 할 수 있습니다.
EGS가 전달하는 여러 명령줄 인수를 무시하여 Epic Games Store 실행을 지원합니다.
Visual Studio Code
Ren'Py Language 확장을 포함하여 Visual Studio Code 다운로드와 사용을 지원합니다.
Ren'Py Language는 구문 강조, 스니펫, 자동 완성, 색 미리 보기, 문서, 정의 이동, 함수 서명, 오류 진단, 개요 등 풍부한 기능을 제공합니다.
Visual Studio Code의 맞춤법 검사 등 다양한 확장을 함께 사용할 수 있습니다.
편집기 환경설정에서 다운로드를 선택하여 활성화합니다. 시스템 설치 Ren'Py에 원하는 확장을 사용하도록 설정할 수도 있습니다.
Dismiss, Nearrect, 포커스 사각형
드롭다운/풀다운 메뉴와 툴팁을 돕는 디스플레이어블 두 개를 추가했습니다.
dismiss는 보통 모달 프레임 뒤에 두며 활성화되면 액션을 실행합니다. 프레임 바깥 클릭 시 숨기기 등을 구현합니다.
nearrect 디스플레이어블은 화면의 사각형 위나 아래에 디스플레이어블을 배치합니다. 버튼 위의 툴팁이나 버튼 아래의 드롭다운 메뉴에 사용할 수 있습니다. (드롭다운 메뉴 예제는 nearrect에 설명되어 있으며 툴팁 사용 예제는 툴팁에 있습니다.
nearrect가 요소를 옆에 배치할 기준 사각형은 새 CaptureFocus() 액션으로 포착할 수 있습니다. 화면에 있는 현재 버튼의 위치를 포착하는 액션입니다. 이후 GetFocusRect()로 포커스 사각형을 가져오고 ClearFocus()로 포착한 포커스를 지울 수 있습니다. ToggleFocus()는 현재 포커스 상태에 따라 포착하거나 지웁니다.
ATL과 트랜스폼
ATL 보간에 블록을 넣을 수 있습니다. 따라서:
linear 2.0:
xalign 1.0
yalign 1.0
위 구문이 허용되며 다음과 같습니다.
linear 2.0 xalign 1.0 yalign 1.0
ATL 화면 전환과 특수 ATL 키워드 매개변수를 문서에 추가했습니다.
pause 0 문은 항상 한 프레임을 표시하도록 특별 처리되며, 최소 한 프레임 표시를 보장하는 유일한 방법입니다. Ren'Py 6.99.13부터 한 프레임 표시를 보장하는 여러 방식을 시도했지만 그중 상당수는 시각적 오류를 일으켰습니다.
이미지 버튼의 자식으로 쓰는 ATL 이미지의 표시 시간은 표시할 때마다 시작합니다.
crop_relative 기본값을 True로 바꿨습니다.
function은 지연을 만들 때만 실행을 막아 상속한 시간 기준을 따라잡을 때 자연스럽게 동작합니다.
이미지 갤러리
Gallery의 새 image_screen으로 이미지 표시를 사용자 지정합니다.
Gallery.image()와 Gallery.unlock_image()가 show_ 인수를 받습니다. show_를 제거한 뒤 Gallery.image_screen에 전달하여 이미지에 추가 정보를 포함할 수 있습니다.
상자, Grid, Vpgrid
vbox나 hbox의 무공간 요소(key, timer, 거짓 showif) 주변에는 spacing을 넣지 않습니다. grid 등 다른 배치에서는 여전히 공간을 차지합니다.
rows와 cols를 모두 지정한 vpgrid의 정원 초과를 금지합니다.
미달 vpgrid는 allow_underfull 또는 config.allow_underfull_grids로 해제하지 않으면 오류입니다. 전자가 우선합니다.
rows와 cols가 모두 있으면 자식이 rows * cols보다 적을 때 미달입니다. 하나만 있으면 자식 수가 그 값의 배수가 아닐 때 미달입니다.
call screen과 롤포워드
call screen 문의 롤포워드는 일반적으로 안전하지 않고 혼동을 일으키므로 기본적으로 비활성화했습니다. 문제는 롤포워드가 보존하는 스크린의 부수 효과가 반환값뿐이라는 것입니다. 스크린이 jump를 수행하면 이동 위치도 보존합니다. 하지만 변수 변경이나 음악 재생 등 다른 부수 효과가 있는 액션은 롤포워드로 보존되지 않았습니다.
특정 스크린에서는 롤포워드가 안전할 수 있으므로 새 roll_forward 속성으로 스크린별로 활성화할 수 있습니다. 게임의 모든 스크린이 롤포워드를 지원한다면 새 config.call_screen_roll_forward 변수로 활성화할 수 있습니다.
새 기능
show screen, hide screen, call screen에 expression을 추가하여 Python 표현식으로 이름을 제공합니다.
Preferences()에 새 "main" 볼륨을 추가했습니다. 다른 모든 볼륨과 곱하여 게임 전체 볼륨을 줄입니다.
새 config.preserve_volume_when_muted로 음소거 중에도 현재 볼륨을 표시합니다.
런처 환경설정에 임시 디렉터리 정리 버튼을 추가하여 사용 공간을 줄일 수 있습니다.
새 config.choice_empty_window로 선택 메뉴의 빈 창을 사용자 지정합니다. 용도는 다음과 같습니다.
define config.choice_empty_window = extend
마지막 대사를 선택 메뉴의 설명으로 반복합니다.
key의 capture는 상호 작용을 끝내지 않는 키를 후속 처리할지 제어합니다.
language의 새 "anywhere"는 너비 유지가 가장 중요할 때 문자열 어디서든 줄바꿈합니다.
renpy.pause()의 새 predict로 이미지 예측 완료까지 기다립니다. renpy.start_predict()와 renpy.start_predict_screen()도 포함합니다.
대사 추출 시 기본값 이외의 언어를 선택할 수 있습니다.
스크린의 add에 alt를 지정할 수 있습니다.
screen test():
add "icon.png" alt "아이콘"
Hide()에 None을 지정하면 현재 스크린을 숨깁니다.
Placeholder()의 text로 자동 텍스트 대신 원하는 텍스트를 지정합니다.
renpy.dynamic()으로 네임스페이스 변수를 동적으로 만들 수 있습니다.
새 config.always_shown_screens로 메인/게임 메뉴에서도 항상 표시할 스크린을 정의합니다. config.overlay_screens도 참조하세요.
OpenGL 뷰포트의 위치와 크기를 u_viewport로 제공합니다.
새 RENPY_PATH_TO_SAVES로 시스템 수준 저장 위치를 지정합니다. 영구 공유 데이터의 같은 기능인 RENPY_MULTIPERSISTENT도 문서화했습니다.
새 config.at_exit_callbacks를 종료 시 호출하여 개발자의 추가 데이터를 저장할 수 있습니다.
config.default_attribute_callbacks로 다른 속성과 충돌하지 않을 때 사용할 태그 기본 속성을 지정합니다.
기타 변경 사항
renpy.input()에서 Ctrl-C/Ctrl-V 복사/붙여넣기를 지원합니다. 입력 중 Ctrl은 건너뛰지 않습니다.
renpy.file()을 renpy.open_file()로 바꾸되 이전 이름도 유지합니다. encoding으로 인코딩을 지정합니다.
Drag의 focus_mask 기본값이 None으로 바뀌어 성능이 개선되지만 투명 픽셀도 드래그됩니다.
audio 네임스페이스 생성 시 flac도 검색합니다.
메뉴 설명용 say에도 영구/임시 이미지 속성을 쓸 수 있습니다.
버튼의 모든 위치 속성을 gui 변수로 제공할 수 있습니다. 예를 들어:
define gui.navigation_button_text_hover_yoffset = -3
위 구문이 작동합니다.
모달 frame은 내부 마우스 이벤트와 완전히 뒤에 있는 요소의 포커스를 막되 다른 요소의 포커스는 허용합니다.
새 config.main_menu_stop_channels로 메인 메뉴 진입 시 정지할 채널을 제어합니다.
레이어 이미지를 렌더링할 때마다 이제 화면 전체 크기를 제공합니다. 이전에는 hbox, vbox, side 등의 배치 안에서 레이어 이미지를 사용하면 제공된 공간이 달라질 수 있었고, 상대 위치도 달라질 수 있었습니다. (가능성은 낮지만 실제로 한 번 이상 발생했습니다.) 레이어 이미지의 새 offer_screen 속성으로 이 동작을 제어합니다.
Character()의 interact가 false이거나 비상호 작용으로 사용해도 파일이 있으면 자동 음성을 재생합니다.
window auto가 say 문이나 설명이 있는 menu 문 앞에 창을 표시할 때, 이제 Ren'Py가 화자의 NVL 또는 ADV 사용 여부를 자동으로 확인하여 올바른 창을 표시합니다. 이전에는 마지막 say 문의 캐릭터를 사용했습니다.
Drag 활성화 시 activate_sound를 재생합니다.
VariableValue(), FieldValue(), DictValue()에서 Return()으로 특정 값을 반환할 수 있습니다.
새 게임의 대사와 서술에서 adjust_spacing을 False로 설정합니다. 창 크기 변경 시 간격이 바뀔 수 있지만 extend 시 안정적입니다.
채널 음악 재생이나 정지는 일시 정지도 해제합니다.
새 preferences.audio_when_minimized로 최소화 시 오디오를 일시 정지합니다.
outline_scaling의 기본값은 "linear"입니다.
웹 외 플랫폼의 SDL을 2.0.20으로 업데이트했습니다.
여러 번역을 업데이트했습니다.
통합 기능이 대부분 낡은 jEdit을 제거했습니다. 다만 7.4.0 버전을 풀어 놓으면 런처에서 선택할 수 있을 것입니다.
버전 표기
전체 버전은 major.minor.patch.YYMMDDCCnu 형식입니다.
YY는 마지막 커밋 연도의 두 자리입니다.
MM은 커밋 월입니다.
DD는 커밋 일입니다.
CC는 당일 커밋 번호입니다.
야간 빌드이면 n을 붙입니다.
비공식 빌드이면 u를 붙입니다.
7.4.11
gui.variant 데코레이터
Ren'Py에 새 gui.variant 데코레이터를 추가했습니다. 함수에 변형 이름을 지정하여 장식하는 데 사용합니다. 해당 변형이 활성화되어 있으면 게임을 처음 시작할 때와 GUI를 재구성할 때마다 함수가 실행됩니다. GUI 재구성은 gui.rebuild() 호출, GUI 환경설정 변경, 번역 변경 시 발생합니다.
다음처럼 사용하며:
init python:
@gui.variant
def small():
## Font sizes.
gui.text_size = gui.scale(30)
gui.name_text_size = gui.scale(36)
# ...
다음을 대체합니다.
init python:
if renpy.variant("small"):
## Font sizes.
gui.text_size = gui.scale(30)
gui.name_text_size = gui.scale(36)
# ...
이전 방식은 한 번만 실행되어 GUI 재구성 시 변경이 사라졌습니다.
수정 사항
새 config.mouse_focus_clickthrough로 창에 포커스를 주는 클릭을 일반 클릭으로 처리할지 정합니다.
런처는 config.mouse_focus_clickthrough가 true이므로 한 번만 클릭하여 게임을 실행합니다.
Input의 caret_blink를 스크린 언어에서 제공합니다.
Live2D 곡선이 모션보다 짧으면 곡선 마지막 값을 모션 끝까지 유지합니다.
디스플레이어블이 다른 자료형의 디스플레이어블로 교체될 때 드물게 발생하는 문제를 방어하도록 했습니다. 저장한 시점 사이에 게임이 업데이트된 경우에만 발생할 것으로 예상됩니다.
모달 요소가 일시 정지 종료를 막습니다.
디스플레이어블 무효화 시 이미지가 표시되지 않을 수 있던 문제를 수정했습니다.
동영상 시작 시 일시 정지된 소리를 재개하지 않습니다.
AudioData를 영구 데이터에 저장하지 않으며 로드 시 기존 객체도 제거합니다.
iOS/Android 에뮬레이션에서 renpy.android와 renpy.ios 등이 에뮬레이션 플랫폼을 따릅니다.
iOS/Android 에뮬레이터가 모바일 롤백 방향을 사용합니다.
요소나 대체 요소가 계속 표시되고 포커스가 바뀌면 항상 unhovered를 실행합니다. 이전에는 두 번째 스크린 때문에 포커스를 잃으면 실행하지 않았습니다.
config.log가 true이면 선택한 선택지를 올바르게 기록합니다.
새 gui.variant()로 gui.rebuild() 시 기본 GUI의 변형 설정이 초기화되던 문제를 우회합니다.
웹은 프레임마다 점진 다운로드 이미지를 확인하여 애니메이션 중에도 로드합니다.
Live2D는 이제 모션의 페이드인과 페이드아웃을 포화 연산으로 결합합니다. 페이드인이 매개변수 값의 80%를 기여하고 페이드아웃이 20%를 기여한다면, 값의 100%가 두 모션에서 옵니다. (이전에는 페이드인과 페이드아웃을 독립적으로 적용하여 두 모션이 84%만 기여하고 나머지 16%는 기본값에서 가져왔습니다.)
Live2D 모션 시퀀스 간 전환에서 모션이 페이드아웃하면 이전 시퀀스를 끝냅니다.
전환용 이전 스크린 보존 시 later_at_list와 camera 목록도 이전 상태에서 가져와 예상 밖 변경을 막습니다.
gl_depth가 Ren'Py 의미에 더 가까운 GL_LEQUALS를 사용합니다.
행렬의 4성분 생성자를 수정했습니다.
AAB 생성 시 Android 빌드 디렉터리를 정리하여 여러 게임 패키징이나 삭제된 파일 때문에 생기는 문제를 막습니다.
Live2D의 같은 모션 반복 시 매끄러운 애니메이션을 올바르게 처리합니다. 예를 들어 show eileen m1 m1 m2에서 m1이 매끄러운 모션인 경우입니다.
ChromeOS에서 마우스 움직임을 추적하여 클릭 사이에 커서가 숨겨지지 않습니다.
ChromeOS에서 창이 부분 렌더링되던 문제를 해결했습니다.
스크린의 transclude 문제를 수정했습니다.
perspective와 mesh가 모두 true인 트랜스폼이 표시되지 않던 문제를 수정했습니다.
버튼은 직접 자식에게만 상태를 전달하고 ImageReference를 통한 자식에게는 전달하지 않습니다.
게임패드 이벤트에 repeat_를 적용할 수 있습니다.
config.debug_image_cache에서 config.debug_prediction을 분리하여 예측 오류의 콘솔/log.txt 기록을 제어합니다. 기존 변수는 문서대로 작동합니다.
번역
독일어, 인도네시아어, 폴란드어, 러시아어를 업데이트했습니다.
7.4.10
수정 사항
최대 텍스처 크기(대부분 4096x4069)보다 큰 이미지가 gl2에서 표시되지 않던 문제를 수정했습니다.
{nw}로 끝나는 대사는 음성 완료를 기다리지 않습니다.
extend가 만든 것을 포함하여 {fast}가 있는 대사는 이전 문의 음성을 유지합니다.
이는 7.4.9에서 도입했지만 이력에 빠졌던, 시간 지정 {w}/{p}가 음성 종료를 기다리지 않는 변경을 보완합니다.
focus_mask 속성은 느릴 수 있지만, 극단적으로 느려지는 상황을 해결하기 위한 변경을 여러 건 포함했습니다. 가능하다면 피하는 것이 좋습니다. 현재 Drag의 기본값은 True지만 7.5에서는 None으로 바뀔 예정입니다. 이 변경으로 True를 사용하는 경우에도 일부 성능 향상을 기대할 수 있습니다.
Live2D는 기본적으로 log.txt에 기록하지 않습니다. config.log_live2d_loading으로 복원합니다.
Android 스토어 자동 판단 문제를 수정했습니다.
번역
인도네시아어와 폴란드어를 업데이트했습니다.
7.4.9
Android
Android 지원을 크게 바꾸어 이제 Google Play 업로드에 필수인 Android App Bundle을 지원합니다.
번들과 APK의 서명 키가 달라 테스트 시 APK에서 번들로 전환하려면 제거 후 재설치해야 합니다.
Google Play에서 실행할 때 Ren'Py는 Play Asset Delivery로 플레이어 기기에 게임 데이터를 전달합니다. 이전 Ren'Py와 같은 2 GB 제한이 적용되며, 게임의 각 파일은 500 MB 에셋 팩 네 개 중 하나에 자동으로 배치됩니다. 모든 팩이 전달되기 전에 게임을 실행하면 Ren'Py가 전달 완료를 기다린 뒤 시작합니다.
에셋 다운로드 중 android-presplash.jpg 대신 android-downloading.jpg를 표시하며 진행률 표시줄을 덧씌웁니다.
사이드로딩이나 다른 스토어용 2GB APK도 계속 지원합니다.
Android SDK 30으로 빌드합니다.
Android 11의 무선 디버깅을 지원합니다.
Android 구성에서 여러 질문을 제거하여 과정을 간소화했습니다. 특히 패키지의 숫자 버전을 Ren'Py가 자동으로 관리하므로 빌드할 때마다 직접 버전을 올릴 필요가 없습니다.
외부 파일 디렉터리의 아카이브를 찾아 자동 사용하여 패치, 업데이트, 추가 에셋을 배포할 수 있습니다.
Android API 호출 라이브러리 Pyjnius의 포함을 문서화했습니다.
새 build.android_permissions, renpy.check_permission(), renpy.request_permission()으로 Ren'Py 자체 외의 Android 권한을 요청합니다.
Android 키를 스크립트 백업 위치에 백업합니다. 별도 백업을 대체하지는 않습니다.
Android 등에서 검은 스크린샷이 나오는 문제를 (해결되었기를 바라며) 수정했습니다.
Android의 저장과 log.txt를 그룹 읽기 가능으로 명시하여 플레이어가 접근할 수 있게 합니다.
iOS
iOS 프로젝트 초기 생성 시 실행 화면을 설정하고 불필요한 스키마를 없애 더 완성된 상태로 만듭니다.
늘 그렇듯 Ren'Py 업데이트마다 새 iOS 프로젝트가 필요합니다.
iOS/macOS API 호출 라이브러리 Pyobjus의 포함을 문서화했습니다.
업데이터
https 업데이트를 지원합니다. 다만 변경 부분만이 아니라 전체 파일을 받아 덜 효율적입니다.
런처 환경설정에서 매일 업데이트 확인을 선택할 수 있습니다. 하루 한 번 확인하고 있으면 버튼을 강조합니다.
카메라/원근 개선
원근 등 복잡한 camera 사용에서 여러 전환, 특히 이동 전환에 문제가 있었습니다. 수정하여 작동합니다.
하위 Surface를 가져와야 하는 작업은 원근 트랜스폼에 적용하면 작동하지 않았습니다. slide와 wipe 화면 전환이나 뷰포트 사용이 예입니다. 이 문제를 수정했지만 동작하려면 텍스처로 렌더링하는 작업이 필요합니다. 성능 비용을 감수할지는 제작자가 결정해야 합니다.
접근성
Shift+A에서 모든 텍스트를 검은 바탕의 밝은 글자로 바꾸는 고대비를 지원합니다. 더 높은 대비가 필요한 플레이어를 위한 기능입니다.
설명 텍스트가 꺼져 있으면 alt 캐릭터가 대사 창을 페이드인하지 않습니다.
자동 읽기의 레이어, 스크린, 레이어에 직접 놓인 디스플레이어블 읽기 순서를 변경했습니다. 이제 마지막에 그려진 것, 즉 플레이어에게 가장 가까운 스크린과 디스플레이어블을 먼저 읽습니다. 스크린이나 배치 디스플레이어블 내부에는 적용되지 않으며, 내부 요소는 여전히 처음부터 끝 순서로 읽습니다.
모달 스크린은 내용을 읽은 후 자동 읽기를 멈춥니다.
트랜스폼 속성
xsize와 ysize 트랜스폼 속성의 동작을 해당 스타일 속성과 일치하도록 조금 변경했습니다. 이전에는 픽셀 수만 받았지만 이제는 위치 값을 받습니다. int나 absolute로 나타낸 픽셀 수 또는 float로 나타낸 사용 가능 공간의 비율입니다. 이전 래퍼인 size는 폐기 예정이므로 새 래퍼 xysize를 사용해야 합니다.
기타
bar의 새 released로 놓을 때 실행할 액션을 지정합니다.
key가 keysym 목록도 받는다고 명시했습니다.
Linux의 "C" 로캘에서 UTF-8 파일 시스템을 켜 해당 로캘을 쓰는 Steam Linux와 호환성을 높입니다.
폴란드어 런처 번역을 추가했습니다.
음악실에 일시 정지/재개용 TogglePause를 추가했습니다.
안전 모드로 시작하는 --safe-mode를 추가했습니다.
음소거가 동영상에도 적용됩니다.
분석 파일이 무제한 커져 시작이 느려지던 문제를 수정했습니다. 재컴파일하면 크기가 줄어듭니다.
바에도 hover_sound와 activate_sound를 적용합니다.
ATL에서 selected_ 이벤트 처리가 없으면 접두사를 떼고 다시 찾습니다. selected_hover가 없으면 hover가 selected_hover를 처리하고 selected_idle도 같습니다.
버전 끝에 선택적 문자를 붙입니다. n은 야간 빌드, u는 비공식 빌드입니다.
롤백마다 default를 적용합니다.
버튼 텍스트가 바뀌지 않던 회귀를 수정했습니다.
7.4.8
수정 사항
롤백이 목록, 딕셔너리, 집합, 객체를 손상시키던 중대한 문제를 수정했습니다. 7.4.7 사용자 모두에게 업그레이드를 권장합니다.
정수가 아닌 외곽선의 충돌을 수정했습니다.
가장자리/휠 스크롤에 올바른 뷰포트 크기를 사용합니다.
게임 컨트롤러 감지를 수정했습니다.
기능
PauseAction()이나 renpy.music.set_pause()로 동영상 채널도 일시 정지합니다.
config.single_movie_channel로 기본 동영상 채널을 설정합니다.
변경 사항
개발자 모드에서 이미지 매개변수 오류가 나면 회색 유령 소녀 대신 개발자에게 오류를 보고합니다.
centered와 vcentered가 숨기기 전에 텍스트 창을 표시하지 않습니다.
Shift+O 콘솔로 상태를 바꾼 지점까지 롤백해도 변경을 취소하지 않으며 한 단계 더 돌아가면 취소합니다.
7.4.7
웹과 웹 오디오
웹 플랫폼의 오디오 재생 방식을 다시 작성했습니다. 다른 플랫폼에서 사용하는 ffmpeg 대신 웹 버전의 Ren'Py는 소리 파일을 브라우저 내장 오디오 플레이어에 전달합니다. 이 플레이어는 대개 멀티스레드로 작동하므로 웹 버전에서 발생하던 끊김과 잡음을 방지합니다.
웹의 지원 형식은 브라우저와 같습니다. 최신 브라우저는 Opus, Ogg, MP3이며 Safari는 MP3만 됩니다. (아래 Safari 문제도 참조하세요.)
새 config.audio_filename_callback으로 웹 및 다른 플랫폼에서 재생 시 파일명을 조정합니다.
브라우저가 지원하면 웹에서도 v 자동 읽기가 됩니다.
https://bugs.webkit.org/show_bug.cgi?id=227421 때문에 WebKit 브라우저 지원이 제한됩니다. macOS Safari, 특히 M1과 모든 iOS 브라우저에 영향을 주는 것으로 보입니다. Ren'Py에서 해결할 수 없어 웹 셸에서 안내합니다.
iOS
더 최신 Clang으로 빌드하여 12세대 iPhone과 2세대 iPhone SE에서 좌우 여백 또는 좌우/상하 여백 없이 실행합니다.
M1 Mac의 iOS 시뮬레이터용으로 컴파일할 수 있지만 시뮬레이터 자체의 실행 문제가 있을 수 있습니다.
입력
input에 다음 편의 기능을 추가했습니다.
왼쪽 단어로 이동(Ctrl-Left, Macintosh는 Alt-Left).
오른쪽 단어로 이동(Ctrl-Right, Macintosh는 Alt-Right).
단어 삭제(Ctrl-Backspace, Macintosh는 Alt-Backspace).
줄 삭제(Windows-Backspace, Macintosh는 Command-Backspace).
Macintosh에서 Home/End 외에도 Command-Left/Right로 줄 처음과 끝에 갑니다.
입력 커서가 주의를 끌도록 깜박입니다. config.input_caret_blink로 속도를 제어합니다.
기타
Preferences()가 렌더러와 접근성 메뉴 액션을 반환할 수 있습니다.
새 renpy.set_focus()로 포커스를 지정할 수 있지만 마우스 이동으로 즉시 바뀔 수 있습니다.
레이어 이미지에서 속성에 지정한 트랜스폼 속성이 그룹보다 우선합니다. 이전에는 그룹의 align과 속성의 xalign처럼 충돌할 수 있었습니다.
콘솔에서 설정한 변수를 거슬러 롤백할 수 있습니다.
새 mark_label_seen()과 mark_label_unseen()으로 방문 레이블 집합을 조작합니다.
새 mark_audio_seen()과 mark_audio_unseen()으로 재생 오디오 집합을 조작합니다.
새 mark_image_seen()과 mark_image_unseen()으로 표시 이미지 집합을 조작합니다.
스크린 ATL은 스크린이 아니라 트랜스폼이 처음 표시될 때 시작합니다.
새 config.autosave_on_input로 입력 시 자동 저장 여부를 정합니다.
키워드 인수 뒤의 위치 인수에 오류를 보고합니다.
xsize와 ysize에 실수를 지정해도 이제 올바른 결과가 나옵니다. 이전에는 실수를 두 번 적용하여 xsize()에 .5를 주면 사용 가능 너비의 1/4이 되었지만, 이제는 올바른 값인 1/2이 됩니다.
영구 데이터를 지우는 persistent._clear()를 문서화했습니다.
스페인어 번역을 업데이트했습니다.
Atom을 업데이트했습니다.
7.4.6
camera 문
3D 스테이지용 camera를 추가했습니다. show layer와 비슷하지만 레이어 이름이 필수가 아니며 scene에서 지워지지 않습니다.
다음과 같이 작성하여:
camera:
perspective True
3D 스테이지를 켭니다.
이에 따라 show layer와 scene은 7.4.4 이전처럼 scene에서 트랜스폼 목록을 지웁니다.
Model 디스플레이어블
새 Model 디스플레이어블로 모델 기반 렌더러에서 사용할 모델을 만들 수 있습니다. 현재는 여러 텍스처를 가진 2D 모델을 만들 수 있습니다. 이를 통해 일부 내장 트랜스폼과 비슷하게 작동하는 사용자 지정 트랜스폼을 구현할 수 있습니다.
아직 3D는 지원하지 않지만 향후 지원할 예정입니다.
기타 개선 사항
Atom과 language-renpy를 업데이트하여 최신 Ren'Py 키워드를 지원합니다.
컨트롤러 사용 시 마우스 커서를 즉시 숨깁니다.
수정 사항
빌드 실수로 야간 빌드의 iOS 컴파일 수정이 정식 릴리스에 포함되지 않았습니다.
창 포커스를 잃으면 모달이 시간 이벤트를 막지 않던 문제를 수정했습니다.
블러 셰이더 반복 수를 제한하여 더 많은 WebGL 기기와 호환됩니다.
강제 재컴파일을 선택하면 renpy/의 Python도 재컴파일하여 제작자의 Ren'Py 경로가 포함되지 않도록 합니다.
애니메이션 시간 기준에서 ATL이 표시할 첫 프레임으로 건너뜁니다.
롤백 후 제한 시간 없이 멈추지 않습니다.
7.4.5
모델 기반 렌더러
7.4.5로 출시한 게임의 기본값입니다. 끄려면 config.gl2를 False로 설정하세요.
모델 기반 렌더러를 사용하면 이제 Ren'Py의 “3D 스테이지”를 사용할 수 있습니다. 표시한 이미지에 세 번째 차원을 더하여 원근에 맞는 확대와 이동, 디스플레이어블의 3D 회전과 평행 이동 등 다양한 새 효과를 만들 수 있습니다. 자세한 내용은 3D 스테이지 문서를 참조하세요.
3D 스테이지를 지원하기 위해 scene 문이 이제 show layer나 renpy.layer_at_list()로 레이어 전체에 적용한 트랜스폼을 지우지 않습니다.
모델 기반 렌더러의 새 Swing()은 장면을 가로/세로 축으로 3D 회전하여 이전 장면으로 교체합니다.
새 blend 트랜스폼 속성으로 혼합 함수를 지정할 수 있습니다. 이 함수는 새로 그리는 픽셀을 기존 대상 픽셀과 어떻게 결합할지 제어합니다. Ren'Py가 이미 지원하던 "normal"과 "add" 외에 "multiply", "min", "max" 함수를 추가했습니다.
마우스
하드웨어 마우스 지원을 개선하고 GPU별 커서 크기 제한을 문서화했습니다.
새 config.mouse_displayable과 MouseDisplayable()로 7.3 이전처럼 소프트웨어 마우스를 사용할 수 있습니다.
기능
새 renpy.screenshot_to_bytes()는 im.Data()에 전달할 bytes로 스크린샷을 저장합니다. 크지만 일반/영구 저장에 넣을 수 있습니다.
새 renpy.music.get_loop()로 채널 반복 파일 목록을 받아 저장하고 다시 재생합니다.
renpy.input()과 input의 mask로 표시 문자를 가리는 문자열을 지정합니다. 암호 숨기기 등에 사용합니다.
런처 다크 테마를 추가했습니다.
새 config.adjust_attributes로 표시 속성을 가로채 교체합니다. eileen happy를 eileen happy_eyes happy_mouth로 바꾸면 LayeredImage와 잘 맞습니다.
명령줄 Lint의 --error-code로 실패 시 오류 코드를 반환합니다.
레이어 전환이 상호 작용 끝 이후에도 지속됩니다.
롤백 직후 pause를 피하여 상호 작용 가능한 문에서 끝나도록 합니다.
소리 재생 시 다른 채널 파일의 시간에 시작을 동기화할 수 있습니다.
Android
Android 빌드 필수 패키지 일부를 포함하여 Bintray 폐쇄로 7.4.4 새 설치에서 빌드하지 못하던 문제를 해결했습니다.
Android에서 프리스플래시 화면을 표시하는 방식을 바꿨습니다. 이제 Java 부트스트랩이 OpenGL 레이어 위의 새 레이어에 프리스플래시를 표시합니다. SDL의 2D 렌더링을 사용하던 Ren'Py 7.4와는 다른 접근입니다. Android 기기와의 호환성이 개선되고 시작 시 검은 화면이 나타나는 문제를 방지하는 것으로 보입니다.
프리스플래시를 사용 가능 영역 안에 맞게 크기 조절합니다.
일부 Android의 블러 문제를 수정했습니다.
Android에서 드문 동영상/오디오 형식 재생 문제를 수정했습니다.
Android 프로젝트를 다시 생성해야 합니다. 설정의 “Java 소스를 자동 업데이트하시겠습니까?(Do you want to automatically update the Java source code?)”에 “예(Yes)”로 답하세요.
다른 플랫폼
웹 플랫폼 베타를 업데이트했습니다.
iOS 14.5.1 이상 Mobile Safari 회귀로 시작되지 않습니다. 브라우저 문제라 우회할 수 없어 Apple에 문의하라는 메시지를 표시합니다. Chrome, Firefox 같은 Mobile Safari 기반 iOS 브라우저에도 해당합니다.
iOS 빌드를 수정했습니다.
macOS Steam 지원을 수정했습니다.
macOS 앱 서명과 공증을 수정했습니다.
기타 수정 사항
기본 세부 수준 바이어스를 -0.5로 설정했으며 config.gl_lod_bias로 바꿉니다. 확대보다 축소를 선호하게 하지만 이전 값은 이미지 가장자리를 거칠게 만들었습니다.
모달 스크린 처리를 여러 부분 개선했습니다.
7.4.4
old-game 디렉터리
얼리 액세스나 Patreon 배포처럼 게임을 여러 번 출시하는 제작자를 돕기 위해 Ren'Py는 이제 old-game 디렉터리를 지원합니다. 이전 릴리스의 game 디렉터리를 복사해 둘 수 있습니다. Ren'Py가 .rpyc를 생성할 때 이 디렉터리에 있는 .rpyc의 정보를 사용합니다. .rpyc는 게임을 불러올 때 사용하므로 여러 개발자가 함께 제작하는 게임의 저장 데이터를 불러오는 데 도움이 됩니다.
자세한 내용은 문서를 참조하세요.
수정 사항
제스처나 컨트롤러 충돌을 수정했습니다.
Windows 웹 배포판 생성 충돌을 수정했습니다.
도전 과제 영구 데이터 백엔드가 진행도 초기화를 지원합니다.
Live2D가 다른 매개변수와 함께 불투명도도 초기화합니다.
다시 로드 시 최대화 창 크기를 바꾸지 않습니다.
기타
모델 기반 렌더러의 새 GL 속성 blend_func로 혼합 함수를 지정하여 새 혼합 모드 지원을 시작합니다.
Live2D가 가산/곱셈 혼합을 지원합니다.
renpy 네임스페이스에 default나 define을 쓰면 오류입니다.
preferences 객체의 볼륨/음소거 읽기 및 설정 메서드를 문서화했습니다.
7.4.3
Windows
아이콘 변경 코드를 다시 작성하여 소프트웨어와 추가 아이콘 외의 불필요한 데이터를 넣지 않습니다. 일부 백신의 오탐을 방지할 것입니다.
Windows에서 Ren'Py를 이제 Universal C Runtime에 연결합니다. 이에 따라 실행 가능한 최소 Windows 버전이 특정 핫픽스를 적용한 Windows Vista로 높아질 수 있습니다. Ren'Py를 현대화하는 동시에 일부 바이러스 백신의 오탐을 방지하기 위한 변경입니다.
Nvidia의 스레드 최적화를 꺼 예상치 못한 일시 정지를 막습니다. 오디오 오류로 나타날 수 있던 문제를 해결합니다.
OpenGL이 없고 DirectX가 있으면 ANGLE로 OpenGL ES를 에뮬레이션합니다. 7.4에서는 정상 작동하지 않았습니다. 여러 시스템을 시도하며 창이 여러 번 나타났다 사라지는 것은 정상입니다.
Android
비모델 렌더러가 Android 컨텍스트 변경 시 텍스처를 올바르게 해제하여 주로 디졸브 중 무작위로 발생하던 시각적 오류를 막습니다.
Ren'Py는 이제 게임이 실제로 시작될 때 포커스가 있는지 확인합니다. 게임이 완전히 시작되기 전에 플레이어가 다른 애플리케이션으로 전환했을 때 발생하던 문제를 해결합니다. 시작 시 포커스를 잃었다면 저장 후 종료하고, 플레이어가 게임으로 돌아오면 다시 실행합니다.
전반적인 Android 호환성을 개선했습니다.
기능
메인 메뉴 음악 페이드인용 config.main_menu_music_fadein을 추가했습니다.
새 renpy.get_zorder_list()와 renpy.change_zorder()로 표시 후 이미지/스크린 zorder를 조작합니다.
Window와 Frame이 이제 modal 스타일 속성을 받습니다. 스크린의 modal과 비슷하지만 마우스가 창이나 프레임의 경계 안에 있을 때만 적용됩니다. 따라서 창 뒤의 버튼을 클릭하지 못하게 하면서, 가리지 않은 버튼은 계속 사용할 수 있습니다.
Live2D()의 update_function으로 매개변수를 직접 갱신합니다.
글꼴이 지원하면 기본 다국어 평면 밖 문자와 이모지를 표시합니다. 현재는 글꼴 시스템으로 단색 글리프를 만듭니다.
FontGroup으로 글꼴 문자를 재매핑합니다.
AlphaMask() 마스크 요소에도 포커스가 가능해 새 효과를 만듭니다.
로드할 수 없는 이미지를 플레이어가 무시할 수 있습니다.
새 renpy.get_sdl_dll()과 renpy.get_sdl_window_pointer()로 ctypes에서 SDL에 접근하여 Ren'Py가 직접 제공하지 않는 SDL 기능을 구현할 수 있습니다.
클릭하면 renpy.transition()이나 with 절의 전환을 끝냅니다.
선택한 언어로 문자열을 번역하는 renpy.translate_string()을 문서화했습니다.
가운데 클릭이나 h로 창 숨기기를 사용자 지정하는 hide_windows 레이블을 만들 수 있습니다.
mesh_pad와 gl_pixel_perfect 등으로 텍스트 셰이더 적용 후에도 픽셀 정확한 렌더링을 합니다.
renpy.input()이 show_ 속성을 input 스크린에 전달합니다.
Color의 rgba가 RGBA 튜플을 반환합니다.
기존 기능
7.4에서 추가한 default_mouse로 실행 중 config.mouse 변경 없이 커서를 바꿉니다. 실행 중 config 변경은 지원하지 않습니다.
기타 수정 사항
여러 모달 스크린을 잘못 처리하여 포커스 문제가 생기던 현상을 수정했습니다.
Windows의 Lint 파일에 Windows 줄바꿈을 사용합니다.
Windows의 SDL 오류를 시스템 인코딩으로 디코딩하여 읽기 쉽게 했습니다.
Python의 Unicode 이스케이프 문제를 수정했습니다.
0~1 사이 blur가 정상 작동합니다.
{done}이 정의대로 작동합니다.
GL 로드 실패 검사와 이전 라이브러리 대체를 개선했습니다.
macOS 앱에서 HighDPI가 활성화될 것입니다.
번역
被诅咒的章鱼와 逆转咸鱼가 문서를 중국어 간체와 번체로 번역했습니다.
프랑스어를 업데이트했습니다.
7.4.2
수정 및 변경 사항
새 config.context_fadeout_music과 config.context_fadein_music으로 불러오기나 컨텍스트 변경의 음악 전환에 페이드를 적용합니다.
Live2D 모션/표정을 디렉터리 이름 대신 .motion3.json과 .exp3.json으로 찾습니다.
새 build.include_i686 변수로 32비트 Ren'Py를 빌드에 포함할지 결정합니다. 32비트 바이너리를 제외하면 다운로드 크기를 줄일 수 있으며, 지나치게 엄격한 바이러스 백신이 배포판을 감염된 것으로 잘못 보고하는 일을 방지할 수 있습니다.
새 build.change_icon_i686로 i686 아이콘 변경을 막아 백신 오탐을 방지할 수 있습니다.
게임 실행 중 화면 보호기나 시스템 절전을 막지 않습니다.
macOS 초록 버튼의 OS 전체 화면 후 크기 조절이 막혀 복원하지 못하던 문제를 해결했습니다.
Raspberry Pi의 webp 표시 충돌을 수정했습니다.
빌드 실수로 빠진 다음 파일을 복원합니다.
say.vbs가 없어 Windows 자동 읽기가 안 되었습니다.
ANGLE 파일이 빠져 DirectX 렌더링이 안 되었습니다.
Android
삼성 기기에서 확대 바로가기를 켜면 응답하지 않을 수 있는 알려진 문제가 있습니다. 수정 중이지만 이 때문에 출시를 미루지는 않았습니다.
macOS JVM 감지를 강화하여 브라우저 플러그인과 혼동할 가능성을 줄였습니다.
JVM으로 AdoptOpenJDK를 권장합니다.
7.4.1
pause 문 변경
시간 지정 pause를 바꿨습니다. 다음은:
pause 1.0
이제 다음과 같으며:
$ renpy.pause(1.0)
다음과는 다릅니다.
with Pause(1.0)
따라서 실제 일시 정지를 기대하는 다른 기능도 pause 중 작동합니다.
모달 스크린이 pause와 renpy.pause()를 막지 않아 위에 모달이 있어도 끝날 수 있습니다.
say 문의 id 절
id로 이전 say ID를 지정합니다. 명백한 오타 등 원어 대사를 수정하면서 모든 번역을 갱신하지 않아도 됩니다.
say에 id와 문 ID를 붙이세요.
e "이 문장에는 원래 오타가 있었어요." id start_61b861a2
Live2D
Live2D 지원에 default_fade 인수를 추가했습니다. 모션과 표정이 시작되거나 끝날 때 적용하는 페이드의 기본 지속 시간을 변경할 수 있습니다.
튜플 오류로 나타나던 Live2D 문제를 수정했습니다.
컨트롤러 차단 목록
Nintendo Switch Pro Controller를 USB로 연결하면 잘못된 데이터 대신 조이스틱으로 동작하도록 초기화 시퀀스가 필요합니다.
Ren'Py 7.4.0에서는 이 초기화 시퀀스를 전송하려고 했습니다. 그러나 USB 버스에 직접 접근해야 했고 일부 컴퓨터에서 충돌하거나 오랫동안 멈췄습니다. 호환성 문제가 발생할 가능성이 너무 높아 Ren'Py에 포함하기에는 부적합하다고 판단했습니다.
따라서 Switch Pro Controller를 새 차단 목록에 넣어 Ren'Py에서 작동하지 않습니다.
macOS
최소 macOS는 10.10(Yosemite)입니다. 7.4에서는 실행되지 않았으므로 지원 복원입니다.
macOS 11.0(Big Sur)의 프로젝트 디렉터리 선택 문제를 수정했습니다.
iOS 외에 macOS에도 Cocoa API 접근용 Pyobjus를 포함합니다.
Android
7.4.1 사전판이 Galaxy S5 같은 구형 Android에서 정상 실행되지 않는다는 보고가 있습니다. 문제 기기를 확보하려고 하며 필요하면 새 릴리스를 만들겠습니다.
번역
스페인어를 업데이트했습니다.
기타 수정 사항
SSE3 컴퓨터에서 특정 크기 동영상의 충돌을 수정했습니다.
이전 버전처럼 여러 코어로 동영상을 디코딩합니다.
100%가 아닌 Windows DPI에서 창 크기가 커지던 문제를 수정했습니다.
gl2 필수 게임에서 GL/ANGLE처럼 지원하지 않는 렌더러를 골라도 성능 경고를 표시하지 않습니다.
일부 상황에서 say 속성이 표시되지 않던 문제를 수정했습니다.
기본 파일 인코딩이 UTF-8이 아닌 컴퓨터의 MultiPersistent 문제를 수정했습니다.
rpy python 3의 Python 컴파일 플래그를 개선했습니다.
gui.about 등의 삼중 따옴표 문자열 평가 문제를 수정했습니다.
특정 다시 로드에서 자체 경로를 감지합니다.
렌더러 필수 함수를 모두 동적 로드할 수 있는지 확인하고 안 되면 다른 렌더러를 시도합니다.
문 시작 후 생성한 타이머도 롤백에 참여하여 발생 전 지점으로 돌아가면 발생합니다.
게임 실행 중 화면 보호기 활성화를 허용합니다.
롤백 중 동적 변수가 동적으로 유지되지 않던 문제를 수정했습니다.
크기를 지정한 hbox/vbox의 자식을 7.4와 같은 방식으로 배치합니다.
새 mipmap은 Dissolve(), ImageDissolve(), AlphaDissolve(), AlphaMask(), Movie(), Text()와 일반 텍스트의 생성 텍스처 밉맵을 제어합니다. 끄면 느린 컴퓨터의 성능이 좋아질 수 있지만 축소 시 오류가 생길 수 있습니다. 기본값은 해당하는 config.mipmap_dissolves, config.mipmap_movies, config.mipmap_text입니다.
자동 읽기 환경설정의 토글 버전에서 선택 상태를 개선했습니다.
Lint가 번역별 통계를 다시 보고합니다.
7.4.0
모델 기반 렌더러
이 릴리스에는 새 모델 기반 렌더러가 포함됩니다. 렌더러는 사용자 화면에 텍스트와 이미지를 그리는 Ren'Py의 구성 요소입니다. 새 렌더러는 Ren'Py 6.10에서 추가한 기존 OpenGL 렌더러를 보완하며, 궁극적으로 이를 대체하는 것이 목표입니다. 전용 그래픽 카드와 프로세서 내장 GPU를 포함한 최신 GPU 하드웨어를 더 잘 활용하여 성능과 기능을 개선합니다. OpenGL 2.2 또는 DirectX 9.0c나 11을 지원하는 데스크톱과 OpenGL ES 3을 지원하는 모바일 기기 및 임베디드 시스템에서 사용할 수 있습니다.
모델 기반 렌더러의 가장 큰 변화는 Ren'Py가 더 이상 2차원 평면의 사각형 이미지만 그리는 데 한정되지 않는다는 점입니다. 대신 3차원 공간에서 삼각형으로 구성된 메시를 사용하도록 변경했습니다. 기존 사각 스프라이트는 같은 방식으로 표시하지만, 비사각 메시와 향후 완전한 3차원 기하 구조를 사용할 가능성이 열립니다.
모델 기반 렌더링은 메시 기하 구조뿐 아니라 셰이더도 지원합니다. Ren'Py에 포함된 셰이더와 제작자가 게임에 지정한 셰이더를 모두 사용할 수 있습니다. 셰이더는 GPU에서 실행되는 작은 프로그램이며, 기하 구조와 픽셀 데이터를 처리하여 다양한 그래픽 효과를 만듭니다.
비용이 큰 알파 사전 곱셈을 CPU에서 GPU로 옮겨 빠르게 텍스처를 로드합니다.
모델 기반 렌더러는 GPU에 로드한 각 텍스처의 밉맵도 생성합니다. 밉맵은 텍스처를 여러 단계로 줄여 GPU에 저장한 이미지들입니다. 이를 생성하고 사용하면 원래 크기의 50% 미만으로 이미지를 축소해도 앨리어싱이 나타나지 않습니다. 특히 4K 모니터용 에셋을 1080P 이하 화면에서 사용할 때 유용합니다.
이번 릴리스에서는 config.gl2로 선택하여 켭니다. 경험을 쌓으면 기본 렌더러로 만들 예정입니다.
Live2D
모델 기반 렌더러로 가능해진 기능 중 하나는 Live2D로 제작한 스프라이트 표시입니다. Live2D 기술을 사용하는 게임을 배포하려면 먼저 Live2D, Inc.와 계약해야 하므로 Ren'Py에서는 Live2D Cubism을 별도로 다운로드하도록 합니다.
Ren'Py는 Live2D 모델 표시와 함께 표정 변경, 하나 이상의 모션을 대기열에 넣는 기능을 지원합니다. 이미지 속성 시스템에 통합되어 있으며, 속성이 바뀔 때 한 모션에서 다른 모션으로 페이드하는 기능도 지원합니다.
Matrixcolor와 Blur
모델 기반 렌더러로 matrixcolor와 blur 같은 새 트랜스폼 기능을 제공합니다.
ATL을 포함한 트랜스폼의 새 matrixcolor에 행렬 또는 시간에 따라 변하는 행렬 생성 객체를 지정하여 모든 자식의 색을 바꿉니다.
이전 Ren'Py에도 im.MatrixColor() 이미지 조작기가 있었지만 새 속성은 크게 개선되었습니다. 이전 조작기는 종종 1초의 상당 부분이 걸려 실시간 사용에는 너무 느렸으며 단일 이미지에만 적용할 수 있었습니다. 새 트랜스폼 속성은 필요하다면 프레임마다 바꿀 만큼 빠르고 모든 디스플레이어블에 적용할 수 있습니다. 이제 matrixcolor를 사용하는 Transform을 레이어에 적용하여 레이어 전체의 색을 바꿀 수 있습니다. 별도 이미지 세트 없이 게임을 세피아나 흑백으로 만들 수 있습니다.
이미지 조작기와 트랜스폼 속성의 matrixcolor에는 몇 가지 차이가 있습니다. 새 버전은 4x4 행렬과 알파를 미리 곱한 색을 사용하므로 같은 행렬을 그대로 쓸 수 없습니다. 대신 새로 제공되는 여러 ColorMatrix 객체를 사용해야 합니다.
새 blur로 자식을 지정 픽셀만큼 흐립니다.
Python 2/3 호환 모드
Ren'Py는 아직 Python 3에서 지원되지 않지만, 이 릴리스에는 Python 2와 Python 3 양쪽에서 작동하는 스크립트를 작성하기 시작할 수 있도록 여러 기능이 포함됩니다.
future로 표준 라이브러리 호환성을 제공하여 이름이 바뀐 모듈을 Python 3 이름으로 가져옵니다.
새 rpy python 3으로 시작하는 .rpy는 Python 3 호환 모드로 컴파일하며 두 가지가 바뀝니다.
Ren'Py는 나눗셈 변경을 포함한 Python 3의 의미를 에뮬레이션하는 모드로 파일을 컴파일합니다. Python 3에서
1/2는 0이 아니라 .5입니다. 표현식의 자료형이 바뀌므로 디스플레이어블 위치가 달라질 수 있습니다.1//2는 이전 의미를 유지합니다.해당 .rpy에서 직접 호출한 dict의
items,keys,values는 목록 대신 뷰를 반환하도록 동작을 바꿉니다. 이 메서드의 Python 3 동작과 같지만, 저장하거나 롤백에 참여하기 전에는 명시적으로 목록으로 변환해야 합니다.
라이브러리 업그레이드와 플랫폼 지원
Ren'Py 7.4에서는 빌드 시스템을 다시 작성했습니다. Ren'Py 빌드에 필요했던 여러 시스템을 webasm을 제외한 모든 플랫폼을 처리하는 단일 빌드 플랫폼으로 교체했습니다. 이 변경과 함께 Ren'Py에서 사용하는 모든 라이브러리도 더 새로운 버전으로 업데이트했습니다.
공식 플랫폼 목록도 조금 바뀌었습니다. 최신 목록은 다음과 같습니다.
플랫폼 |
CPU |
참고 |
|---|---|---|
Linux |
x86_64 |
최소 버전을 Ubuntu 16.04로 높였습니다. |
Linux |
i686 |
최소 버전을 Ubuntu 16.04로 높였습니다. |
Linux |
i686 |
최소 버전을 Ubuntu 16.04로 높였습니다. |
Linux |
armv7l |
Raspberry Pi용이며 Raspian Buster를 사용합니다. |
Windows |
x86_64 |
64비트 Windows Vista 이상용 새 이식판입니다. |
Windows |
i686 |
최소 버전을 Windows Vista로 높였습니다. |
macOS |
x86_64 |
macOS 10.10+ |
Android |
armv7a |
Android 4.4 KitKat |
Android |
arm64 |
Android 5.0 Lollipop |
Android |
x86_64 |
Android 5.0 Lollipop |
iOS |
arm64 |
모든 64비트 iOS 기기, iOS 11.0+ |
iOS |
x86_64 |
64비트 iOS 시뮬레이터, iOS 11.0+ |
웹 |
webasm |
최신 웹 브라우저 |
가장 큰 추가는 64비트 Windows로, 모든 주요 데스크톱/모바일에서 64비트를 제공합니다. 새 renpy.bits로 32/64비트를 확인할 수 있습니다. 예를 들어 config.image_cache_size_mb를 적절히 설정할 수 있습니다.
32비트(armv7l) iOS 지원을 종료합니다. Apple 지원도 끝났고 필요한 OpenGL ES를 지원하지 않습니다.
웹
새 컴파일 기법으로 브라우저 실행이 훨씬 빨라졌습니다.
웹 플랫폼용으로 빌드한 게임은 이제 플레이 중 웹 서버에서 이미지와 오디오 파일을 다운로드할 수 있습니다. 해당 이미지나 소리가 예측되면 다운로드를 시작합니다. 따라서 게임을 처음 실행하기까지 걸리는 시간과 메모리 사용량을 줄일 수 있습니다.
터치 기기 브라우저에서 wasm 게임의 키보드 입력이 어려운 문제를 보완하는 터치 키보드를 표시합니다.
로딩 스플래시에 애니메이션을 포함한 WebP를 사용할 수 있습니다.
Python 모듈을 더 제공하여 네이티브 환경과 가까워졌습니다.
iOS 브라우저 지원을 개선했습니다.
Steam
런처의 “환경설정(preferences)”, “라이브러리 설치(Install libraries)”, “Steam 지원 설치(Install Steam Support)”에서 설치합니다.
새 config.steam_appid가 steam_appid.txt를 생성합니다. define이나 python early에서 설정해야 합니다.
번역
중국어 간체, 일본어, 한국어를 업데이트하고 통합 글꼴을 사용합니다.
Neoteus가 제공한 중국어 간체 튜토리얼 번역을 추가했습니다.
폐기 예정 및 제거 사항
앞서 설명했듯 Windows XP를 지원하지 않습니다.
앞서 설명했듯 32비트 iOS를 지원하지 않습니다.
5년 넘게 갱신되지 않고 배포 사이트도 사라진 Editra 다운로드를 제거했습니다.
소프트웨어 렌더러는 완전 제거는 아니지만 단순화하여 게임플레이 옵션에서 뺐습니다. GPU 렌더러 문제를 안내하는 용도로 제한됩니다.
기타
컨트롤러 반복을 지원하고 라이브러리를 인기 컨트롤러 다수를 지원하도록 컴파일했습니다.
Android/iOS에서 소프트웨어 동영상 재생을 사용하여 모든 동영상 지원 플랫폼에서 같은 파일을 씁니다.
config.mouse가 SDL2 컬러 커서를 사용하여 대개 하드웨어 가속과 이동 지연 감소를 제공합니다.
define으로 딕셔너리 키를 설정합니다.
# Ren'Py was started in 2004.
define age["eileen"] = 2020 - 2004
define에 +=와 |= 갱신 연산자를 사용할 수 있습니다.
define config.keymap['dismiss'] += [ 'K_KP_PLUS' ]
# This assumes endings is a set.
define endings |= { "best" }
오디오 파일을 재생할 때 play와 queue의 새 volume 절을 사용하여 상대 오디오 채널을 지정할 수 있습니다.
트랜스폼의 새 fit 속성으로 이미지와 가로세로 비율이 다른 크기에 맞추는 여러 방식을 사용할 수 있습니다. 예를 들어 이미지가 지정 크기 안에 완전히 들어가도록 조절하거나 지정 크기를 완전히 덮도록 조절할 수 있습니다.
xpan과 ypan이 크기를 두 배로 만들지 않아 위치 속성과 조합하기 쉽습니다.
renpy.input()의 허용/금지 규칙에 정규식을 쓸 수 있습니다.
grid의 margin이 grid 바깥, 포함 뷰포트 안에 적용됩니다.
{alt}는 화면에 보이지 않고 자동 읽기로만 읽으며 {noalt}는 반대로 작동합니다.
런처 창 크기를 바꿀 수 있고 환경설정에 기본 크기 복원 버튼을 추가했습니다.
새 build.mac_info_plist로 Mac 앱을 쉽게 사용자 지정합니다.
requests를 포함하여 웹 접근이 쉬워졌습니다.
PAUSE 키에 게임 메뉴 기능을 부여했습니다.
7.3.5
수정 사항
데스크톱 프리스플래시를 클릭해도 응답 없음이 되지 않도록 다시 구현했습니다.
iOS에 새 모듈을 포함하여 앱을 컴파일할 수 있습니다.
기타 변경 사항
audio 네임스페이스를 자동 정의하는 audio를 런처에 표시하고 새 프로젝트에 추가합니다.
새 config.exception_handler로 예외 처리 전체를 대체합니다.
7.3.4
수정 사항
7.3.3의 주요 그래픽 오류를 수정했습니다.
Windows에서 전체 화면/창 모드 전환 시 텍스처를 다시 로드하지 못해 잘못된 텍스처가 표시되었습니다.
모든 플랫폼에서
Flatten()사용 시 그래픽 오류가 생길 수 있었습니다.
기타 변경 사항
동적 이미지의 모든 위치에 "[prefix_]"를 쓸 수 있습니다. 특히 add로 버튼, Drag 등 포커스 가능한 요소에 추가한 경우에도 됩니다.
제작자 정의 스크린 언어 문이 if 자식을 받을 수 있습니다.
드래그 앤드 드롭과 갱신된 스크린의 상호 작용을 개선했습니다.
7.3.3
오디오
audio가 audio 네임스페이스를 자동 정의합니다. game/audio/overture.ogg를 다음처럼 재생합니다.
play music overture
새 AudioData()로 프로그램 생성 또는 파일 이외 출처의 압축 오디오를 제공합니다. wave와 sunau도 포함합니다.
모노 혼합 문제로 여러 WAV가 재생되지 않던 것을 수정했습니다. (여전히 WAV는 권장하지 않습니다.)
플랫폼
Mac용 Ren'Py는 이제 서명과 공증을 거친 바이너리로 배포됩니다. 이 과정에 매우 오랜 시간이 걸리므로 Ren'Py 자체의 macOS 바이너리 서명 기능은 제거했습니다. 대신 외부 스크립트에서 서명과 공증을 처리합니다.
Android 최소 버전을 Android 19(4.4 KitKat)로 낮췄습니다.
웹의 변경 사항은 다음과 같습니다.
스크린 변형을 감지하고 설정합니다.
전체 화면을 개선했지만 켜려면 클릭해야 할 수 있습니다.
페이지 떠나기를 감지하여 영구 데이터를 저장할 수 있습니다.
index.html의 DEFAULT_GAME_FILENAME으로 game.zip 이름을 바꿀 수 있습니다.
이식 가능한 HTTP 요청(native+renpyweb): https://github.com/renpy/renpyweb/blob/master/utils/asyncrequest.rpy를 참조하세요.
WebSocket 테스트용 Python 웹 네트워킹을 켜며 socket 모듈에서 별도 조치 없이 제공합니다.
HTTP Cache-Control로 더 원활하게 업데이트합니다.
pygame.draw를 포함하여 Canvas를 지원합니다.
WebGL 호환성을 개선했습니다.
기타 변경 사항
GL 재작성 프로파일링에서 7.3.0의 프레임버퍼 객체 전환이 일부 성능 회귀의 원인임을 확인했습니다. FBO 사용 방식을 바꿔 성능을 개선했습니다.
renpy.input()에 사용할 스크린 이름을 지정합니다.
스크린의 list/dict/set 생성을 올바르게 분석하여 더 많은 요소를 상수로 판단하고 성능을 개선합니다.
롤백 시 notify를 숨깁니다.
NVL 스크린이 창을 표시한다고 알려 window show 문제를 막습니다.
대사가 있는 메뉴 같은 여러 부분의 문에서 from_current가 true인 Call()을 사용하면 첫 부분으로 돌아가 대사를 표시합니다.
더 많은 함수가 태그 기본 레이어를 사용합니다.
renpy.is_init_phase()를 추가했습니다.
메뉴 문의 대사에서도 자동 음성이 작동합니다.
수년간 사용되지 않은 GLES1을 제거했습니다.
SelectedIf()와 SensitiveIf()가 다른 액션을 인수로 받습니다.
여러 BarValue의 force_step으로 최근접 단계값에 반올림합니다.
Frame()의 tile에 "integer"를 지정하여 정수 횟수로 반복합니다.
Character()의 dynamic이 true이면 name에 함수/호출 가능 객체를 지정합니다.
번역
한국어와 스페인어를 업데이트했습니다.
7.3.2
수정 사항
이전 릴리스의 플랫폼 변수 회귀를 수정했습니다.
번역
스페인어를 업데이트했습니다.
7.3.1
변경 사항
설명 텍스트 기능을 업데이트했습니다. 시각 장애 사용자에게 장면을 설명하기 위해 자동 읽기가 켜졌을 때 표시하는 텍스트입니다. 이제 alt 캐릭터로 접근하며 이전 sv 캐릭터도 별칭으로 유지합니다. 서술자 대신 사용자 지정 캐릭터로 설명 텍스트를 표시할 수도 있습니다.
항상 미디어 시스템을 초기화하여 오디오가 없어도 동영상을 재생합니다.
대부분의 디스플레이어블에서 기본 포커스를 받을 요소를 선택하던 default 속성을 default_focus로 바꾸어 default 문과 충돌하지 않게 했습니다. 이제 정수를 받으며 포커스 번호가 가장 높은 요소에 포커스를 줍니다.
Flatten()이 자식의 위치를 전달합니다.
renpy.random.Random의 시드 난수 생성기도 롤백을 지원합니다.
Android/iOS 에뮬레이션에서 renpy.android, renpy.ios, renpy.windows, renpy.mobile을 올바르게 설정합니다.
Renpyweb이 저장 생성 날짜와 시각을 기록합니다.
수정 사항
텍스트 보간 스크린이 갱신되지 않거나 잘못 갱신되던 상당히 큰 문제를 수정했습니다.
이미지 예측 스레드에서 예측 루틴을 올바르게 실행합니다.
{clear} 문제를 수정했습니다.
대부분 정상 작동하지 않던 config.end_game_transition을 수정했습니다.
번역
러시아어, 한국어, 스페인어를 업데이트했습니다.
7.3.0
Renpyweb
Sylvain Beucler의 기여로 Ren'Py에서 HTML5 웹 플랫폼용 배포판을 생성할 수 있습니다. Web Assembly 표준을 지원하는 최신 웹 브라우저에서 실행됩니다. 현재 구현은 실행 전에 전체 게임을 브라우저로 다운로드하므로 작은 게임이나 큰 게임의 데모용입니다.
웹 지원은 베타로 표시됩니다. 웹 플랫폼의 제약, 특히 스레드 부재로 인해 이미지를 너무 오래 로드하면 소리가 깨지는 등의 문제가 생길 수 있기 때문입니다. 따라서 다른 모든 플랫폼에서는 잘 작동하는 Ren'Py 게임도 브라우저에서는 제대로 작동하지 않을 수 있습니다. 브라우저 자체가 개선됨에 따라 구현도 개선하고 궁극적으로 베타 표시를 제거할 예정입니다.
런처의 새 “웹(Web)”에서 빌드합니다. 작은 웹 서버도 포함하여 제작자의 브라우저에서 테스트합니다.
사용자 정의 문
제작자 정의 문과 Lexer를 확장하여 여러 기능을 개선했습니다. Lexer 변경은 다음과 같습니다.
한 줄이나 블록의 남은 모든 줄을 Ren'Py 문으로 분석하도록 요청할 수 있습니다.
오류를 포착하여 전체 문 대신 일부로 범위를 제한할 수 있습니다.
renpy.register_statement()에 새 기능용 인수를 추가했습니다.
predict_all은 가능한 다음 문을 모두 예측하고 predict_next는 다음 실행을 정하는 함수를 받습니다.
새 post_execute 인수로 다음 문, 즉 제작자 정의 문 바로 뒤의 문에서 실행할 execute 함수를 지정합니다. 이를 통해 문을 실행하고 내부 블록을 실행한 다음 블록 뒤에서 정리 작업을 하는 패턴을 만들 수 있습니다. (예를 들어 레이블 역할을 하는 이벤트를 실행한 뒤 작업이 끝나면 디스패처로 돌아가는 방식입니다.)
새 post_label은 뒤에 놓을 레이블을 제공하는 함수를 지정하며 call의
from처럼 작동합니다.
Ren'Py는 이제 제작자 정의 문의 구문 분석 결과를 .rpyc 파일에 저장합니다. 더 복잡한 구문과 빠른 시작을 지원하지만, 제작자 정의 문의 parse 함수를 변경하면 강제 재컴파일이 필요할 수 있습니다.
스크린 언어 개선
요소의 as로 객체를 가져옵니다. 특히 Drag 객체의 메서드를 호출하기에 유용합니다.
on이 이벤트 목록을 받습니다.
스크린의 sensitive로 상호 작용 가능 여부를 정합니다.
스크린 Python 문 뒤의 비상수 속성에 오류를 표시합니다. 매우 드물고 거의 항상 실수입니다.
텍스트 개선
닫는 태그가 필요 없는 자체 닫힘 사용자 정의 텍스트 태그를 지원합니다.
서식에 새 플래그 세 가지를 지원합니다.
"[varname!u]"는 대문자로 바꿉니다.
"[varname!l]"은 소문자로 바꿉니다.
"[varname!c]"는 첫 글자를 대문자로 바꿉니다.
Android 및 iOS 개선
지원한다고 보고하는 기기에서 FBO를 사용하여 Android/iOS의 focus_mask가 작동합니다.
올해 말 Google Play에서 필수가 되는 Android 64비트 ARM을 생성합니다.
사용자가 진행하지 못하는 문제를 해결하기 위해 Android 텍스트 입력을 다시 작성했습니다. 문제의 원인이었던 자동 완성을 제거했습니다. 입력기가 필요한 언어는 작동하려면 더 큰 재작성이 필요하지만, 직접 입력하는 키보드는 이제 모두 올바르게 처리할 수 있을 것입니다.
번역
Arda Güler가 런처와 예제를 튀르키예어로 번역했습니다.
Moshibit가 튜토리얼을 스페인어로 번역했습니다.
프랑스어, 일본어, 한국어, 러시아어, 스페인어를 업데이트했습니다.
기타 개선 사항
side가 제어 문자열 순서로 자식을 그립니다.
say, menu, renpy.call_screen의 _mode로 진입 모드를 지정합니다.
renpy.show_screen()과 renpy.call_screen()이 zorder를 받습니다.
모노 파일을 양쪽에 절반 출력하던 것에서 스테레오와 같은 볼륨으로 재생합니다.
새 config.load_failed_label로 현재 문을 찾지 못해 불러오기 실패 시 이동할 레이블을 지정하여 자체 복구를 구현합니다.
새 config.notify로 알림을 가로채 사용자 지정합니다.
이전/새 태그 집합을 전달하도록 config.say_attribute_transition_callback을 비호환 변경했습니다.
수정 사항
아랍어 악센트 등 특정 문자를 누락하던 문제를 수정했습니다.
내장 OpenDyslexic 파일명을 바꾸어 게임 배포 사본과 충돌하지 않습니다.
7.2.2
a로 여는 접근성 메뉴를 추가했습니다. 플레이어가 글꼴을 재정의하고 텍스트 크기/간격과 자동 읽기를 조정합니다.
공개 game(/mnt/sdcard/Android/package/files/game)의 파일이 본 게임을 대체합니다. 7.2.0 기능으로 나열했지만 제대로 작동하지 않았습니다.
번역 과정의 say에도 임시 이미지 속성을 포함합니다.
itch.io 업로드 시 butler를 직접 다운로드하여 Itch 앱의 위치/구조에 의존하지 않습니다.
DictValue(), FieldValue(), VariableValue(), ScreenVariableValue()의 새 action을 값 변경마다 실행합니다.
롤백을 최적화하여 수거할 가비지를 줄였습니다.
7.2.1
iOS 개선
프로젝트 생성 시 iOS 버전을 설정합니다.
ios-icon.png와 ios-launchimage.png로 필요한 크기의 아이콘과 실행 이미지를 만듭니다.
기타 개선 사항
renpy.in_rollback()이 불러오기 직후 롤백에서도 True를 반환합니다. 다음으로:
python:
if not renpy.in_rollback():
renpy.run(ShowMenu('save'))
처음 플레이할 때만 저장 메뉴를 표시하고 불러오기/롤백에서는 표시하지 않습니다.
config.say_attribute_transition_callback으로 say별 전환을 선택합니다.
새 RENPY_SEARCHPATH로 시작 시 config.searchpath를 재정의합니다.
수정 사항
== 재정의 시 !=의 의미도 일치하는지 검사했습니다.
add로 트랜스폼을 스크린에 추가할 때의 문제를 수정했습니다.
extend에서 새 인수가 확장 대상 문의 인수보다 우선합니다.
동적 이미지 동등성에 범위를 고려하여 일부 스크린 이미지 갱신 문제를 해결했습니다.
macOS의 config.save_dump true 충돌을 수정했습니다.
config.profile true 충돌을 수정했습니다.
Android 키보드에서 이메일/암호/전화번호 대신 텍스트 입력을 명시적으로 요청합니다.
menu를 통한 롤포워드가 안 되던 문제를 수정했습니다.
메뉴를 통한 롤포워드 버그를 수정했습니다.
7.2.0
임시 say 속성
일반 속성처럼 say에 넣지만 대사가 끝나면 복원되는 임시 속성을 지원합니다. 예를 들어:
show eileen happy
e "행복해요."
e @ vhappy "정말 행복해요!"
e "여전히 행복해요."
첫 대사와 마지막 대사에서 Eileen은 happy 표정을 사용합니다. 두 번째 대사 앞에는 vhappy 표정을 표시하고, 그 앞에서 이전 표정(이 경우 happy)으로 교체합니다.
텍스트
창이 기본 크기가 아닐 때의 텍스트를 변경했습니다.
위쪽 대신 기준선에 맞춰 정렬합니다. 절대 외곽선 오프셋에서 중요합니다.
outline_scaling으로 창 배율에 따른 외곽선 배율을 선택합니다.
Text 배치 시 yanchor에 renpy.BASELINE을 지정하면 첫 줄 기준선이 기준점이 됩니다.
문
새 window auto show와 window auto hide로 창을 표시/숨기면서 자동 대사 창 관리를 유지합니다.
show screen과 hide screen의 with는 show와 hide처럼 작동합니다.
use의 expression으로 리터럴 이름 대신 표현식/변수로 포함할 스크린을 선택합니다. Use를 참조하세요.
변경 사항
새 renpy.is_skipping()이 건너뛰기 여부를 보고합니다.
input의 새 copypaste가 true이면 Ctrl+C/V를 허용합니다. 콘솔과 런처에서 켜져 있습니다.
Preference("display", "window")가 화면보다 큰 창을 만들지 않습니다. gui.init() 크기가 최대보다 크면 현재 창이 최대일 때 선택 상태가 됩니다.
제작자 정의 문의 Lexer 메서드를 추가하여 인수, 이미지 이름 구성 요소, 레이블, 구분된 Python을 분석합니다.
renpy.force_autosave()의 새 인수로 저장 완료까지 기다립니다.
ctc 스크린이 필요에 따라 여러 새 매개변수를 받습니다.
이미지를 흐리는 im.Blur()를 추가했습니다. 기여한 Mal Graty에게 감사드립니다.
LayeredImage 그룹은 이제 multiple 속성을 지원하여 같은 그룹의 여러 속성을 동시에 표시할 수 있습니다. 서로 충돌하지 않는 이미지에도 그룹의 자동 정의 기능을 적용할 수 있어 유용합니다.
마우스가 데스크톱 사이를 이동해도 Ren'Py는 전체 화면을 유지하며, 다시 로드하는 동안 최대화 창이 줄어들지 않도록 합니다.
config.allow_duplicate_labels를 define이나 init python에서 설정하여 중복 레이블을 허용합니다.
Movie()의 반복을 끄고 종료 시 연결된 정적 이미지를 표시할 수 있습니다. 실제 재생 전 이미지도 받습니다.
Android 변경
제공 도구 변경으로 SDK 다운로드가 안 되던 문제에 맞춰 수정했습니다.
키보드에 명시적 액션을 주어 Enter가 작동합니다.
Amazon 기기에 사이드로딩하면 Amazon 결제 API를 사용하여 이중 스토어 APK로 테스트할 수 있습니다.
공개 game(/mnt/sdcard/Android/package/files/game)의 파일이 본 게임을 대체합니다.
수정 사항
일부 발음 부호처럼 너비가 0이나 음수인 문자를 표시하지 못하던 버그를 수정했습니다.
트랜스폼 속성과 함께 스크린에 추가한 요소를 갱신하지 못하던 문제를 수정했습니다.
상호 작용 재시작 시 그룹 내 Drag 순서를 보존합니다.
xysize 같은 크기 속성을 이동 공간 대신 Drag 자체에 적용합니다.
디졸브 중 화면 맨 아래에 투명/검정/회색 선이 생기던 버그를 수정했습니다.
이미지 글꼴 회귀를 수정했습니다.
런처 탐색 메뉴의 새 파일 생성이 작동합니다.
메뉴 집합이 다시 작동합니다.
Function() 등에 비교 불가 자료형을 전달해도 충돌하지 않습니다.
롤포워드 실패 상황을 수정했습니다.
macOS Steam 오버레이 표시 문제를 수정했습니다.
7.1.3
테스트 변경이 남아 첫 시작에 config.default_language가 설정되던 단일 버그를 고치기 위한 7.1.2의 긴급 재출시입니다.
7.1.2
개선 사항
스크린에 익명 ATL을 포함할 수 있습니다.
screen hello_title():
text "안녕하세요.":
at transform:
align (0.5, 0.5) alpha 0.0
linear 0.5 alpha 1.0
새 SetLocalVariable()과 ToggleLocalVariable()로 use한 스크린 내부 변수를 설정합니다.
새 config.menu_include_disabled로 if에서 비활성화한 항목의 포함 여부를 정합니다.
Android 에뮬레이션에서도 Shift+I/R 등이 작동합니다.
값이 필요한 태그에 값이 없을 때 오류를 더 잘 보고합니다.
새 _version에 새 게임을 처음 만들 때의 게임 버전을 저장합니다. 이후 갱신은 제작자가 해야 합니다.
Movie()가 같은 파일에 색과 알파 마스크를 나란히 넣는 방식을 지원하여 두 동영상의 동기화 어긋남을 막습니다.
FilePageNext()와 FilePagePrevious()에 자동/빠른 저장 페이지 이동 허용 인수를 추가했습니다.
새 config.skip_sounds로 건너뛰기 중 비반복 소리를 생략할지 정합니다.
번역
시스템 로캘을 자동 감지하여 언어를 설정합니다. config.enable_language_autodetect와 번역을 참조하세요.
프랑스어, 독일어, 한국어, 러시아어, 중국어 간체를 업데이트했습니다.
수정 사항
Windows의 RTL(아랍어/히브리어 등) 버그로 문자열 뒤 절반이 손상되던 것을 수정하여 잘못된 문자를 방지합니다.
없는 이미지의 접두사 이미지만 있을 때 오류를 보고합니다. 이전에는 eileen happy가 있고 eileen happy unknown을 표시하면 추가 속성을 무시했습니다.
Lint가 레이어 이미지처럼 이름에 없는 속성을 받는 이미지를 더 잘 처리합니다.
휴대전화에 적합한 선택 메뉴 이미지를 생성합니다.
Android 수정
새 Android 지원이 64비트 Java 8에서만 잘 작동하여 64비트 요구를 명시했습니다.
7.1.1
기록 수정
대사에 이스케이프된 대괄호가 있으면 기록에 문제가 있었습니다. 예를 들어:
"문제가 생긴 것 [[같아요]."
"I [think] I'm having a problem."이 기록에 추가되면 think를 치환하려다 충돌했습니다.
기록 스크린에 substitute False를 추가하면 해결됩니다. 새 프로젝트에는 적용했지만 기존 프로젝트는 직접 수정해야 합니다. 새 스크린은 다음과 같습니다.
screen history():
tag menu
## Avoid predicting this screen, as it can be very large.
predict False
use game_menu(_("대사 기록"), scroll=("vpgrid" if gui.history_height else "viewport"), yinitial=1.0):
style_prefix "history"
for h in _history_list:
window:
## This lays things out properly if history_height is None.
has fixed:
yfit True
if h.who:
label h.who:
style "history_name"
substitute False
## Take the color of the who text from the Character, if set.
if "color" in h.who_args:
text_color h.who_args["color"]
$ what = renpy.filter_text_tags(h.what, allow=gui.history_allow_tags)
text what substitute False
if not _history_list:
label _("대사 기록이 없습니다.")
substitute False가 새 줄입니다. 문제 방지를 위해 기록 스크린에 적용하세요.
Android 개선
빌드 도구 메모리를 Google 기본값 1536 메가바이트로 설정합니다. rapt/project/gradle.properties에서 바꿉니다. 큰 게임 빌드를 위해 64비트 Java 8을 확인하세요.
Android에 Enter를 입력으로 전달하라고 명시합니다.
Android 8(Oreo) 미만의 아이콘 자르기와 크기를 수정했습니다.
Ren'Py는 x86_64 APK에 다른 숫자 버전을 부여합니다. 따라서 x86_64와 armeabi-v7a 빌드를 Google Play와 다른 스토어에 모두 업로드할 수 있습니다. 이전처럼 먼저 한 빌드를 만든 뒤 버전을 직접 바꾸고 다른 빌드를 만들 필요가 없습니다.
기타 개선 사항
너비 0 문자의 그리지 않기를 직접 처리하여 글꼴이 지원하지 않아도 사각형이 나타나지 않습니다.
줄바꿈 없는 공백과 너비 0 줄바꿈 없는 공백으로 텍스트 내 이미지의 줄바꿈을 막습니다.
Character()의 ctc_position에 "nestled-close"를 추가하여 진행 표시기와 다른 줄 사이의 줄바꿈을 막습니다.
Drag의 보조 클릭(데스크톱 오른쪽 클릭/터치 길게 누르기)을 지원합니다.
수정 사항
SetVariable()과 ToggleVariable()에 네임스페이스/필드를 허용하여 SetVariable("hero.strength", hero.strength + 1)이나 ToggleVariable("persistent.alternate_perspective")를 쓸 수 있습니다.
window auto가 메뉴의 대사/설명 여부를 고려하여 적절히 처리합니다.
빌드에 사용할 내장 fribidi 소스를 -source에 포함합니다.
음성 유지 환경설정과 기록/음성 재생 액션의 상호 작용을 여러 부분 수정했습니다.
7.1
Android
이 릴리스에서는 Android 지원을 대폭 다시 작성하여 현대화했습니다. Ren'Py 게임을 Google Play 스토어에 업로드하는 데 필요한 작업입니다. 일부 변경으로 게임 파일을 갱신해야 할 수 있습니다. 특히 아이콘 형식이 바뀌었으므로 아이콘을 다시 만들어야 합니다.
최소 Android 19(4.4 KitKat)로 높였고 Android 28(9 Pie)을 대상으로 합니다.
x86_64를 추가하고 x86을 제거했습니다. 일부 x86은 이진 변환으로 ARM 버전을 실행할 수 있습니다.
독백 모드
삼중 따옴표로 여러 대사/서술 블록을 한 번에 작성합니다. 예를 들어:
e """
이것은 첫 번째 대사 블록입니다.
그리고 이것은 두 번째 블록입니다.
"""
두 대사 블록을 만듭니다. 독백 모드를 참조하세요.
독백용 {clear}가 한 줄에 홀로 있으면 nvl clear와 같습니다. NVL 독백 모드를 참조하세요.
속성이 있는 say 변경
해당 이미지 태그가 표시되지 않은 상태에서 속성이 있는 say 문을 처리하는 방식이 바뀌었습니다. 이전에는 가장 최근의 say-with-attributes 문에 지정된 속성으로 표시할 사이드 이미지를 선택했습니다.
이제 Ren'Py는 지정한 속성과 기존 속성을 함께 사용하여 사이드 이미지를 결정합니다. 따라서 이미지가 표시되지 않을 때의 say-with-attributes도 표시 중일 때와 같은 방식으로 작동합니다. 속성만으로 하나의 사이드 이미지를 결정할 수 없으면 지정한 속성을 모두 포함하면서 기존 속성을 최대한 많이 포함하는 이미지를 선택합니다.
변경 속성만 지정하는 것이 자연스러운 레이어 사이드 이미지를 돕기 위한 변경입니다.
업데이터 변경
Ren'Py 자체의 업데이터는 이제 업데이트할 때마다 업데이트 채널을 선택하도록 합니다. 매번 어느 채널로 갱신하는지 명확히 하여, 정식 릴리스가 나온 뒤 실수로 사전 릴리스나 야간 빌드로 업데이트하는 일을 방지하기 위한 변경입니다.
일부 업데이트에서 사전판 채널이 없는 것은 정상입니다. 이전과 달리 사전판이 있을 때만 나타납니다.
번역
Muhammad Nur Hidayat Yasuyoshi가 런처, 템플릿, The Question을 라틴 문자 말레이어로 번역했습니다.
한국어를 대폭 업데이트했습니다.
RAPT 문자열을 영어 이외 언어로 번역할 수 있습니다.
기타
실패하거나 순환에서 밀려날 수 있던 자동 저장과 달리 종료 시 안정적으로 저장합니다. _quit_slot으로 제어합니다.
FileSave(), FileLoad(), FileAction() 등에 slot=True를 주면 페이지 없이 이름 있는 슬롯을 불러옵니다.
Shift+D에서 표시/숨김 이미지의 속성 스크린을 엽니다.
태그와 보간을 건드리지 않는 텍스트 변환 renpy.transform_text()을 추가했습니다.
Gallery의 make_buttons가 button 대신 empty 스타일을 상속하여 button 속성 문제를 막습니다.
텍스트 표시 완료 코드를 마우스 클릭처럼 event에서 호출하여 메뉴가 있을 때 상호 작용 종료를 방지합니다.
이미지 버튼/맵의 auto 평가에 디스플레이어블 접두사를 지원합니다.
다음 NVL 문의 캐릭터가 미정의일 때 현재 NVL 문에 오류가 나던 버그를 수정했습니다.
중첩 ATL은 가장 바깥뿐 아니라 두 상태를 모두 전달합니다.
창, 바, 프레임과 버튼/이미지맵 등의 동적 이미지를 갱신합니다.
modal True에서 코어 100%를 소모하던 문제를 수정했습니다.
OS 설치 대신 fribidi 사본을 포함합니다.
새 box_wrap_spacing으로 box_wrap의 행/열 간격을 제어합니다.
adjust_spacing에 "horizontal"/"vertical"을 지정하여 해당 방향만 조정합니다.
LayerdImageProxy에 보간 문자열을 사용할 수 있습니다.
새 config.context_callback을 게임 시작이나 메뉴 등 새 컨텍스트 진입 시 호출하여 음성/소리를 멈출 수 있습니다.
Drag()와 drag의 새 activated는 사용자가 처음 누를 때 이동 전에 호출합니다.
7.0
Ren'Py 7.0은 6 이후 10년 넘는 개발의 결실입니다. ATL, 스크린 언어, OpenGL/DirectX 가속, Android/iOS, 번역, 접근성 등 수많은 기능을 도입했습니다.
6.0~7.0은 이력의 다른 항목과 웹 사이트의 이전 이력을 참조하세요. 나머지는 7.0과 6.99.14.3의 차이입니다.
레이어 이미지
레이어 이미지는 Ren'Py에서 사용할 이미지를 정의하는 새 방식입니다. Photoshop이나 다른 프로그램에서 여러 레이어로 만든 스프라이트를 위한 기능입니다. 레이어 이미지 시스템은 표시할 때 지정한 속성과 Python 조건을 사용하여 어느 레이어를 표시할지 결정합니다.
레이어 이미지는 Composite()와 ConditionSwitch()로 여러 레이어의 이미지를 정의하던 방식을 대체합니다. 정의를 쉽게 작성하는 언어를 제공하며, 적절한 이름의 파일에서 정의 일부를 자동으로 생성할 수 있습니다. ConditionSwitch로는 할 수 없는 방식으로 속성을 예측하고 인터랙티브 디렉터와 함께 작동하므로 Ren'Py의 나머지 기능과도 더 잘 통합됩니다.
딕셔너리 화면 전환
딕셔너리 화면 전환으로 with 문과 일부 다른 함수에서 하나 이상의 레이어에 화면 전환을 적용할 수 있습니다. Ren'Py는 이 전환을 기다리며 정지하지 않습니다. 따라서 대사를 표시하는 동안 스프라이트에만 화면 전환을 적용할 수 있으며, 이 작업도 편리해집니다.
변경 사항
touch_keyboard를 어떤 레이어에도 배치하도록 사용자 지정합니다.
이전 튜토리얼/템플릿을 제외했지만 이 버전 이상에 복사하면 계속 사용할 수 있습니다.
새 Scroll()로 뷰포트 위치나 바 값을 바꾸는 버튼을 만듭니다.
Dissolve(), ImageDissolve(), AlphaDissolve()가 alpha=True처럼 원본 알파를 반영합니다. 생략이 더 이상 최적화가 아니므로 더 많은 곳에서 같은 전환을 씁니다.
자동 이미지 정의를 999 초과 대신 init 0에서 하여 init에서 renpy.has_image()를 사용할 수 있습니다.
디렉터에 화면 위/아래 위치 선택 버튼을 추가했습니다.
스크린 for 문에 index 절을 추가했습니다.
for i index i.name in party:
...
지정하면 버튼/트랜스폼 상태 등을 원본 객체에 대응시키는 고유값을 반환해야 합니다.
번역과 발음처럼 두 종류 루비를 동시에 표시하는 대체 루비를 추가했습니다.
새 디스플레이어블 접두사로 이미지/파일/단색처럼 문자열로 접근하는 사용자 요소를 정의합니다.
2GB보다 큰 단일 파일(.rpa 등)이 든 .zip을 생성합니다. Zip64가 필요하여 특히 Windows XP 등은 해제를 지원하지 않을 수 있습니다.
새 renpy.get_hidden_tags()가 속성은 있으나 숨긴 태그 집합을 반환합니다. renpy.get_showing_tags()는 정렬 목록도 반환합니다.
ATL 등과 일관되게 동영상 스프라이트를 다시 표시하면 처음부터 재생합니다.
Craig P. Donson이 문서를 교정했습니다.
번역
Alexandre Tranchant가 튜토리얼과 The Question을 프랑스어로 번역했습니다.
일본어와 러시아어를 업데이트했습니다.
수정 사항
스크린이 표시되지 않을 때 hide/replaced를 처리하지 않던 회귀를 수정했습니다. 건너뛰기 중 발생할 수 있었습니다.
기본 영어에서 디렉터가 러시아어로 표시되던 문제를 수정했습니다.
Composite(), Crop(), Tile()을 실제 새 이름으로 사용할 수 있습니다.
콘솔 접근 시 잘못된 지점으로 롤백하여 콘솔에 잘못된 데이터가 보이던 문제를 수정했습니다.
이전 변경 이력
일부 Ren'Py 6 이력은 여기에 있으며 더 오래된 이력은 다음에서 확인합니다.