Как увеличить конкретную точку с помощью Kivy в python - PullRequest
0 голосов
/ 09 января 2020

Так что мне нужно создать интерактивную игровую карту для других игроков. Они могут добавить некоторые маркеры на нем локально.

Я импортировал изображение карты и увидел объект переполнения стека с кем-то, имеющим ту же проблему. У меня есть решение, но оно масштабируется в центре изображения.

Это очень большое изображение, поэтому мне нужно сделать возможным масштабирование курсора мыши.

Вот код, который я уже сделали:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.scatterlayout import ScatterLayout
from kivy.uix.scatter import Scatter
from kivy.core.window import Window
from kivy.graphics.transformation import Matrix
from kivy.lang import Builder

Builder.load_file('map.kv')

class Zoom(ScatterLayout):

    def on_touch_down(self, touch):
        x, y = touch.x, touch.y
        self.prev_x = touch.x
        self.prev_y = touch.y

        if touch.is_mouse_scrolling:
            if touch.button == 'scrolldown':
                print('down')
                ## zoom in
                if self.scale < 10:
                    self.scale = self.scale * 1.1

            elif touch.button == 'scrollup':
                print('up')  ## zoom out
                if self.scale > 1:
                    self.scale = self.scale * 0.9

        # if the touch isn't on the widget we do nothing
        if not self.do_collide_after_children:
            if not self.collide_point(x, y):
                return False

        if 'multitouch_sim' in touch.profile:
            touch.multitouch_sim = True
        # grab the touch so we get all it later move events for sure
        self._bring_to_front(touch)
        touch.grab(self)
        self._touches.append(touch)
        self._last_touch_pos[touch] = touch.pos

        return True


class Main_app(BoxLayout):
    pass


class Stacked(App):
    def build(self):
        Window.clearcolor = (1, 1, 1, 1)
        Window.size = (1000, 700)

1 Ответ

1 голос
/ 10 января 2020

Похоже, это должна быть опция для Scatter и ScatterPlane, но это не так. Вот взлом, который я использовал для выполнения sh того, о чем вы спрашивали:

class MyScatterPlane(ScatterPlane):
    def on_touch_up(self, touch):
        if self.collide_point(*touch.pos):
            if touch.is_mouse_scrolling:
                if touch.button == 'scrolldown':
                    mat = Matrix().scale(.9, .9, .9)
                    self.apply_transform(mat, anchor=touch.pos)
                elif touch.button == 'scrollup':
                    mat = Matrix().scale(1.1, 1.1, 1.1)
                    self.apply_transform(mat, anchor=touch.pos)
        return super().on_touch_up(touch)

Это расширение ScatterPlane, но оно не было тщательно протестировано. Используйте на свой страх и риск.

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