2016-12-29 18 views
1

私はKivyを使うことを学んでいるので、私はPongチュートリアルを歩き、コードを使いこなし始めました。だから、私はバウンスボール以外のすべてを取り除き、必要に応じて複数のボールを生成することに決めました。私が抱えている問題は、アプリケーションが既に動作しているときにボールを置くことができますが(例えば、タッチでボールを追加するなど)、アプリビルドでボールを追加すると右に配置。ここに私のコードがあります。接触したボールは、中心から正しく始まります。しかしbuild()で追加されたボールは、左下隅から始まります。どうして?さまざまなプロパティを持つ動くウィジェットを追加したいと思っていましたが、アプリケーション開始時に配置する方法を理解できないようです。Kivyの中央ウィジェット

 
#:kivy 1.0.9 
<World>: 
    canvas: 
     Ellipse: 
      pos: self.center 
      size: 10, 10 

<Agent>: 
    size: 50, 50 
    canvas: 
     Ellipse: 
      pos: self.pos 
      size: self.size 
 
from random import randint 

from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.properties import NumericProperty, ReferenceListProperty, ListProperty 
from kivy.vector import Vector 
from kivy.clock import Clock 


class World(Widget): 
    agents = ListProperty() 

    def add(self): 
     agent = Agent() 
     agent.center = self.center 
     agent.velocity = Vector(4, 0).rotate(randint(0, 360)) 
     self.agents.append(agent) 
     self.add_widget(agent) 

    def on_touch_down(self, touch): 
     self.add() 

    def update(self, dt): 
     for agent in self.agents: 
      agent.move() 
      if agent.y < 0 or agent.top > self.height: 
       agent.velocity_y *= -1 
      if agent.x < 0 or agent.right > self.width: 
       agent.velocity_x *= -1 


class Agent(Widget): 
    velocity_x = NumericProperty(0) 
    velocity_y = NumericProperty(0) 
    velocity = ReferenceListProperty(velocity_x, velocity_y) 

    def move(self): 
     self.pos = Vector(*self.velocity) + self.pos 


class WorldApp(App): 
    def build(self): 
     world = World() 
     # add one ball by default 
     world.add() 
     Clock.schedule_interval(world.update, 1.0/60.0) 
     return world 


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

答えて

2

答えを見つけました。デフォルトウィジェットのサイズは100,100です。初期ボールを追加するまでに、ワールドウィジェットはレンダリングされず、したがってデフォルトサイズになります。しかし、ウィジェットコンストラクタでウィンドウサイズを渡すことは可能です。だから、

 
world = World(size=Window.size) 

に世界のインスタンスを変更するには、問題を解決し

関連する問題