2021年2月12日金曜日

Python+Kivy 備忘録 当然 kivy の文字描画関数も描画関数じゃない編

 
今度は文字ですよ。
予想はしていたのですが、描画領域に文字を描画する際もやっぱりラベルオブジェクトを生成する形で実現しています。
…のですが、label オブジェクトは他の描画オブジェクトとは様相が異なります。
生成されたオブジェクトを print すると

kivy.uix.label.Label object

と出ており、ellipse 等の kivy.graphics.vertex_instructions 系統とは別物のようです。
…と言うことは、開放の仕方も異なります。

で、書いてみたコードはこちら

from kivy.app import App
from kivy.uix.widget import Widget

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.clock import Clock

from kivy.uix.label import Label

class BtRev(Button):
    def on_press(self):
        self.parent.Rev()

class BoxMain(BoxLayout):
    orientation='vertical'
    def __init__(self,**kwargs):
        super(BoxMain,self).__init__(**kwargs)
        self.speed = 0.1
        self.text_x = 0.0
        self.list_la = []

        self.boxDraw = BoxLayout(size_hint_y=4)
        self.add_widget(self.boxDraw)

        self.b1 = BtRev(text='Rev',size_hint_y=1)
        self.add_widget(self.b1)

    def  Rev(self):
        self.speed = self.speed * -1.0

    def update(self,dt):
        with self.canvas.before:
            w = self.boxDraw.size[0]
            h = self.boxDraw.size[1]

            x = self.text_x * w - w/20.0
            y = self.boxDraw.top-h/2.0

            self.text_x = self.text_x + self.speed
            if self.text_x > 1.0:
                self.text_x = 0.0
            elif self.text_x < 0.0:
                self.text_x = 1.0

            for old in self.list_la:
                self.canvas.before.children.remove(old.canvas)
                self.list_la.remove(old)

            f_size =w/20
            if f_size < 10:
                f_size = 10

            self.list_la.append(Label(pos=(x,y),text='TEST',color=(1,1,1,1),font_size=f_size))

class BoundText(App):
    def build(self):
        bxmain = BoxMain()
        Clock.schedule_interval(bxmain.update, 1.0/12.0)
        return bxmain

if __name__ == "__main__":
    BoundText().run()

…うん、kivy の描画系は名前の付け方を変えてほしい。
というか、OS間の互換性を取るのが難しいのかもしれないけど、描画バッファに直接描画して、描画しっぱなしの所謂普通の描画関数にしてほしい。
古い考え方で書くと、画面描画をすべてスプライトで行っているような現状で、流石にゲームを作るのは無理なのでは無いかと感じますね。
いや、調べたら別の方法があるかもしれませんが。

0 件のコメント:

コメントを投稿