如何让两个小部件碰撞得更近kivy
How to make two widgets collide closer kivy
我在一个小部件上有两个移动的小部件(省略号)和一个函数,它定义了当它们发生碰撞时要做什么,它工作正常,但当它们发生碰撞时它们之间会留下很多 space。
我不认为所有的代码都很重要,因为它太多了。
小部件基本上是这样构造的:
class Snake(Widget):
velocity_x = NumericProperty(0)
velocity_y = NumericProperty(0)
velocity = ReferenceListProperty(velocity_x, velocity_y)
def move(self):
self.pos = Vector(*self.velocity) + self.pos
class EvilSnake(Widget):
velocity_x = NumericProperty(0)
velocity_y = NumericProperty(0)
velocity = ReferenceListProperty(velocity_x, velocity_y)
class SnakeGame(Widget):
evil_snaky = ObjectProperty(None)
snaky = ObjectProperty(None)
def __init__(self, *args, **kwargs):
super(SnakeGame, self).__init__(*args, **kwargs)
Clock.schedule_interval(self.update, 1/60.)
def begin(self, vel=(1, 0), *args):
#begin method
def game_over(self, *args):
# game over method
def update(self, dt, *args):
#methodes for movement
#snakes collide:
if self.snaky.collide_widget(self.evil_snaky):
self.game_over()
.kv 部分:
<Snake>:
size: 50, 50
canvas:
Color:
rgba: 1,1,1,1
Ellipse:
pos: self.pos
size: self.size
<EvilSnake>:
size: 50, 50
canvas:
Color:
rgba: 1,1,1,1
Ellipse:
pos: self.pos
size: self.size
<SnakeGame>:
snaky: snake
evil_snaky: evilsnake
# canvas instructions
Snake:
id: snake
center: self.parent.center
EvilSnake:
id: evilsnake
center: self.parent.center[0]-70, self.parent.center[1]
它们发生碰撞并且碰撞方法确实做了它应该做的事情,但速度要快得多。当它们碰撞时,它看起来像这样:
http://postimg.org/image/uir5jqpht/
有什么简单的方法可以让它们碰撞的很近吗?
只需编写您自己的碰撞函数来执行您喜欢的任何邻近测试,然后调用它。内置方法只是对矩形小部件边界进行简单检查。
您可以用它覆盖现有方法,但这并不重要,可能只是个人喜好问题。
(编辑:根据你的图像,也许你想要圆碰撞,计算两个小部件中心之间的距离,如果它小于它们的半径之和,则为真,这可能是相等的如果它们是正方形并且圆形填充小部件,则为它们中任何一个的宽度。)
我在一个小部件上有两个移动的小部件(省略号)和一个函数,它定义了当它们发生碰撞时要做什么,它工作正常,但当它们发生碰撞时它们之间会留下很多 space。
我不认为所有的代码都很重要,因为它太多了。
小部件基本上是这样构造的:
class Snake(Widget):
velocity_x = NumericProperty(0)
velocity_y = NumericProperty(0)
velocity = ReferenceListProperty(velocity_x, velocity_y)
def move(self):
self.pos = Vector(*self.velocity) + self.pos
class EvilSnake(Widget):
velocity_x = NumericProperty(0)
velocity_y = NumericProperty(0)
velocity = ReferenceListProperty(velocity_x, velocity_y)
class SnakeGame(Widget):
evil_snaky = ObjectProperty(None)
snaky = ObjectProperty(None)
def __init__(self, *args, **kwargs):
super(SnakeGame, self).__init__(*args, **kwargs)
Clock.schedule_interval(self.update, 1/60.)
def begin(self, vel=(1, 0), *args):
#begin method
def game_over(self, *args):
# game over method
def update(self, dt, *args):
#methodes for movement
#snakes collide:
if self.snaky.collide_widget(self.evil_snaky):
self.game_over()
.kv 部分:
<Snake>:
size: 50, 50
canvas:
Color:
rgba: 1,1,1,1
Ellipse:
pos: self.pos
size: self.size
<EvilSnake>:
size: 50, 50
canvas:
Color:
rgba: 1,1,1,1
Ellipse:
pos: self.pos
size: self.size
<SnakeGame>:
snaky: snake
evil_snaky: evilsnake
# canvas instructions
Snake:
id: snake
center: self.parent.center
EvilSnake:
id: evilsnake
center: self.parent.center[0]-70, self.parent.center[1]
它们发生碰撞并且碰撞方法确实做了它应该做的事情,但速度要快得多。当它们碰撞时,它看起来像这样: http://postimg.org/image/uir5jqpht/
有什么简单的方法可以让它们碰撞的很近吗?
只需编写您自己的碰撞函数来执行您喜欢的任何邻近测试,然后调用它。内置方法只是对矩形小部件边界进行简单检查。
您可以用它覆盖现有方法,但这并不重要,可能只是个人喜好问题。
(编辑:根据你的图像,也许你想要圆碰撞,计算两个小部件中心之间的距离,如果它小于它们的半径之和,则为真,这可能是相等的如果它们是正方形并且圆形填充小部件,则为它们中任何一个的宽度。)