2017-01-12 10 views
2

私は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] 

答えて

3

私はそれはあなたの問題を引き起こしているかどうかわからないんだけど、あなたのローテート命令がウィジェットルールで囲まれていないと、それ以降の任意のウィジェットに影響します - ので、各クリッターの回転は、後の1つに適用されます。

これを避けるには、PushMatrix:をキャンバスルールの上部に、PopMatrix:を下部に追加します。これらの命令は効果的に保存し、後で変更前の最初の回転状態に戻します。

+1

これ以上ウィジェットが定義されていません。しかし、異なる角度で回転する複数のウィジェットが問題であるかどうかは疑問です。私はプッシュ/ポップのソリューションを試してみます。 –

+1

それが助けになりました!今、私は期待される行動を得る。今私はポップ/プッシュが必要な理由を理解しようとしているつもりですが、それは私だけです:) –

関連する問題