Hintergrund: Als naiver Chukchi-Programmierer dachte ich: "Python ist so plattformübergreifend, dass ich ein Spielzeug für meinen Sohn schreibe, es auf einem Tablet laufen lasse und es spielen lasse." Infolgedessen dauerte es zwei Wochen, bis ich versuchte, eine Lösung für den Wechsel von PyOpenGL + Pygame zu Kivy zu finden, da ich kein klares Beispiel für die Verwendung von OpenGL mit Kivy fand. Vielleicht hilft meine Erfahrung jemandem, Zeit zu sparen.
Haftungsausschluss:
Ich fordere niemanden auf, Anwendungen in Python mit 3D-Grafiken für Android zu entwickeln. Dies ist nicht die klügste Option. Aber wenn Sie wirklich wollen, dann können Sie weiterlesen.
Kivy verfügt über eine integrierte Mesh-Lösung, die 3D-Grafiken erstellen kann. Beispiele sind auch nicht so einfach. Ich habe nacktes OpenGL bevorzugt.
Vielleicht habe ich Amerika entdeckt, als es versuchte, Indien zu finden. Ich hoffe, dass erfahrene Kameraden korrigieren und hinzufügen werden.
Bevor Sie mit der Arbeit mit 3D-Grafiken in Kivy beginnen, sollten Sie sich über die Bibliothek im Allgemeinen und deren Installation informieren (in den Handbüchern wird beispielsweise die Verwendung einer virtuellen Umgebung empfohlen).
Was ist das Problem? Die Kivy-Entwickler verstecken die Beschreibung der OpenGL-Funktionen geschickt auf ihrer offiziellen Website . Die Frage ist nur, wie es funktioniert.
, PyOpenGL+pygame kivy OpenGL :
from OpenGL.GL import *
from OpenGL.GL.shaders import *
:
from kivy.graphics.opengl import *
: PyOpenGL numpy , kivy tobytes(). kivy glPixelStorei glTexImage2D glTexStorage2D glTexSubImage2D. 2 ( in, out ) :
#ifdef GL_ES
precision highp float;
#endif
- - . PyOpenGL+pygame :
#:
import pygame
from pygame.locals import *
def init():
pygame.init()
pygame.display.set_mode((Width, Height), HWSURFACE | OPENGL | DOUBLEBUF)
''' , PyOpenGL '''
def main():
init()
while True:
''' '''
pygame.display.flip()
kivy App, , Widget. , Window, kivy . Window - WindowBase.
:
#:
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.core.window import Window
from kivy.base import EventLoop
from kivy.clock import Clock
def init():
''' , OpenGL '''
init()
class CustomWidget(Widget):
def __init__(self, **kwargs):
super(CustomWidget, self).__init__(**kwargs)
def update_glsl(self, nap):
''' '''
Window.flip()
class MainApp(App):
def build(self):
root = CustomWidget()
EventLoop.ensure_window()
return root
def on_start(self):
Clock.schedule_interval(self.root.update_glsl, 40 ** -1) # FPS
if __name__ == '__main__':
MainApp().run()
( OpenGL), . , Window flip(), . WindowBase. , , MainApp:
def passFunc(W):
pass
class MainApp(App):
def build(self):
root = CustomWidget()
EventLoop.ensure_window()
# :
Window.on_flip = lambda W = Window: passFunc(W)
return root
? , apk- . , (. , , ):
spec- .
- ? . - . FPS 51 15 25. :
Mein Sohn weigerte sich unterdessen, meine Rolle zu spielen, zumindest sieht er interessiert aus. Flach gezogene Spiele für einen Zweijährigen erweisen sich als besser geeignet. Dafür hat alles angefangen:
Chopped Snake Style - Ein paar Screenshots aus dem Debug-Schritt als Hommage an Jackie Chan: