Изменение источника изображения прямоугольника при каждом перемещении джойстика

#python #kivy

#python #kivy

Вопрос:

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

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

Вот main.py

 class Controller(Widget):
    control = ObjectProperty(None)
    def __init__(self, **kwargs):
        super(Controller, self).__init__(**kwargs)

        with self.canvas:
             self.rect = Rectangle(pos=(300, 300), size=(50, 50))

    def on_touch_move(self, touch):
        addx = int(touch.x)-50
        addy = int(touch.y)-50
        print(str(addx)   " "   str(addy))
        self.control.size = 95, 95
        if addx >= 90:
            addx = 90
        if addy >= 90:
            addy = 90
        if addx <= 10:
            addx = 10
        if addy <= 10:
            addy = 10

        if addx > 50:
            self.rect.pos = self.rect.pos[0]   2, self.rect.pos[1]
            self.rect.source = "assets/faceleft_rightfootinfront.png"
        if addy > 50:
            self.rect.pos = self.rect.pos[0], self.rect.pos[1]   2
            self.rect.source = "assets/faceleft_leftfootinfront.png"
        if addx < 50:
            self.rect.pos = self.rect.pos[0] - 2, self.rect.pos[1]
            self.rect.source = "assets/faceright_leftfootinfront.png"
        if addy < 50:
            self.rect.pos = self.rect.pos[0], self.rect.pos[1] - 2
            self.rect.source = "assets/faceright_rightfootinfront.png"

        self.control.pos = addx, addy

    def on_touch_down(self, touch):
        pass     # Overriding so it doesnt turn blue

    def on_touch_up(self, touch):
        self.control.pos = (50, 50)    # Return to original position
        self.control.size = 100, 100
  

Вот main.kv

 <Controller>
control: control
Button:
    id: control
    background_normal: "assets/controller.png"
    pos: 50, 50
<Character>
character: character
Rectangle:
    id: character
    size: 25, 25
    pos: 400, 400
  

Ответ №1:

Ваш self.rect.source файл изменяется дважды при каждом движении мыши, поэтому только последнее изменение будет иметь эффект. В вашей серии if addx if addy условий и два из них будут True каждый раз. Возможно, другой блок кода, определяющий self.rect.source изменение, будет работать лучше.

Чтобы продолжить движение, вам просто нужно использовать Clock.schedule_interval() для планирования непрерывного движения. Вот модифицированная версия вашего Controller класса, которая делает это:

 class Controller(Widget):
    control = ObjectProperty(None)
    def __init__(self, **kwargs):
        super(Controller, self).__init__(**kwargs)
        self.sched = None

        with self.canvas:
            Color(1,0,0,1)
            self.rect = Rectangle(pos=(300, 300), size=(50, 50))

    def on_touch_move(self, touch):
        if self.sched is not None:   # cancel motion
            self.sched.cancel()
            self.sched = None
        addx = int(touch.x)-50
        addy = int(touch.y)-50
        print(str(addx)   " "   str(addy))
        self.control.size = 95, 95
        if addx >= 90:
            addx = 90
        if addy >= 90:
            addy = 90
        if addx <= 10:
            addx = 10
        if addy <= 10:
            addy = 10

        self.move_it(addx, addy, 0)  # without this the image will only move when mouse motion stops

        self.sched = Clock.schedule_interval(partial(self.move_it, addx, addy), 0.05)

        self.control.pos = addx, addy

    def move_it(self, addx, addy, dt):
        if addx > 50:
            self.rect.pos = self.rect.pos[0]   2, self.rect.pos[1]
            self.rect.source = "back.png"
        if addy > 50:
            self.rect.pos = self.rect.pos[0], self.rect.pos[1]   2
            self.rect.source = "forward.png"
        if addx < 50:
            self.rect.pos = self.rect.pos[0] - 2, self.rect.pos[1]
            self.rect.source = "back.png"
        if addy < 50:
            self.rect.pos = self.rect.pos[0], self.rect.pos[1] - 2
            self.rect.source = "forward.png"

    def on_touch_down(self, touch):
        pass     # Overriding so it doesnt turn blue

    def on_touch_up(self, touch):
        if self.sched is not None:   # cancel motion
            self.sched.cancel()
            self.sched = None
        self.control.pos = (50, 50)    # Return to original position
        self.control.size = 100, 100
  

Комментарии:

1. Большое вам спасибо! Я попытаюсь выяснить, как сделать так, чтобы это выглядело как ходьба.