2017-01-12 41 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

我不知道这是否是造成你的问题,而是你移位指令不被小部件的规则约束,并会影响以后的任何部件 - 所以每个小动物的旋转适用于每一个小动物。

要避免这种情况,请在画布规则的顶部添加PushMatrix:,并在底部添加PopMatrix:。这些说明有效地保存并稍后恢复到更改之前的初始旋转状态。

+1

我没有定义任何更多小部件。但我想知道是否有多个以不同角度旋转的小部件是问题。我会尝试推/解决方案。 –

+1

这有帮助!现在我得到了预期的行为。现在我会陷入困境,试图找出为什么我需要流行/推动,但那只是我:) –