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

這有幫助!現在我得到了預期的行爲。現在我會陷入困境,試圖找出爲什麼我需要流行/推動,但那只是我:) –