python - 每次移动操纵杆时更改矩形的图像源
问题描述
我在 Kivy 中构建了自己的操纵杆,每当我移动它时,角色也会随之移动。我想要它,以便矩形(角色)的源图像在我移动时发生变化,使其看起来像在行走,但在这段代码中,只有当我将操纵杆放在某个方向时它才会发生变化。有可能做到吗?
还有1个问题,只要操纵杆在边缘,我想让角色仍然移动,在这段代码中,只要我停止移动操纵杆,它就会停止。
这是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
解决方案
每次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
推荐阅读
- javascript - 防止在密码字段中触发按键事件
- python - 如何将子进程结果写入文件?
- linux - 如何检查 /init 是否启动 /etc/inittab
- javascript - 不同缩放率下的线条看起来不同
- ruby-on-rails - 如何修复“无法执行来自 ({"command"=>"subscribe", "identifier"=>"{\"channel\":\"ConversationChannel\"}"}) 的命令
- hyperledger-fabric - 什么是超级账本结构中 configtx yaml 中的“策略”?
- node.js - NodeJS 如何将 JS 文件导入 TypeScript
- php - 如何修复php页面不断加载?
- javascript - 如果 ajax 调用抛出意外错误,$.active 将始终为 1
- java - Excel中合并单元格的背景或前景