Поведение вращающегося изображения между Kivy и Python



У меня возникли проблемы с пониманием того, что Kivy делает за кулисами при использовании языка Kivy при вращении изображений и их перемещении.



Ниже приведен код, который должен нарисовать два изображения под углом 45 градусов на экране, а затем для каждого щелчка мыши повернуть его больше, а затем переместить его вправо на экране.

Первое изображение рисуется с помощью поворота, определенного на языке Kivy, где второе-это то, где я пытаюсь повторить его только на python (чтобы понять лучше то, что Kivy на самом деле делает), но я терплю неудачу, так как версия Python, во-первых, не перемещает изображение вправо, когда я увеличиваю x, но похоже, что вся система координат была повернута для этого изображения, так как она движется под углом 45 градусов вверх по экрану, и, во-вторых, она не поворачивает это изображение, когда я нажимаю.



Чего мне не хватает, и что нужно было бы сделать в Python (без использования языка Kivy), чтобы получить то же поведение, что и первое изображение использование?



from kivy.app import App
from kivy.lang import Builder
from kivy.uix.image import Image
from kivy.graphics import Rotate
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty
from kivy.graphics.context_instructions import PopMatrix, PushMatrix


Builder.load_string('''
<TestKV>:
canvas.before:
PushMatrix
Rotate:
angle: self.angle
axis: (0, 0, 1)
origin: self.center
canvas.after:
PopMatrix
''')

class TestKV(Image):
angle = NumericProperty(0)

def __init__(self, x, **kwargs):
super(TestKV, self).__init__(**kwargs)
self.x = x
self.angle = 45

def on_touch_down(self, touch):
self.angle += 20
self.x += 10


class TestPY(Image):
angle = NumericProperty(0)

def __init__(self, x, **kwargs):
super(TestPY, self).__init__(**kwargs)
self.x = x
with self.canvas.before:
PushMatrix()
rot = Rotate()
rot.angle = 45
rot.origin = self.center
rot.axis = (0, 0, 1)
with self.canvas.after:
PopMatrix()

def on_touch_down(self, touch):
self.angle += 20
self.x += 10

class MainWidget(Widget):
#this is the main widget that contains the game.

def __init__(self, **kwargs):
super(MainWidget, self).__init__(**kwargs)
self.all_sprites = []

self.k = TestKV(source="myTestImage.bmp", x=10)
self.add_widget(self.k)

self.p = TestPY(source="myTestImage.bmp", x=200)
self.add_widget(self.p)


class TheApp(App):

def build(self):
parent = Widget()
app = MainWidget()
parent.add_widget(app)

return parent

if __name__ == '__main__':
TheApp().run()
592   1  

1 ответ:

Вы никогда не изменяете угол наклона инструкции Rotate. У вас есть свойство angle в виджете, но оно ни с чем не связано. Попробуйте вместо этого обновить инструкцию Rotate:

class TestPY(Image):
    def __init__(self, **kwargs):
        super(TestPY, self).__init__(**kwargs)
        # self.x = x -- not necessary, x is a property and will be handled by super()
        with self.canvas.before:
            PushMatrix()
            self.rot = Rotate()
            self.rot.angle = 45
            self.rot.origin = self.center
            self.rot.axis = (0, 0, 1)
        with self.canvas.after:
            PopMatrix()

    def on_touch_down(self, touch):
        self.x += 10
        self.rot.origin = self.center  # center has changed; update here or bind instead
        self.rot.angle += 20

Comments

    Ничего не найдено.