私はKivy Pongチュートリアルで遊んでいました。フレームワークの速度を上げ、いくつかのアイデアを実装できるかどうかを確認しました。私はPongの機能性の大半を取り除いたので、画面上でボールをバウンスするだけで、スクリーン上に複数のバウンスボールを生成するコードを追加しました。それはうまくいった。私はいくつかの余分なキャンバスの指示を追加したので、ボールが動いている方向を示す線が引かれていました。これは物事が変わったところです。最初のボールは、スクリーンのまわりで跳ね返り、ちょうど同じように動作します。しかし、それ以降のクリックでは、スクリーンから外れ、ランダムに方向と速度を変え、一般的には混沌とした振る舞いをするボールが生成されます。私は自分のコードを見ていて、何がうまくいかないのか分かりません。私はウィジェットへの参照をすべて保持し、それらをルートウィジェットに追加します。私はそれらの間で情報を共有していないようです...とにかく、ここにコードがあります。誰かが私を啓発するかもしれません。最新のkivyとpythonの使用3.6。Kivyウィジェットが誤って動作する
from random import randint from kivy.app import App from kivy.clock import Clock from kivy.config import Config from kivy.vector import Vector from kivy.uix.widget import Widget from kivy.properties import AliasProperty, ListProperty, NumericProperty, ReferenceListProperty class Playground(Widget): critters = ListProperty([]) def update(self, dt): for critter in self.critters: critter.move() if (critter.y self.height): critter.v_y *= -1 if (critter.x self.width): critter.v_x *= -1 self.score.text = "{}".format(len(self.critters)) def on_touch_down(self, touch): critter = Critter() critter.pos = touch.x, touch.y self.critters.append(critter) self.add_widget(critter) class Critter(Widget): angle = NumericProperty(0) v_x = NumericProperty(0) v_y = NumericProperty(0) velocity = ReferenceListProperty(v_x, v_y) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.velocity = Vector(5, 0).rotate(randint(0, 360)) self.angle = Vector(*self.velocity).angle(Vector(1, 0)) def move(self): self.pos = Vector(*self.velocity) + self.pos self.angle = Vector(*self.velocity).angle(Vector(1, 0)) class WorldApp(App): def build(self): game = Playground() Clock.schedule_interval(game.update, 1.0/60.0) return game if __name__ == '__main__': Config.set('kivy', 'desktop', 1) Config.set('kivy', 'exit_on_escape', 1) Config.set('graphics', 'resizable', 0) WorldApp().run()
とKVファイル
<Playground> score: score canvas: Color: rgb: 0.0, 0.1, 0.0 Rectangle pos: self.pos size: self.size Label: id: score pos: self.parent.width - self.size[0], self.parent.height - self.size[1] font_size: 16 size: self.texture_size <Critter> size: 30, 30 canvas: Rotate: angle: self.angle origin: self.center axis: 0, 0, 1 Color: rgb: 0.5, 0.0, 0.0 Ellipse: pos: self.pos size: self.size Color: rgb: 1, 1, 0.0 Line: width: 2 points: self.center[0], self.center[1], self.center[0] + self.size[0]/2, self.center[1]
これ以上ウィジェットが定義されていません。しかし、異なる角度で回転する複数のウィジェットが問題であるかどうかは疑問です。私はプッシュ/ポップのソリューションを試してみます。 –
それが助けになりました!今、私は期待される行動を得る。今私はポップ/プッシュが必要な理由を理解しようとしているつもりですが、それは私だけです:) –