如何使两个小部件更接近kivy

时间:2015-07-11 08:42:27

标签: kivy

我在一个小部件上有两个移动的小部件(椭圆)和一个定义当它们碰撞时要做什么的功能,它可以正常工作但在碰撞时会在它们之间留下很多空间。

我并不认为所有代码都很重要,因为它非常重要。

小部件基本上是这样构建的:

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 part:

<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/

有没有简单的方法可以让它们真正碰撞?

1 个答案:

答案 0 :(得分:2)

只需编写自己的碰撞功能,执行您喜欢的任何接近度测试,然后调用它。内置方法只是对矩形小部件边界进行简单检查。

您可以使用此方法覆盖现有方法,但这并不重要,可能只是品味问题。

(编辑:根据你的图像,也许你想要圆形碰撞,计算两个小部件中心之间的距离,如果它小于它们的半径之和,则返回True,这可能等于任何一个的宽度如果它们是正方形并且圆圈填充小部件,那么它们。)