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