Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 每次移动操纵杆时更改矩形的图像源_Python_Kivy - Fatal编程技术网

Python 每次移动操纵杆时更改矩形的图像源

Python 每次移动操纵杆时更改矩形的图像源,python,kivy,Python,Kivy,我在Kivy中创建了自己的操纵杆,每当我移动它时,角色也会移动。我想要它,这样每当我移动时,矩形(角色)的源图像就会改变,使它看起来像是在行走,但在这段代码中,只有当我将操纵杆放在某个方向时,它才会改变。有可能吗 还有一个问题,我想让角色在操纵杆处于边缘时仍在移动,在这段代码中,每当我停止移动操纵杆时,它也会停止 这里是main.py 类控制器(小部件): 控件=对象属性(无) 定义初始(自我,**kwargs): 超级(控制器,自我)。\uuuuu初始化(**kwargs) 使用self.ca

我在Kivy中创建了自己的操纵杆,每当我移动它时,角色也会移动。我想要它,这样每当我移动时,矩形(角色)的源图像就会改变,使它看起来像是在行走,但在这段代码中,只有当我将操纵杆放在某个方向时,它才会改变。有可能吗

还有一个问题,我想让角色在操纵杆处于边缘时仍在移动,在这段代码中,每当我停止移动操纵杆时,它也会停止

这里是main.py

类控制器(小部件):
控件=对象属性(无)
定义初始(自我,**kwargs):
超级(控制器,自我)。\uuuuu初始化(**kwargs)
使用self.canvas:
self.rect=矩形(位置=(300300),大小=(50,50))
def on_touch_move(自我,触摸):
addx=int(touch.x)-50
addy=int(touch.y)-50
打印(str(addx)+“”+str(addy))
self.control.size=95,95
如果addx>=90:
addx=90
如果addy>=90:
阿迪=90
如果addx 50:
self.rect.pos=self.rect.pos[0],self.rect.pos[1]+2
self.rect.source=“assets/faceleft\u leftfootinfront.png”
如果addx<50:
self.rect.pos=self.rect.pos[0]-2,self.rect.pos[1]
self.rect.source=“assets/faceright\u leftfootinfront.png”
如果addy<50:
self.rect.pos=self.rect.pos[0],self.rect.pos[1]-2
self.rect.source=“assets/faceright\u rightfootfont.png”
self.control.pos=addx,addy
def on_触控向下(自身,触控):
通过覆盖,使其不会变为蓝色
def on_touch_up(自我,触摸):
self.control.pos=(50,50)#返回原始位置
self.control.size=100100
这里是main.kv


控制:控制
按钮:
id:控制
背景:正常:“assets/controller.png”
位置:50,50
角色:角色
矩形:
id:字符
尺码:25,25
位置:400400

您的
self.rect.source
每次鼠标移动都会更改两次,因此只有最后一次更改才会生效。在您的
if addx
if addy
条件系列中,其中两个条件每次都是
True
。也许用另一个代码块来确定self.rect.source的更改会更好

为了让运动继续,您只需要使用
Clock.schedule\u interval()
来安排连续运动。下面是您的
控制器
类的一个修改版本,它可以:

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
类控制器(小部件):
控件=对象属性(无)
定义初始(自我,**kwargs):
超级(控制器,自我)。\uuuuu初始化(**kwargs)
self.sched=None
使用self.canvas:
颜色(1,0,0,1)
self.rect=矩形(位置=(300300),大小=(50,50))
def on_touch_move(自我,触摸):
如果self.sched不是None:#取消运动
self.sched.cancel()
self.sched=None
addx=int(touch.x)-50
addy=int(touch.y)-50
打印(str(addx)+“”+str(addy))
self.control.size=95,95
如果addx>=90:
addx=90
如果addy>=90:
阿迪=90
如果addx 50:
self.rect.pos=self.rect.pos[0],self.rect.pos[1]+2
self.rect.source=“forward.png”
如果addx<50:
self.rect.pos=self.rect.pos[0]-2,self.rect.pos[1]
self.rect.source=“back.png”
如果addy<50:
self.rect.pos=self.rect.pos[0],self.rect.pos[1]-2
self.rect.source=“forward.png”
def on_触控向下(自身,触控):
通过覆盖,使其不会变为蓝色
def on_touch_up(自我,触摸):
如果self.sched不是None:#取消运动
self.sched.cancel()
self.sched=None
self.control.pos=(50,50)#返回原始位置
self.control.size=100100

非常感谢您!我会想办法让它看起来像走路一样。
<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
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