2017-01-12 7 views
2

Ich habe mit dem Kivy Pong-Tutorial herumgespielt und mich mit dem Framework vertraut gemacht, um zu sehen, ob ich ein paar Ideen implementieren könnte. Ich habe den Großteil der Pong-Funktionalität entfernt, sodass ich nur Ball auf den Bildschirm hüpfen lassen und Code hinzufügen konnte, um mehrere aufprallende Bälle auf dem Bildschirm zu erzeugen, die beim Berühren erzeugt wurden. Das hat gut funktioniert. Ich habe dann einige zusätzliche Zeichenanweisungen hinzugefügt, so dass ich eine Linie gezeichnet habe, die die Richtung anzeigt, in die sich der Ball bewegt. Hier wurde es merkwürdig. Der erste Ball agiert genau so, wie er sollte, und hüpft um den Bildschirm herum. Aber alle folgenden Klicks erzeugen Bälle, die vom Bildschirm abweichen, die Richtung und Geschwindigkeit zufällig ändern und sich im Allgemeinen chaotisch verhalten. Ich habe mir meinen Code angeschaut und ich kann keine Hinweise darauf finden, was schief gehen könnte. Ich behalte alle Verweise auf die Widgets, ich füge sie dem Root-Widget hinzu, ich teile anscheinend keine Informationen zwischen ihnen ... Wie auch immer, hier ist der Code, vielleicht kann mich jemand aufklären. Mit neustem Kivy und Python 3.6.Kivy-Widgets verhalten sich unregelmäßig

 
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() 

und die KV-Datei

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

Antwort

3

Ich bin mir nicht sicher, ob es das Problem verursacht, aber Ihre Rotieroperationen werden nicht durch die Widget-Regel begrenzt und werden alle später Widgets beeinflussen - so die Das Drehen jedes Critters wird auf jeden späteren angewendet.

Um dies zu vermeiden, fügen Sie am Anfang der Canvas-Regel PushMatrix: und unten PopMatrix: hinzu. Diese Anweisungen speichern und kehren später zu dem ursprünglichen Rotationsstatus vor der Änderung zurück.

+1

Ich habe keine Widgets mehr definiert. Aber ich frage mich, ob mehrere Widgets mit unterschiedlichen Winkeln das Problem sind. Ich werde die Push/Pop-Lösung versuchen. –

+1

Das hat geholfen! Jetzt bekomme ich das erwartete Verhalten. Jetzt werde ich feststecken, um herauszufinden, warum ich den Pop/Push brauche, aber das ist nur ich :) –

Verwandte Themen