一个可以在 Windows 和 Android 上,基于 pygame 和 pysdl2 的 GUI 界面渲染引擎。
本来是想做一个Galgame的渲染引擎,但是因为种种原因演变成现在这个dirty code样。
Build for android:
requirements = python3==3.10.12,kivy==2.3.0,pyjnius==1.5.0,hostpython3==3.10.12,pygame,pysdl2,numpy
一种 Buildozer 的 Pygame 渲染解决方案。
能够在安卓平台上调用GPU完成渲染,且这部分接口和参数基本和 pygame 提供的一致,这意味着你可以直接通过更改调用名达到使用 SDL2 渲染的效果。
该模块并不依赖GalEngine,所以直接调用即可。
GalEngine 将部分 pygame 的接口替换为 SDL2 的接口,并做了 Texture/Renderer 渲染的实现,使其能够做简单的GPU渲染。
克隆本项目的源代码,使用sys.path.append("./GalEngine")
引入路径,import GalEngine as ge
导入总项目。
同上。直接导入import GalSDL2
,即可调用SDL2进行绘制。窗体、显示模式等更改参见 GalEngine.py。
GalGUI 里面存在:
class Switcher:
Surface = galengine.gsdl.SDLSurface if galengine.usingSDL2 else pygame.Surface
Font = galengine.gsdl.SDLFont if galengine.usingSDL2 else pygame.font.Font
SysFont = galengine.gsdl.SysFont if galengine.usingSDL2 else pygame.font.SysFont
def Rect(x, y, w, h):
return [x, y, w, h]
smoothscale = galengine.gsdl.scale if galengine.usingSDL2 else pygame.transform.scale
scale = galengine.gsdl.scale if galengine.usingSDL2 else pygame.transform.scale
flip = galengine.gsdl.flip if galengine.usingSDL2 else pygame.transform.flip
rotate = galengine.gsdl.rotate if galengine.usingSDL2 else pygame.transform.rotate
class draw:
rect = galengine.gsdl.draw.rect if galengine.usingSDL2 else pygame.draw.rect
class image:
load = galengine.gsdl.image.load if galengine.usingSDL2 else pygame.image.load
这意味着GalGUI会调用这里的基本绘画参数来完整GalGUI的全部功能,你可以将GalEngine.py中的usingSDL2更改,来达到在pygame与SDL2切换的目的。
"""
GalEngine By Himpq
"""
NO_LIMITED = 0xff
isAndroid = True
usingSDL2 = True # <-- change here
import sys
import os
sys.path.append("./GalEngine")
参见 Buildozer & WSL 2 打包Python文件为APK ,里面有我一路踩过的坑,以及后悔没早点转用 Unity。
在打包的时候记得把 GalEngine 作为资源文件一样打包进去即可。
你可以使用adb logcat | grep python
在设备上调试,这样会在终端显示报错信息。
在 Python for android 上,程序入场时会呈现加载界面(loading screen),会导致与SDL2渲染时间重合一部分,如果你有加载动画需要渲染,需要执行:
from android import loadingscreen
loadingscreen.hide_loading_screen()
移除加载界面。loadingscreen是python for android提供的接口。
在 Python for Android 中,程序的资源文件导入必须使用绝对路径,否则会出现找不到资源文件的错误。
在 GalEngine.GalGUI 中,如果 isAndroid
被设置为True,那么 GalEngine 会自动将所有传入模块的路径转换为绝对路径。
Ver0.1:
- 修复了 Font 重复绘制导致的内存溢出
- 引入了 Image 的缓存池机制,可以通过
GalSDL2.image.load(path, cache=True)
缓存该图片 - 加入了 SDLEvent 作为 pygame 转到 sdl2 的兼容层
- 修复了 Alpha 图层失效的问题
- 使用
GalSDL2.image.load
导入图片时,会莫名占用巨大的体积,一张图片接近20~200MB不等(样本范围:图片大小由1920x1080至6000x4000不等) - 图片缩放有问题,放大的大小与
pygame.transform.scale
不一致