Example #1
0
class KivySprite:
    def __init__(self, parent_widget):
        self._parent_widget = parent_widget
        self._scatter_widget = Scatter(#self._tapped,  # callbacks on all areas
                                               do_rotation=False,
                                               do_scale=False,
                                               do_translation=True)
        self._image_widget = Image(source='a.png')
        self._scatter_widget.add_widget(self._image_widget)
        self._parent_widget.add_widget(self._scatter_widget)

        with self._scatter_widget.canvas.before:
            Color(1,0,0)
            Rectangle(pos=self._scatter_widget.pos, size=self._scatter_widget.size)

        self.layer = None
        self.visible = True
        self.rotation_style = 'all around'

        self._scatter_widget.bind(pos=lambda w, p: self._moved())
        self._image_widget.bind(on_touch_down=lambda w, t: self._tapped())

    # to be overriden by Sprite
    def _tapped(self): pass
    def _moved(self): pass
    def _rotated(self): pass
    def _sized(self): pass

    @property
    def image(self):
        return self._image_widget.source

    @image.setter
    def image(self, value):
        self._image_widget.source = value

    @property
    def position(self):
        return self._scatter_widget.pos

    @position.setter
    def position(self, value):
        self._scatter_widget.pos = value

    @property
    def x(self):
        return self.position[0]

    @x.setter
    def x(self, value):
        self._scatter_widget.pos = value - (self._image_widget.size[0]/2), self.y

    @property
    def y(self):
        return self.position[1]

    @y.setter
    def y(self, value):
        self._scatter_widget.pos = self.x, value - (self._image_widget.size[1]/2)

    @property
    def size(self):
        return self._scatter_widget.scale * 100

    @size.setter
    def size(self, value):
        self._scatter_widget.scale = value * 0.01

    @property
    def direction(self):
        return (((self._scatter_widget.rotation + 90) + 179) % 360) - 179

    @direction.setter
    def direction(self, value):
        self._scatter_widget.rotation = value - 90

    @property
    def draggable(self):
        return self._scatter_widget.do_translation

    @draggable.setter
    def draggable(self, value):
        self._scatter_widget.do_translation = value

    def glide(self, x, y, time=None):  # either x, y, time or sprite, time
        if time is None:
            time = y
            y = x.y
            x = x.x
        anim = Animation(x=x, y=y, duration=time)
        anim.start(self._scatter_widget)

    def move(self, steps):
        self.x += steps * math.sin(math.radians(self.direction))
        self.y += steps * math.cos(math.radians(self.direction))
        self._moved()

    def point_towards(self, x, y=None):  # test
        if y is None:  # x is a sprite
            y = x.y
            x = x.x
        dy = y - self.y
        dx = x - self.x
        angle = (-90 if dx < 0 else 90) if dy == 0 else math.degrees(math.atan(dx / dy))
        if dy < 0:
            angle += 180
        self.direction = angle

    def touching(self, other_sprite):
        return self._image_widget.collide_widget(other_sprite._image_widget)
Example #2
0
class MainScreen(FloatLayout):
    def __init__(self):
        open_cv = Thread(target=self.open_cv_worker, daemon=True)
        open_cv.start()
        super(MainScreen, self).__init__()
        self.points = 0
        self.score = Button(size_hint=(None, None),
                            pos=(10, 10),
                            size=(150, 40))
        self.score.text = 'Your Score is: {}'.format(self.points)
        self.add_widget(self.score)
        self.size_hint = None, None
        self.size = Config.get('graphics',
                               'width'), Config.get('graphics', 'height')
        with self.canvas.before:
            self.rect = Rectangle(size=self.size,
                                  pos=self.pos,
                                  source='assets/bg1.jpg')
        self.bounty = Image(source='assets/coin.jpg',
                            size_hint=(None, None),
                            size=(50, 50))
        self.dynamites = [
            Image(source='assets/dynamite.jpg',
                  size_hint=(None, None),
                  size=(30, 30)),
            Image(source='assets/dynamite.jpg',
                  size_hint=(None, None),
                  size=(30, 30)),
            Image(source='assets/dynamite.jpg',
                  size_hint=(None, None),
                  size=(30, 30)),
            Image(source='assets/dynamite.jpg',
                  size_hint=(None, None),
                  size=(30, 30)),
            Image(source='assets/dynamite.jpg',
                  size_hint=(None, None),
                  size=(30, 30)),
            Image(source='assets/dynamite.jpg',
                  size_hint=(None, None),
                  size=(30, 30)),
            Image(source='assets/dynamite.jpg',
                  size_hint=(None, None),
                  size=(30, 30))
        ]
        self.miner = Image(source='assets/miner.jpg',
                           size_hint=(None, None),
                           size=(50, 70))
        self.add_widget(self.miner)

        Clock.schedule_interval(self.update_miner_position, 0.1)
        Clock.schedule_interval(self.check_for_collision, 0.1)
        Clock.schedule_interval(self.manage_objects, 5)

    def open_cv_worker(self):
        run(miner_position)

    def check_for_collision(self, *args):
        if self.miner.collide_widget(self.bounty):
            self.remove_objects()
            self.points += 1
            self.score.text = 'Your Score is: {}'.format(self.points)
        else:
            for d in self.dynamites:
                if self.miner.collide_widget(d):
                    popup = Popup(
                        title='Ops!',
                        content=Label(
                            text='You Lost! \n Score: {}'.format(self.points)),
                        auto_dismiss=False,
                        size_hint=(None, None),
                        size=(250, 250))
                    popup.open()

    def update_miner_position(self, *args):
        try:
            position = miner_position.get()
        except Empty:
            return
        self.miner.pos = position

    def manage_objects(self, *args):
        width = randint(0, Config.get('graphics', 'width'))
        height = randint(0, Config.get('graphics', 'height'))
        self.bounty.pos = width, height
        self.add_widget(self.bounty)
        for d in self.dynamites:
            width = randint(0, Config.get('graphics', 'width'))
            height = randint(0, Config.get('graphics', 'height'))
            d.pos = width, height
            self.add_widget(d)
        Clock.schedule_once(self.remove_objects, 3)

    def remove_objects(self, *args):
        self.remove_widget(self.bounty)
        self.bounty.pos = 100000, 100000
        for d in self.dynamites:
            self.remove_widget(d)
            d.pos = 100000, 100000