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]
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. –
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 :) –