2017-07-31 40 views
0

私はテクスチャにブリッジしてKivyに表示する画像データをいくつか持っています。画像データは同じ幅であり、ウィジェットよりも高さが高い。テクスチャが作成された後、スクロール効果のためにyテクスチャをアニメートしたいと思います。blit_bufferとposパラメータを使用してKivyのテクスチャをアニメ化する

以前は、バッファ全体をテクスチャに合わせていたし、ウィジェット自体の位置をアニメートしていました。ただし、バッファデータはGPUのサポートされている最大テクスチャサイズよりも大きい場合があり、画面に何も表示されません。

私は必要なソースバッファのセクションだけをblitし、テクスチャをウィジェットと同じサイズのままにしておく方がよいと考えました。

Kivyのドキュメントを見て、私はposパラメータがあることを発見しました。私はblit_bufferの呼び出しでドキュメントのyposのアニメーション化されたプロパティを使うことができると考えましたが、試してみると何も表示されませんでした。

posパラメータを(0、100)に変更して、パラメータの使用が期待どおりになったかどうかを確認しましたが、それでも表示されませんでした。これを(0、0)に切り替えると、期待どおりに動作します。

blit_buffer()を正しく使用していますか?画像データバッファの一部だけをblitする最良の方法は何ですか?

EDIT:問題はTexture.blit_bufferのPOS引数は()画像データの送信先の座標ではなく、ソースを指定していることだったようです

from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.core.image import Image 
from kivy.graphics.texture import Texture 
from kivy.graphics import Rectangle 

import array 

class MyWidget(Widget): 
    def __init__(self, **kwargs): 
     super(MyWidget, self).__init__(**kwargs) 

     texture = Texture.create(size=(512, 512)) 
     buf = [int(x * 255/(512*512*3)) for x in range(512*512*3)] 
     buf = array.array('B', buf).tostring() 

     texture.blit_buffer(
      buf, 
      colorfmt='rgb', 
      bufferfmt='ubyte', 
      pos=(0, 100) 
     ) 

     with self.canvas: 
      Rectangle(texture=texture, pos=self.pos, size=(512, 512)) 

class MyApp(App): 
    def build(self): 
     return MyWidget() 

if __name__ == '__main__': 
    MyApp().run() 

答えて

0

:私は、スタンドアロンスクリプトで、この問題を再作成座標。

PILを使用してイメージデータをトリミングし、各タイルがblitする複数のテクスチャを含むタイルレンダラーを作成することで、私の問題を解決しました。

関連する問題