1

気の利いた Kivy フレームワークを使用して、Android 用のゲームをプログラムしています。指定されたコード (描画に使用) を 1 秒間に 60 回実行するクロック コールバックを作成しようとしています。

何らかの理由で、Kivy クロック イベント内に描画したものが画面に描画されません。可能なすべての変数を排除するために、次のサンプル コードを使用しました。

import kivy
kivy.require('1.0.6')

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Ellipse


class MyPaintWidget(Widget):
    def on_touch_down(self, touch):
        with self.canvas:
            Color(1, 1, 0)
            d = 30.
            Ellipse(pos=(touch.x - d/2, touch.y - d/2), size=(d, d))


class MyPaintApp(App):
    def build(self):
        return MyPaintWidget()


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

これは問題なく動作します。画面をクリックすると、そこに黄色の円が表示されます。ただし、次のように変更すると:

import kivy
kivy.require('1.0.6')

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Ellipse
from kivy.clock import Clock


class MyPaintWidget(Widget):
    def update(self, t):
        with self.canvas:
            Color(1, 1, 0)
            d = 30.
            Ellipse(pos=(200 - d/2, 200 - d/2), size=(d, d))


class MyPaintApp(App):
    def build(self):
        m = MyPaintWidget()
        Clock.schedule_interval(m.update, 1.)
        return m


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

画面には何も描画されません。なんで?編集:クリックしたときにのみ画面に描画されることがわかりました。まだ役に立ちません - ゲームのイベント ループにこれを使用する必要があります。Kivy 1.4.0 (2 番目に新しい) と Ubuntu を使用しています。これは、Android でも意図したとおりに機能しません。

4

1 に答える 1

1

コードを実行できます-少し変更を加えたので、実際に毎秒呼び出されていることがわかります。これで、毎秒変化するDの値が出力され、大きな黄色の円が毎秒大きくなります。これがお役に立てば幸いです。

import kivy
kivy.require('1.0.6')

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Ellipse
from kivy.clock import Clock

class MyPaintWidget(Widget):
    d = 10
    def update(self, t):
        print("D is", self.d)
        with self.canvas:
            Color(1, 1, 0)
            self.d = self.d + 1
            Ellipse(pos=(200 - self.d/2, 200 - self.d/2), size=(self.d, self.d))


class MyPaintApp(App):
    def build(self):
        m = MyPaintWidget()
        Clock.schedule_interval(m.update, 1.)
        return m


if __name__ == '__main__':
    MyPaintApp().run()
于 2012-10-09T13:40:20.687 に答える