#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. Большое вам спасибо! Я попытаюсь выяснить, как сделать так, чтобы это выглядело как ходьба.