Я новичок, пытаюсь использовать ручной способ перетаскивания, как в игре kivy. Я хочу попробовать создать, используя обыPython

Программы на Python
Ответить Пред. темаСлед. тема
Гость
 Я новичок, пытаюсь использовать ручной способ перетаскивания, как в игре kivy. Я хочу попробовать создать, используя обы

Сообщение Гость »


Я создаю класс поля и класс карты. Я достиг карточного класса, позволяющего перетаскивать карту на поле и бросать ее. Но я также хочу иметь возможность перемещать и изменять положение карточек внутри поля, пока не будут соединены три одинаковые карточки (X и O)

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

Поле класса(FloatLayout):

def __init__(self, **kwargs): супер().__init__(**kwargs) self.draggable = Нет def add_widget(self, widget, *args, **kwargs): widget.pos_hint = {'x': 0, 'y': 0} widget.bind(on_touch_move=self.on_child_touch_move) # Здесь привязываем событие return super().add_widget(виджет, *args, **kwargs) def on_child_touch_move (сам, экземпляр, касание): если перетащить самостоятельно: instance.pos = (touch.x — ширина экземпляра/2, touch.y — высота экземпляра/2) вернуть истину def on_touch_down(сам, касание): если self.dragged не имеет значения None: если self.collide_point(*touch.pos): self.touch_x = touch.x self.touch_y = touch.y вернуть истину def on_touch_move(сам, касание): if hasattr(self, 'touch_x') и hasattr(self, 'touch_y'): для карты в App.get_running_app().root.ids.field.children: card.pos = (touch.x — ширина карты/2, touch.y — высота карты/2) вернуть истину def on_touch_up(сам, касание): if hasattr(self, 'touch_x') и hasattr(self, 'touch_y'): для поля в App.get_running_app().root.ids.field.children: дель self.touch_x дель self.touch_y вернуть истину защита reorder_cards (сам): # Сортируем дочерние виджеты по их координатам X self.children = sorted(self.children, key=lambda x: x.x) Карточка класса (FloatLayout, Label): prev_x = ЧисловоеСвойство(0) prev_y = ЧисловоеСвойство(0) def init(self, **kwargs): super().init(**kwargs) self.dragged = Ложь self.touch_pos = Нет

def on_touch_down(self, touch): если self.collide_point(*touch.pos): self.dragged = Истина self.touch_pos = touch.pos вернуть истину def on_touch_move(сам, касание): если перетащить самостоятельно: # Обновить предыдущую позицию self.pos = (touch.x — self.width/2, touch.y — self.height/2) вернуть истину def on_touch_up(сам, касание): если перетащить самостоятельно: self.dragged = Ложь для поля в App.get_running_app().root.ids.field.children: если field.collide_point(*touch.pos): если len(field.children) == 0: self.parent.remove_widget(сам) field.add_widget(self) элиф лен(поле.дети) == 0: поле.dragged = Истина анимация = Анимация(pos=(self.prev_x, self.prev_y), длительность=0,5, t = 'out_quint') анимация.start(сам) # Изменение порядка карточек в поле после выпадения поле.reorder_cards() вернуть истину класс MyApp(Приложение): защита сборки (сам): вернуть Builder.load_string(kv)

def on_start(self): X = self.root.ids.player1 O = self.root.ids.player2 поле = self.root.ids.field для меня в диапазоне (3): card1 = Карта (текст = 'X', размер шрифта = 50) card1.color = 1, 0, 0 X.add_widget(карта1) card2 = Карта (текст = 'O', font_size = 50) card2.color = 0, 0, 1 card2.label = Кнопка(текст = 'Игрок 2') O.add_widget(карта2) для меня в диапазоне (9): field.add_widget(Поле()) if name == 'main': MyApp().run()'''
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»