Ejemplo n.º 1
0
class GestureListener(Widget):
    def __init__(self, **kwargs):  # inicializace
        self.app = kwargs['root']
        self.register_event_type('on_swipe_right')
        self.register_event_type('on_swipe_left')
        super(GestureListener, self).__init__(**kwargs)
        self.gdb = GestureDatabase()
        self.GSTR_SWIPE_LEFT = \
        self.gdb.str_to_gesture('eNqtls2O2jAURvd+EdgU+f7bL0C3lXiAikIEaKYQQabtvH3tC0ITQZtZeJXkU3ycfEdK7vzwcvj1vth1l+Ht3IWvt2Mfw3zbQ1jNjuuf3Sz0WE7LgcJlNbsM59NLdymXHOavvYT5U8jKbwu9VpSV9f3pcBzqslSX5X8s+1bvCj1cn6A+wntZAhiWcRHr9n/qJdVL0pQNjZUIkAzC5cf6/1B2qITdnbe7oRBSxEwSIXJCmkb5a4E9olDEVCBnUGAUsmlWclZuwULvDeGRVSr62BfjNAudRU1YXj1KE5Z3j9aE5d3jQ/dfyikrIEgmzMCRTSZh5OUTtIF5+0RtYF4/SRuY90/WBuYCqI0AdgH8TAAmyBaVc8oCZvkTMBfA1AbmAljawFwAWxuYC+DcBCYuQNoIEBcgbQSIC5BnAjjFmCiJMSOxpemvv7gAsTYwFyC5CUxdgEIbmAtQagNzAdpGgLoAbSNAXYA+E6AEEa38eVWTaflNTLHM+zdowvL6jZqwvH2TT7LqmLc5d93xPrSZ1qnNLMyXlqSsXxLnchh6S2H9GOZrGD+GKXpoNArBQ8mjED1kGIXkIego5BpqHu2exEMbMzWsr6+27w67/VAnUbuPlb8P22FfoxSWEPUaDqfX7rw+buoInLJPGDW+Vfy9P5+2b5sKymUfXmA0SGqmkAG0Dh+Lv5QfIpE=')
        self.GSTR_SWIPE_RIGHT = \
        self.gdb.str_to_gesture('eNq1l82O2jAQgO9+Ebhs5Pm3X4C9VuIBKgoRi3YLEWTb7tvXnmzbjVQKquRcDJOZb4Z8KLKXh+fDt7du31/G13MfHt/XIYblboCwXhw3X/tFGLB8LAuFy3pxGc+n5/5SvnJYvgwSln+FrD0tDFpRVuqH0+E41rJUy/KVsk81KwwwTVBHeCslgGEVuxhZWRNH4KQ55eTz/Kj3KaweYkcZDJMiCwmBhsuXzb+7sHeRsL/eYP+LzQaQsmSIlqLqHXT/6WAT/aHi0VKCyDFlhMyW9A8fwWI0Js7MSJZv45PjcyM8ugGEVnh0PLXCu1mU+/CRAIgSppwVE0q6LRddLlq7Bq4Xc7MG5IIJ2jVwxUTtGrhkaieZXDLdI7n8R9nUVCxnFJUot+lumHIbOrtehkZ0d8vUiO5iWRrR3So3sspulRtZFbcqjayKW5VGVsWtyn1WBYSIxZBztKh8m+5WxRrR3arkNnR1qwqN6G5VqRHdrWojq+pWtZFVdavayKq5VWtk1dyq3WdVY0IDMpn2t7fhLtXkf+H1mLA99/3x96bftO76zcJyBdrFsCIqy8dLwzhYCpuSkK4n5JqAaX4n8pX0FGu60sTjspQYeA/ALs+uDxk4TZFmZeSdNc6CPI0js6CEzfQMnvrD/mmsRx4NK5yPV95UJeP7YTc+1QQrCZpLfQmOp5f+vDlu68krpfqIoYbfVX0ezqfd69axZWjuQKJC3dYgkGp9D3c/Ab86orc=')
        self.gdb.add_gesture(self.GSTR_SWIPE_LEFT)
        self.gdb.add_gesture(self.GSTR_SWIPE_RIGHT)

    def simplegesture(self, name, point_list):
        # Pomocná funkce pro rozpoznávání gesta
        g = Gesture()
        g.add_stroke(point_list)
        g.normalize()
        g.name = name
        return g

    def on_touch_down(self, touch):
        # Při doteku, spustí zaznamenávání
        if self.collide_point(touch.x, touch.y):
            touch.ud["line"] = Line(points=(touch.x, touch.y))
            touch.grab(self)
            print "< grabbed >"

    def on_touch_move(self, touch):
        # Při pohybu prstu, zaznamenává pohyb
        if (touch.grab_current is self):
            touch.ud["line"].points += [touch.x, touch.y]

    def on_touch_up(self, touch):
        # Při zvednutí prstu, porovnává s gestem v databázi
        if (touch.grab_current is self):
            g = self.simplegesture(
                '',
                zip(touch.ud['line'].points[::2],
                    touch.ud['line'].points[1::2]))
            g2 = self.gdb.find(g, minscore=0.80)
            if g2:
                if g2[1] == self.GSTR_SWIPE_LEFT:
                    self.dispatch('on_swipe_left')
                if g2[1] == self.GSTR_SWIPE_RIGHT:
                    self.dispatch('on_swipe_right')
            touch.ungrab(self)

    def on_swipe_left(self, *args):
        # Událost přejetí prstu doleva
        self.app.on_swipe_left()

    def on_swipe_right(self, *args):
        # Událost přejetí prstu doprava
        self.app.on_swipe_right()
Ejemplo n.º 2
0
class GestureListener(Widget):
    def __init__(self, **kwargs):   # inicializace
        self.app = kwargs['root']
        self.register_event_type('on_swipe_right')
        self.register_event_type('on_swipe_left')
        super(GestureListener, self).__init__(**kwargs)
        self.gdb = GestureDatabase()
        self.GSTR_SWIPE_LEFT = \
        self.gdb.str_to_gesture('eNqtls2O2jAURvd+EdgU+f7bL0C3lXiAikIEaKYQQabtvH3tC0ITQZtZeJXkU3ycfEdK7vzwcvj1vth1l+Ht3IWvt2Mfw3zbQ1jNjuuf3Sz0WE7LgcJlNbsM59NLdymXHOavvYT5U8jKbwu9VpSV9f3pcBzqslSX5X8s+1bvCj1cn6A+wntZAhiWcRHr9n/qJdVL0pQNjZUIkAzC5cf6/1B2qITdnbe7oRBSxEwSIXJCmkb5a4E9olDEVCBnUGAUsmlWclZuwULvDeGRVSr62BfjNAudRU1YXj1KE5Z3j9aE5d3jQ/dfyikrIEgmzMCRTSZh5OUTtIF5+0RtYF4/SRuY90/WBuYCqI0AdgH8TAAmyBaVc8oCZvkTMBfA1AbmAljawFwAWxuYC+DcBCYuQNoIEBcgbQSIC5BnAjjFmCiJMSOxpemvv7gAsTYwFyC5CUxdgEIbmAtQagNzAdpGgLoAbSNAXYA+E6AEEa38eVWTaflNTLHM+zdowvL6jZqwvH2TT7LqmLc5d93xPrSZ1qnNLMyXlqSsXxLnchh6S2H9GOZrGD+GKXpoNArBQ8mjED1kGIXkIego5BpqHu2exEMbMzWsr6+27w67/VAnUbuPlb8P22FfoxSWEPUaDqfX7rw+buoInLJPGDW+Vfy9P5+2b5sKymUfXmA0SGqmkAG0Dh+Lv5QfIpE=')
        self.GSTR_SWIPE_RIGHT = \
        self.gdb.str_to_gesture('eNq1l82O2jAQgO9+Ebhs5Pm3X4C9VuIBKgoRi3YLEWTb7tvXnmzbjVQKquRcDJOZb4Z8KLKXh+fDt7du31/G13MfHt/XIYblboCwXhw3X/tFGLB8LAuFy3pxGc+n5/5SvnJYvgwSln+FrD0tDFpRVuqH0+E41rJUy/KVsk81KwwwTVBHeCslgGEVuxhZWRNH4KQ55eTz/Kj3KaweYkcZDJMiCwmBhsuXzb+7sHeRsL/eYP+LzQaQsmSIlqLqHXT/6WAT/aHi0VKCyDFlhMyW9A8fwWI0Js7MSJZv45PjcyM8ugGEVnh0PLXCu1mU+/CRAIgSppwVE0q6LRddLlq7Bq4Xc7MG5IIJ2jVwxUTtGrhkaieZXDLdI7n8R9nUVCxnFJUot+lumHIbOrtehkZ0d8vUiO5iWRrR3So3sspulRtZFbcqjayKW5VGVsWtyn1WBYSIxZBztKh8m+5WxRrR3arkNnR1qwqN6G5VqRHdrWojq+pWtZFVdavayKq5VWtk1dyq3WdVY0IDMpn2t7fhLtXkf+H1mLA99/3x96bftO76zcJyBdrFsCIqy8dLwzhYCpuSkK4n5JqAaX4n8pX0FGu60sTjspQYeA/ALs+uDxk4TZFmZeSdNc6CPI0js6CEzfQMnvrD/mmsRx4NK5yPV95UJeP7YTc+1QQrCZpLfQmOp5f+vDlu68krpfqIoYbfVX0ezqfd69axZWjuQKJC3dYgkGp9D3c/Ab86orc=')
        self.gdb.add_gesture(self.GSTR_SWIPE_LEFT)
        self.gdb.add_gesture(self.GSTR_SWIPE_RIGHT)
        
    def simplegesture(self, name, point_list):
        # Pomocná funkce pro rozpoznávání gesta
        g = Gesture()
        g.add_stroke(point_list)
        g.normalize()
        g.name = name
        return g
        
    def on_touch_down(self, touch):
        # Při doteku, spustí zaznamenávání
        if self.collide_point(touch.x, touch.y):
            touch.ud["line"] = Line(points=(touch.x, touch.y))
            touch.grab(self)
            print "< grabbed >"
            
    def on_touch_move(self, touch):
        # Při pohybu prstu, zaznamenává pohyb
        if (touch.grab_current is self):
            touch.ud["line"].points += [touch.x, touch.y]
    
    def on_touch_up(self, touch):
        # Při zvednutí prstu, porovnává s gestem v databázi
        if (touch.grab_current is self):
            g = self.simplegesture('', zip(touch.ud['line'].points[::2], touch.ud['line'].points[1::2]))
            g2 = self.gdb.find(g, minscore=0.80)
            if g2:
                if g2[1] == self.GSTR_SWIPE_LEFT:
                    self.dispatch('on_swipe_left')
                if g2[1] == self.GSTR_SWIPE_RIGHT:
                    self.dispatch('on_swipe_right')
            touch.ungrab(self)
    
    def on_swipe_left(self, *args):
        # Událost přejetí prstu doleva
        self.app.on_swipe_left()
    
    def on_swipe_right(self, *args):
        # Událost přejetí prstu doprava
        self.app.on_swipe_right()
class GestureManager(object):
    def __init__(self, path='./chronos/assets/gestures/'):
        with open(path + 'gestures.json', "r+") as f:
            self.path = path
            self.str_gestures = json.load(f)
            self.db = GestureDatabase()
            for name, gesture_string in self.str_gestures.items():
                gesture = self.db.str_to_gesture(gesture_string)
                gesture.name = name
                self.db.add_gesture(gesture)

    def add_gesture(self, name, gesture_path):
        gesture = Gesture()
        gesture.add_stroke(gesture_path)
        gesture.normalize()
        if name in self.str_gestures:
            raise ValueError('Cannot overwrite existing gesture in file.')
        gesture.name = name
        self.str_gestures[name] = self.db.gesture_to_str(gesture).decode(
            'utf-8')
        self.db.add_gesture(gesture)

    def save(self, path=None):
        if not path:
            path = self.path
        with open(path + 'gestures.json', "r+") as f:
            f.seek(0)
            json.dump(self.str_gestures, f)
            f.truncate()
Ejemplo n.º 4
0
class TabPannel(TabbedPanel):
    def __init__(self, *args, **kwargs):
        super(TabPannel, self).__init__(*args, **kwargs)
        self.app = RfAttendance.get_running_app()

        self.gdb = GestureDatabase()
        self.left_to_right_gesture = self.gdb.str_to_gesture(left_to_right_gesture)
        self.right_to_left_gesture = self.gdb.str_to_gesture(right_to_left_gesture)

        self.gdb.add_gesture(self.left_to_right_gesture)
        self.gdb.add_gesture(self.right_to_left_gesture)

    def on_touch_down(self, touch):
        touch.ud['line'] = Line(points=(touch.x, touch.y))
        return super(TabPannel, self).on_touch_down(touch)

    def on_touch_move(self, touch):
        try:
            touch.ud['line'].points += [touch.x, touch.y]
            return super(TabbedPanel, self).on_touch_move(touch)
        except KeyError:
            pass

    def on_touch_up(self, touch):
        g = Gesture()
        g.add_stroke(list(zip(
            touch.ud['line'].points[::2],
            touch.ud['line'].points[1::2]
        )))
        g.normalize()
        g.name = ''

        g2 = self.gdb.find(g, minscore=0.70)
        if g2 and g2[1] == self.left_to_right_gesture:
            self.switch_to_left()
        elif g2 and g2[1] == self.right_to_left_gesture:
            self.switch_to_right()

        return super(TabPannel, self).on_touch_up(touch)

    def switch_to_right(self):
        current_tab_index = self.tab_list.index(self.current_tab)
        if current_tab_index == 0:
            return

        try:
            self.switch_to(self.tab_list[current_tab_index - 1])
        except IndexError:
            pass

    def switch_to_left(self):
        current_tab_index = self.tab_list.index(self.current_tab)

        try:
            self.switch_to(self.tab_list[current_tab_index + 1])
        except IndexError:
            pass
Ejemplo n.º 5
0
class Listener(EventDispatcher):
    """
    listener function that queries kivy for touch events, builds the gesture
    and dispatch it through the actions singleton.
    """
    def __init__(self, config, gestures, el, *args, **kwarg):
        """
        :param config: string containing the path to the action configuration
        :param gestures: string containing the path to the gestures configuration
        """
        super(EventDispatcher, self).__init__(*args, **kwarg)
        self._event_loop = el
        self._gdb = GestureDatabase()
        self._actions = Actions(config, gestures)
        self.update_devices()
        self._multitouches = []

    def update_devices(self):
        log.debug('update_devices()')
        context = pyudev.Context()
        for device in context.list_devices(subsystem='input',
                                           ID_INPUT_MOUSE=True):
            if device.sys_name.startswith('event'):
                if 'PRODUCT' in device.parent.keys():
                    self._actions.update_gestures(device.parent['PRODUCT'])
        for gest_n, gest_r in self._actions.get_gestures().iteritems():
            for g in gest_r:
                g = self._gdb.str_to_gesture(g)
                g.normalize()
                g.name = gest_n
                self._gdb.add_gesture(g)

    def on_touch_down(self, touch):
        """
        listening function executed at begining of touch event
        builds the gesture
        """
        self._multitouches.append(touch)
        touch.ud['line'] = Line(points=(touch.sx, touch.sy))
        return True

    def on_touch_move(self, touch):
        """
        listening function executed during touch event
        store points of the gesture
        """
        # store points of the touch movement
        try:
            touch.ud['line'].points += [touch.sx, touch.sy]
            return True
        except (KeyError), e:
            pass
Ejemplo n.º 6
0
class Listener(EventDispatcher):
    """
    listener function that queries kivy for touch events, builds the gesture
    and dispatch it through the actions singleton.
    """
    def __init__(self, config, gestures, el, *args, **kwarg):
        """
        :param config: string containing the path to the action configuration
        :param gestures: string containing the path to the gestures configuration
        """
        super(EventDispatcher, self).__init__(*args, **kwarg)
        self._event_loop = el
        self._gdb = GestureDatabase()
        self._actions = Actions(config, gestures)
        self.update_devices()
        self._multitouches = []

    def update_devices(self):
        log.debug('update_devices()')
        context = pyudev.Context()
        for device in context.list_devices(subsystem='input', ID_INPUT_MOUSE=True):
            if device.sys_name.startswith('event'):
                if 'PRODUCT' in device.parent.keys():
                    self._actions.update_gestures(device.parent['PRODUCT'])
        for gest_n, gest_r in self._actions.get_gestures().iteritems():
            for g in gest_r:
                g = self._gdb.str_to_gesture(g)
                g.normalize()
                g.name = gest_n
                self._gdb.add_gesture(g)

    def on_touch_down(self, touch):
        """
        listening function executed at begining of touch event
        builds the gesture
        """
        self._multitouches.append(touch)
        touch.ud['line'] = Line(points=(touch.sx, touch.sy))
        return True

    def on_touch_move(self, touch):
        """
        listening function executed during touch event
        store points of the gesture
        """
        # store points of the touch movement
        try:
            touch.ud['line'].points += [touch.sx, touch.sy]
            return True
        except (KeyError), e:
            pass
Ejemplo n.º 7
0
class GestureBox(FloatLayout):
    def __init__(self, **kwargs):
        super(Box, self).__init__(**kwargs)
        self.gdb = GestureDatabase()
        top_to_button = self.gdb.str_to_gesture(gesture_string)
        self.gdb.add_gesture(top_to_button)
        self.register_event_type('on_top_to_button')

    def on_touch_down(self, touch):
        super(Box, self).on_touch_down(touch)
        # print('vbar',self.scroll.vbar)
        if self.scroll.vbar[0] > 0.79 and self.collide_point(*touch.pos):
            touch.grab(self)
            touch.ud['data points'] = [(touch.x, touch.y)]

    def on_touch_move(self, touch):
        super(Box, self).on_touch_move(touch)
        if touch.grab_current is self:
            touch.ud['data points'] += [(touch.x, touch.y)]

    def on_touch_up(self, touch):
        super(Box, self).on_touch_up(touch)
        if touch.grab_current is self:
            gesture = Gesture()
            gesture.add_stroke(touch.ud['data points'])
            gesture.normalize()

            match = self.gdb.find(gesture, minscore=0.8)
            if match:
                # print(match[0])
                self.dispatch('on_top_to_button')

            touch.ungrab(self)

    def on_top_to_button(self):
        print('My event happend')

    def add_widget(self, widget):
        if len(self.children) == 0:
            super(Box, self).add_widget(widget)
            self.scroll = widget
        else:
            print("Can't add more than one widget")
Ejemplo n.º 8
0
from kivy.gesture import GestureDatabase

gdb = GestureDatabase()

check = \
gdb.str_to_gesture('eNq1l0tuI0cMhvd9EXsTofgmL6BsA/gAgcYWbGMmtmBpksztwyY1kgZI0rNpbdr+u+pjkX+9+v718+uf3zbP++Pp68d++vX8PIzp/ukA08Pd2+6P/d10wPwzHzQdH+6Op4/3z/tj/svT/ZeDTPf/CnmoZtNBZ5Rl/8P769tp7uZzt/iPbr/NraYD9AjmIXzLLoDTdmxgBLsSMMIw5OHzcP6eX9O0/WVsCMFGmCuaGgjBdPy0+/8wXGFkeu4Ig7LzgISbMw/j6fh8hmMMBDIkdBYPimV4pQ7W8EQMUA4LMhMzCyW5watKgJoOHhxsuIz3wscVb8ExhpIxDoIgvcEzhoaiZ1geA20Rj+UAwlp4LDxd8OkqO4KHYXLI4oYOwEai4oPRmHiZXr6iXOiY9mXBFUNYacAVDm4uIOCiaXws24plK9oq7PIUr56iOqsyg+acyOrezJicpTCI3YYy5HtapFNZSldLCcRgCCk4hqniDZ2dHZjCMf1EXh47laNEN2MfEjkzJFgtK3BLHwEAGTcnlSu7LNPLUbo6+n2m5GbAuVzUr/ShYQzoSBSWi5iXJwyVqWRr4ctX+om1mq+GR7ibAA8dJuHLfC5nGVbjl7dMS/tk1g3tB3OXZyWXsyyrsMtWtlXY5SnHGmwpPwW+s3M15h5CkVvM8FyWcWH3Uce5io00A/8Eu7wUWoVdXoqswi4v5eIlseTWl6e9Cqh6+IUt6OoUwAJD88KwjC4rJVZAazmpsAa6jFRaA10+qqyBLht1DRu1bNQ1bLSy0S425mWFOc9khtxcnRwuaEW6PZnH8sFp5aPRKuwy0i5GMnsmHJE32dz73a5oG3nJgLyemqDgXKtPu/m2//ix379d7u6m8+XdbLrf5jg2Y9picD5OB/NpN4vQIrYYLWKJHiX6aJFblBahRSvRvEUsETuQjRapxe6uHSjPsBK7u0CL0mKUyLKJ25/NLbRaUI+PzwGsRWrxzOr0qKNy5+ydHnVUzsftj7JFdK7cAUSrW3SugrdpReeqdluV6Fxdu6hdv6hcCeYabQl7KFG5ElWpiM6itqgtWovWorXYlU6/d234y/71+eWUVud1dRvz2xT/en06vcwfWiP7QFU51dP7l/3H7u1xX2+gP9F+/MHc7jw1fz98vD99fTxV65yN6YfP81jE8nDMa8j81bD5B2R9zCo=')


circle = \
gdb.str_to_gesture('eNq1WNtyGzcMfd8fiV+iIS4EyB9QXzuTD+g4icbxpLU1ttI2f18QoHa5jpy12qlGAyUw9hA4ByQh3dx/vf/z++7u8Hz69nSYfumfxzTdfD7C9OHdw+0fh3fTEe2f9kHT84d3z6enx6+HZ/svTze/H/N0cxHkg4dNR2lQas8fH+8fTu2x0h6rrzz2a4uajhAZtBS+2yOA0z7tCDMkqjk1y0W1pfN3+zNN+/dpl0pGqmdLJcv0/PH25+uwr5Onu74EMxErVLeGMT3fNXQDT4C1kopbLVBhG92LB91Gh6RJinRb5A2ZF8euM/aP5JyxhVVShbBiJW9ho7OPcMZG1YTzWzTP2LgAm8XyBmx0bJqxsfSkm8UqMzaRluVduW5ju5o4qwkKmFWruM28cGLNcW3eriXOWi5kv8zbNK7GcwmbabtP0LXEWcuB7MY3pSVxVuRMiGFJaBOcXEzqYrZtwglLEsluBdOSen7R5LiN7nISzehAwsQZwC3yfwJ3PSnP4FZ31fnNrZX/PS8uKOkCvpBiFkfSF2Sz3PpoC9wVpTqDExXKmkvYmoc274S8nRZ2RXlR1B5u5xGG1bKcK7a5rtz77ILyIihVSVzL2bb8zuB4LefsgnJ+AzjQtTuUXVBeBCVRTKSMbq1HA/u9b7DMohpWSLbPFnZFuf4/6NklzYOki57N1rzAQ8YV/HY3Ztc0L5piXR0BMqAj1GItLmELb/OeXdQ87FKB8QhIOKDXOXGzOb2BGVc1D9sUaNxJNiPM6LQkbpbS9lbKrmpeVAXluRtTTloXdDs2B95z3UYXV1UWVe2aPydutqAO6HIt7+KqCm0f7A2+Fk1JkNyiTQ+b8C6rzJdpyrkoQUlhUx6IZ61XEi8uqyzXKSODTSphAcsAjnBlz4irKvN9CjVxsXEwu2UZ9iopXcmLuqgKWwOMb2JJNoh2y284B9Q11WU6En2NFuRrFVVXVJdhN71QdDhjBIe3a/3xtg3/n54Oh4d5lFdps7zNmjd7Rt2laY9ad3V88XQ6apluW0TxiAL2Yc7qTkqjs6RwSjgxnOBOhpUTw6krJ7kz06up2D3iETUiNB7L7pT+WLZhf3hJi5CIiLyU4zENZ5SlPYWoVSNZTeGMWv25vWnqzhq1amBKYNaotcTjuUdGrSXy8+rMGbWW7E6u66SpRUStJRbgvGZDW0QUXqICjgqqjE6q4dSVM19Yrawi4MJqwUIJyTBqg5TGOpC6F1be9ON6ttdGVkB+XNA2ZYREjwFfCgmSNJKC8/JBjMbyAN0bzLjS5k3dG9RoLJJK95axY9K52KBAohGShBeCAgncdIFcABj79nJI8JHzT0L6/kg/CQk+mFd5Q/BBtKoRZNzXZz4g+MC0YhSCD+hqXWhGgCAn1dcFxWAqdV0uND1gMJWCTIyeBnRy7CtZeLl7KbxRLPaykMObXu1k+1rpIb2VL20Hm9siJFKlTiTqylu7t4SXx31o35ZW3p4zpZVXLyxNsAq5xBIFH/1syH1FCj76Hs69PSn4KHU8k2w+D5aCZ+lbhKLqGvVJF5+i6hp0yRk3WiLFWSedfepdQOMBCtyFl/GsBe5a9xO4r8axESCNh7UNo+GFVw95YB57VHuaHL0Pebwy7DYPb79IevLcex/W3n7/0dobhWI+X1buzVEoytprhcYN/OVwf/fl1H70sql+ry83CbbfxP66/3z64iF2m9sJZxjmPT3+fni6ffh08L9w/IixfkGL68PDb8enx8/fPsVSedrnnc05diDYoIA2CpbUvu7t/gFuoPx3')
Ejemplo n.º 9
0
class GestureBox(BoxLayout):
    'GestureBox class. See module documentation for more information.'

    gesture_timeout = NumericProperty(200)
    '''Timeout allowed to trigger the :data:`gesture_distance`, in milliseconds.
    If the user has not moved :data:`gesture_distance` within the timeout,
    the gesture will be disabled, and the touch event will go to the children.

    :data:`gesture_timeout` is a :class:`~kivy.properties.NumericProperty`,
    default to 200 (milliseconds)
    '''

    gesture_distance = NumericProperty('20dp')
    '''Distance to move before attempting to interpret as a gesture,
    in pixels. As soon as the distance has been traveled,
    the :class:`GestureBox` will interpret as a gesture.

    It is advisable that you base this value on the dpi of your target device's
    screen.

    :data:`gesture_distance` is a :class:`~kivy.properties.NumericProperty`,
    default to 20dp.
    '''
    # INTERNAL USE ONLY
    # used internally to store a touch and
    # dispatch it if the touch does not turn into a gesture
    _touch = ObjectProperty(None, allownone=True)

    def __init__(self, *args, **kwargs):
        super(GestureBox, self).__init__(*args, **kwargs)
        self.gestures = GestureDatabase()
        self.register_event_type('on_gesture')

    def add_gesture(self, name, gesture_str):
        '''Add a recognized gesture to the database.

        :param name: a short identifier for the gesture. This value is passed
            to the on_gesture event to identify which gesture occurred.
        :param gesture_str: A (probably very long) string describing the
            gesture and suitable as input to the
            :meth:`GestureDatabase.str_to_gesture` method. The
            `examples/gestures/gesture_board.py` example is a good way to
            generate such gestures.'''
        gesture = self.gestures.str_to_gesture(gesture_str)
        gesture.name = name
        self.gestures.add_gesture(gesture)

    def on_touch_down(self, touch):
        '''(internal) When the touch down event occurs, we save it until we
        know for sure that a gesture is not being initiated. If a gesture
        is initiated we intercept all the touch and motion events. Otherwise,
        we release it to any child widgets.'''
        if not self.collide_point(*touch.pos):
            touch.ud[self._get_uid('cavoid')] = True
            return
        if self._touch:
            return super(GestureBox, self).on_touch_down(touch)
        self._touch = touch
        uid = self._get_uid()
        touch.grab(self)
        touch.ud[uid] = {
            'mode': 'unknown',
            'time': touch.time_start}
        # This will be unscheduled if we determine that a gesture is being
        # attempted before it is called.
        Clock.schedule_once(self._change_touch_mode,
                self.gesture_timeout / 1000.)
        # Start storing the gesture line in case this turns into a gesture
        touch.ud['gesture_line'] = Line(points=(touch.x, touch.y))
        return True

    def on_touch_move(self, touch):
        '''(internal) As with touch down events, motion events are recorded
        until we know that a gesture is or is not being attempted.'''
        if self._get_uid('cavoid') in touch.ud:
            return
        if self._touch is not touch:
            super(GestureBox, self).on_touch_move(touch)
            return self._get_uid() in touch.ud
        if touch.grab_current is not self:
            return True
        ud = touch.ud[self._get_uid()]
        if ud['mode'] == 'unknown':
            dx = abs(touch.ox - touch.x)
            dy = abs(touch.oy - touch.y)
            distance = sqrt(dx * dx + dy * dy)

            # If we've moved more than the thershold distance inside the
            # threshold time, treat as a gesture
            if distance > self.gesture_distance:
                Clock.unschedule(self._change_touch_mode)
                ud['mode'] = 'gesture'

        # Regardless of whether this is a known gesture or not, collect
        # the motion point in case it becomes one.
        try:
            touch.ud['gesture_line'].points += [touch.x, touch.y]
        except KeyError:
            pass

        return True

    def on_touch_up(self, touch):
        '''(internal) When the touch up occurs, we have to decide if a gesture
        was attempted. If so, we fire the on_gesture event. In all other cases
        we propogate the change to child widget.'''
        if self._get_uid('cavoid') in touch.ud:
            return
        if self in [x() for x in touch.grab_list]:
            touch.ungrab(self)
            self._touch = None
            ud = touch.ud[self._get_uid()]
            if ud['mode'] == 'unknown':
                Clock.unschedule(self._change_touch_mode)
                super(GestureBox, self).on_touch_down(touch)
                Clock.schedule_once(partial(self._do_touch_up, touch), .1)
            else:
                # A gesture was attempted. Did it match?
                gesture = Gesture()
                gesture.add_stroke(
                    zip(touch.ud['gesture_line'].points[::2],
                        touch.ud['gesture_line'].points[1::2]))
                gesture.normalize()
                match = self.gestures.find(gesture, minscore=0.70)
                if match:
                    self.dispatch('on_gesture', match[1].name)
                else:
                    # The gesture wasn't recognized; invoke a normal reaction
                    super(GestureBox, self).on_touch_down(touch)
                    Clock.schedule_once(partial(self._do_touch_up, touch), .1)

                return True

        else:
            if self._touch is not touch and self.uid not in touch.ud:
                super(GestureBox, self).on_touch_up(touch)
        return self._get_uid() in touch.ud

    def _do_touch_up(self, touch, *largs):
        '''(internal) Simulate touch up events for anything that has grabbed the touch'''
        super(GestureBox, self).on_touch_up(touch)
        # don't forget about grab event!
        for x in touch.grab_list[:]:
            touch.grab_list.remove(x)
            x = x()
            if not x:
                continue
            touch.grab_current = x
            super(GestureBox, self).on_touch_up(touch)
        touch.grab_current = None
        return True

    def _change_touch_mode(self, *largs):
        '''(internal) Simulate a touch down if we know the touch did not become
        a gesture'''
        if not self._touch:
            return
        uid = self._get_uid()
        touch = self._touch
        ud = touch.ud[uid]
        if ud['mode'] == 'unknown':
            touch.ungrab(self)
            self._touch = None
            touch.push()
            touch.apply_transform_2d(self.to_widget)
            touch.apply_transform_2d(self.to_parent)
            super(GestureBox, self).on_touch_down(touch)
            touch.pop()
            return

    def _get_uid(self, prefix='sv'):
        return '{0}.{1}'.format(prefix, self.uid)

    def on_gesture(self, gesture_name):
        '''Called whenever a gesture has occured. This is a Kivy event. It
        can be overridden in a subclass our bound to using :meth:`Widget.bind`.
        '''
        pass
Ejemplo n.º 10
0
#!/usr/bin/env python
from kivy.gesture import GestureDatabase

gdb = GestureDatabase()

cross = \
gdb.str_to_gesture('eNq1l9tu3DYQhu/1It6bLjicE+cFtrcF/ACBYwv2Iqkt7G7a5u1DDqlT0lZ7I2Mxsj5JP2f4kxR1OH85//X9+Npfb98uffd7Ow6hO7wM0D0+vD/92T90Q8z/5gN218eH6+3y8aW/5lPqDl8H7g7/KvLot3WDFCnNzw8f5/dbeSyVx+w/Hvuj3NUNUDMoKXzPj0DsTuGIGiRJGCOVbP4pV7E7/RaORJZMwhS1u35++v9WyFvh7rU2ENEMJI1RuLu+NnEEgyhpjEG2xb1y0H3Ek4vbKA6kEmyKEWdxWPaJsaVN8eidH2Ef8ejiOIqHdbeQLvolaLTFLxlty7ulsVlaNBKChCnmEpp+uRSSIozRBLbl3dSoe8m7rdF2kkc3FmGSB1FVphYT6qSejY2sOsXtyYRuLOIkHgEtGrZIKJP4Spk13ZG524qzrXFWLlHmfok/9UvcFndTUe8Rz8OVA7RIYXtAoluKdke3hJU42j0dQ24pwV7ybiptm1oGE+Rz4ilu9w25q8R3qQtnZ2WKd+TutpLeox4pZmt1jHlh3VR3X8nuUceFdIm4qc5uKy9mapCY339jXKb+08tjewlmN5VxH3H3lBcLcASZfzGv4osFPiVk5SnmCb6p766y7qbvvvL0Zg2GKtHGCDjPJ2FKicfI2wuNuKsCu2i7qYLzdiP3BXGLYIs1DEAo0hh1eyaJeyq8i7b7KdM26ddNXpPO7SCSTnHbSnErxXaQVndSJyeJGQOMMe+RJm1aLrk5bku7kYp7SLuPOvlI6/FHs4+87hH2Fats/p8vff8+beVVyl5etTucMA/a7kSE+XAbNHVPmcGK2ZKBsxSciTPUyqAwUmdRKouFCToDqgwLU3MWQmVUmDnD1O7jwsCfOuXFt0JxGKNDaS1rhVwhV5gqpBW0CnEJLaw0G4QKwwrGmlJaQaxw1bp5QRBsBb2iZMvczQtSWjGvx09m5uXwmnk1tNKDEGYbZli94TX0aqg1nRrE5Z3WoFdDtWyFBr0aqR2URljLqa1bbNDrsToywth69QfqGIrcaDVoPSoBqkNtbDE1Wi3iqsAtV6gesSdL0vKCalLNdqa5rjpB3vrz69utfJTmz8qTFclM/z6/3N4cSteSyvT28bW/PL0/935Ffdsd1n9Q7muT+dNw+Xj59lzFU+6WY5L8ug5qwTR/PFH5bDz+AM/6Dqo=')

circle = \
gdb.str_to_gesture('eNq1WNtyGzcMfd8fiV+iIS4EyB9QXzuTD+g4icbxpLU1ttI2f18QoHa5jpy12qlGAyUw9hA4ByQh3dx/vf/z++7u8Hz69nSYfumfxzTdfD7C9OHdw+0fh3fTEe2f9kHT84d3z6enx6+HZ/svTze/H/N0cxHkg4dNR2lQas8fH+8fTu2x0h6rrzz2a4uajhAZtBS+2yOA0z7tCDMkqjk1y0W1pfN3+zNN+/dpl0pGqmdLJcv0/PH25+uwr5Onu74EMxErVLeGMT3fNXQDT4C1kopbLVBhG92LB91Gh6RJinRb5A2ZF8euM/aP5JyxhVVShbBiJW9ho7OPcMZG1YTzWzTP2LgAm8XyBmx0bJqxsfSkm8UqMzaRluVduW5ju5o4qwkKmFWruM28cGLNcW3eriXOWi5kv8zbNK7GcwmbabtP0LXEWcuB7MY3pSVxVuRMiGFJaBOcXEzqYrZtwglLEsluBdOSen7R5LiN7nISzehAwsQZwC3yfwJ3PSnP4FZ31fnNrZX/PS8uKOkCvpBiFkfSF2Sz3PpoC9wVpTqDExXKmkvYmoc274S8nRZ2RXlR1B5u5xGG1bKcK7a5rtz77ILyIihVSVzL2bb8zuB4LefsgnJ+AzjQtTuUXVBeBCVRTKSMbq1HA/u9b7DMohpWSLbPFnZFuf4/6NklzYOki57N1rzAQ8YV/HY3Ztc0L5piXR0BMqAj1GItLmELb/OeXdQ87FKB8QhIOKDXOXGzOb2BGVc1D9sUaNxJNiPM6LQkbpbS9lbKrmpeVAXluRtTTloXdDs2B95z3UYXV1UWVe2aPydutqAO6HIt7+KqCm0f7A2+Fk1JkNyiTQ+b8C6rzJdpyrkoQUlhUx6IZ61XEi8uqyzXKSODTSphAcsAjnBlz4irKvN9CjVxsXEwu2UZ9iopXcmLuqgKWwOMb2JJNoh2y284B9Q11WU6En2NFuRrFVVXVJdhN71QdDhjBIe3a/3xtg3/n54Oh4d5lFdps7zNmjd7Rt2laY9ad3V88XQ6apluW0TxiAL2Yc7qTkqjs6RwSjgxnOBOhpUTw6krJ7kz06up2D3iETUiNB7L7pT+WLZhf3hJi5CIiLyU4zENZ5SlPYWoVSNZTeGMWv25vWnqzhq1amBKYNaotcTjuUdGrSXy8+rMGbWW7E6u66SpRUStJRbgvGZDW0QUXqICjgqqjE6q4dSVM19Yrawi4MJqwUIJyTBqg5TGOpC6F1be9ON6ttdGVkB+XNA2ZYREjwFfCgmSNJKC8/JBjMbyAN0bzLjS5k3dG9RoLJJK95axY9K52KBAohGShBeCAgncdIFcABj79nJI8JHzT0L6/kg/CQk+mFd5Q/BBtKoRZNzXZz4g+MC0YhSCD+hqXWhGgCAn1dcFxWAqdV0uND1gMJWCTIyeBnRy7CtZeLl7KbxRLPaykMObXu1k+1rpIb2VL20Hm9siJFKlTiTqylu7t4SXx31o35ZW3p4zpZVXLyxNsAq5xBIFH/1syH1FCj76Hs69PSn4KHU8k2w+D5aCZ+lbhKLqGvVJF5+i6hp0yRk3WiLFWSedfepdQOMBCtyFl/GsBe5a9xO4r8axESCNh7UNo+GFVw95YB57VHuaHL0Pebwy7DYPb79IevLcex/W3n7/0dobhWI+X1buzVEoytprhcYN/OVwf/fl1H70sql+ry83CbbfxP66/3z64iF2m9sJZxjmPT3+fni6ffh08L9w/IixfkGL68PDb8enx8/fPsVSedrnnc05diDYoIA2CpbUvu7t/gFuoPx3')

check = \
gdb.str_to_gesture('eNq1l0tuI0cMhvd9EXsTofgmL6BsA/gAgcYWbGMmtmBpksztwyY1kgZI0rNpbdr+u+pjkX+9+v718+uf3zbP++Pp68d++vX8PIzp/ukA08Pd2+6P/d10wPwzHzQdH+6Op4/3z/tj/svT/ZeDTPf/CnmoZtNBZ5Rl/8P769tp7uZzt/iPbr/NraYD9AjmIXzLLoDTdmxgBLsSMMIw5OHzcP6eX9O0/WVsCMFGmCuaGgjBdPy0+/8wXGFkeu4Ig7LzgISbMw/j6fh8hmMMBDIkdBYPimV4pQ7W8EQMUA4LMhMzCyW5watKgJoOHhxsuIz3wscVb8ExhpIxDoIgvcEzhoaiZ1geA20Rj+UAwlp4LDxd8OkqO4KHYXLI4oYOwEai4oPRmHiZXr6iXOiY9mXBFUNYacAVDm4uIOCiaXws24plK9oq7PIUr56iOqsyg+acyOrezJicpTCI3YYy5HtapFNZSldLCcRgCCk4hqniDZ2dHZjCMf1EXh47laNEN2MfEjkzJFgtK3BLHwEAGTcnlSu7LNPLUbo6+n2m5GbAuVzUr/ShYQzoSBSWi5iXJwyVqWRr4ctX+om1mq+GR7ibAA8dJuHLfC5nGVbjl7dMS/tk1g3tB3OXZyWXsyyrsMtWtlXY5SnHGmwpPwW+s3M15h5CkVvM8FyWcWH3Uce5io00A/8Eu7wUWoVdXoqswi4v5eIlseTWl6e9Cqh6+IUt6OoUwAJD88KwjC4rJVZAazmpsAa6jFRaA10+qqyBLht1DRu1bNQ1bLSy0S425mWFOc9khtxcnRwuaEW6PZnH8sFp5aPRKuwy0i5GMnsmHJE32dz73a5oG3nJgLyemqDgXKtPu/m2//ix379d7u6m8+XdbLrf5jg2Y9picD5OB/NpN4vQIrYYLWKJHiX6aJFblBahRSvRvEUsETuQjRapxe6uHSjPsBK7u0CL0mKUyLKJ25/NLbRaUI+PzwGsRWrxzOr0qKNy5+ydHnVUzsftj7JFdK7cAUSrW3SugrdpReeqdluV6Fxdu6hdv6hcCeYabQl7KFG5ElWpiM6itqgtWovWorXYlU6/d234y/71+eWUVud1dRvz2xT/en06vcwfWiP7QFU51dP7l/3H7u1xX2+gP9F+/MHc7jw1fz98vD99fTxV65yN6YfP81jE8nDMa8j81bD5B2R9zCo=')

square = \
gdb.str_to_gesture('eNq1mEluIzcYRvd1EXsT4Z+HC6i3AXyAwG0LttEdW7DUSfr2YZHVEgk4KQGCtZH8RD4OH4eSb1++vfz1c/O0Oxx/vO+mL8v7Hqbbxz1Odzev93/ubqY9lY/ljafD3c3h+P72bXcof8p0+32v0+2HkrtabNrbrPJSf//28nqcq8VcLf+j2u9zqWmPrQdzF36WKkjTFjasKZKMaJwqGTp355/5a562v8FGREAVLIINymebDl/v/78Zqc3o9LS04EgogK6ECeSlhadFTomIHElsKqoS6/I6dPQL5JiWaSTKYMZEuS6PKs8L5DD03DB11U51+gnX7EVuGOQUgqDIxHGBnKqc1+XkJXLMyAyXUFkPlGqgpJ/irnmSr7s5kThBIhAB5RJ3jZPOcYpbiIG6elkc81Je3DL222TVzTVMPoVJggFESoEGBIJndyirWWpYRonyAnfNkk9ZQkQYghuLSlnI7tfIa5i8hDmvZFBSUwdH5ixDgKv6XvNkP+mxbDxgo1S2JIhr3DVPzpOb0IGQ3DTVhTPP8nEH+bpcaqCCJzkHOjlqpISFAp/lZMqMZqIBLnCBvCYqfJKLEqNyCgkFFNlZjt0qJaD1rS81UTknKuEGqYgRGUZdnsxlnapilrkiKafjurzmKec8Sy12KTPvTmWn5lle9mS/B2z9MJcaqOSqvC7TflRlkZZ7bM2vNVPFT/PXWJUv8ZO5hkiAQVkz5Wpat9dcVT/JXoNVv8Quoz3Wl43WZDU/x241V1vfq+UrRTFhLicyAxpecG1YTdXOqVLXP4XSRmcHCg/NIPGAcnOs22uqdk4Vx777dfaaqp2uU+jPWGdkvcpeU7X8HLvXVP10pWJKOdSFksIMSgNXyWuofrpTyyUKaewgxuCJeJW8ZuqnB6TxIATspkXGJ16r8vkHwMP7bvd6epx3m5/ny0V/uy1X4wamLaWVt+PeY7qfoQ8wG8wGvcKACjMGiDMsj/EDpApRB8gV0lhdKpSxulaoI7QKDQfoDfIAY4Cyyf4lc4lsJaSV4FotYYDzCd69bC6BfYloU5XUQ88GeYBLA9JD+6BfqX0J1VZtGThVKD72i+cS3k+NUKvWZkFbhMwfVMu+BOXYHy8lENqcaMuM2vyWp+WB2kJpoLrQNhOqI21Toa3HJAttw5c2fOKFtvGzjrSNmWikbdAAI11WMw8U23L2HCkOdBkxUk8/msyyCVsj0IeAKAP9aI5R+yJ1+mZqPXVYqPc0fjUSA82FZk9zmWNqo45hG5WfSB1lWOaCqDMwLDkTD/SXoQy0nTzPu5en52P9f4BO25jbLfTvl8fjc4VWoDZ4fPu+e79/fdjVL7we0jC+cC63nJJ/7N/fHn88NHdM29xw+VUXOp+Mzm7FcPi6+ReGcFi7')

s = \
gdb.str_to_gesture('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')
Ejemplo n.º 11
0
    return filter(lambda r: r[0] != u'(No macro)',getCommands())

def getCurrentCommands():
    commands = db.query("SELECT commands.name,commands.description,commands.script\
            FROM commands,profiles,activeprofile WHERE profiles.name =\
            activeprofile.name AND commands.name = commandname ORDER BY LOWER(commandname)")
    return commands

gdb = GestureDatabase()

kivygestures = dict()
for [name,description,representation] in getCurrentGestures():
    if len(representation) < 20:    # Fulhack för att känna igen multitouch.
        continue
    kivygestures.update({representation:name})
    gest = gdb.str_to_gesture(representation.encode("ascii"))
    gdb.add_gesture(gest)

def getCommand(gesture):
    if gesture.multitouch:
        return getMultitouchedCommand(gesture)
    g = gdb.str_to_gesture(gesture.toString())
    identifiedGesture = None
    current_max = 0.7 # Minimum score
    for gi in [gdb.str_to_gesture(st) for st in kivygestures.keys()]:
        if(g.get_score(gi) > current_max):
            current_max = g.get_score(gi)
            identifiedGesture = gi

    nop = Command.Command("No operation","Does nothing","nop")
    if identifiedGesture != None:
Ejemplo n.º 12
0
class DrawingSpace(StencilView):
    def __init__(self, *args, **kwargs):
        super().__init__()
        self.gdb = GestureDatabase()
        self.line45 = self.gdb.str_to_gesture(line45_str)
        self.cirlce = self.gdb.str_to_gesture(cirlce_str)
        self.cross = self.gdb.str_to_gesture(cross_str)
        self.line135 = self.line45.rotate(90)
        self.line225 = self.line45.rotate(180)
        self.line315 = self.line45.rotate(270)
        self.gdb.add_gesture(self.line45)
        self.gdb.add_gesture(self.line135)
        self.gdb.add_gesture(self.line225)
        self.gdb.add_gesture(self.line315)
        self.gdb.add_gesture(self.cross)
        self.gdb.add_gesture(self.cirlce)

    def activate(self):
        self.tool_box.disabled = True
        self.bind(on_touch_down=self.down,
                  on_touch_move=self.move,
                  on_touch_up=self.up)

    def deactivate(self):
        self.unbind(on_touch_down=self.down,
                    on_touch_move=self.move,
                    on_touch_up=self.up)
        self.tool_box.disabled = False

    def down(self, ds, touch):
        if self.collide_point(*touch.pos):
            self.points = [touch.pos]
            self.ix = self.fx = touch.x
            self.iy = self.fy = touch.y
        return True

    def move(self, ds, touch):
        if self.collide_point(*touch.pos):
            self.points += [touch.pos]
            self.min_and_max(touch.x, touch.y)
        return True

    def up(self, ds, touch):
        if self.collide_point(*touch.pos):
            self.points += [touch.pos]
            self.min_and_max(touch.x, touch.y)
            gesture = self.gesturize()
            recognized = self.gdb.find(gesture, minscore=0.50)
            if recognized:
                self.discriminate(recognized)
        return True

    def gesturize(self):
        gesture = Gesture()
        gesture.add_stroke(self.points)
        gesture.normalize()
        return gesture

    def min_and_max(self, x, y):
        self.ix = min(self.ix, x)
        self.iy = min(self.iy, y)
        self.fx = max(self.fx, x)
        self.fy = max(self.fy, y)

    def discriminate(self, recognized):
        gest = recognized[1]
        if gest == self.cross:
            self.add_stickman()
        if gest == self.cirlce:
            self.add_circle()
        if gest == self.line45:
            self.add_line(self.ix, self.iy, self.fx, self.fy)
        if gest == self.line135:
            self.add_line(self.ix, self.fy, self.fx, self.iy)
        if gest == self.line225:
            self.add_line(self.fx, self.fy, self.ix, self.iy)
        if gest == self.line315:
            self.add_line(self.fx, self.iy, self.ix, self.fy)

    def add_circle(self):
        cx = (self.ix + self.fx) / 2.0
        cy = (self.iy + self.fy) / 2.0
        self.tool_box.tool_circle.widgetsize(self, cx, cy, self.ix, self.iy)

    def add_stickman(self):
        cx = (self.ix + self.fx) / 2.0
        cy = (self.iy + self.fy) / 2.0
        self.tool_box.tool_stickman.draw(self, cx, cy)

    def add_line(self, ix, iy, fx, fy):
        self.tool_box.tool_line.widgetsize(self, ix, iy, fx, fy)

    def on_children(self, instance, value):
        self.status_bar.counter = len(self.children)
Ejemplo n.º 13
0
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App
from kivy.gesture import Gesture

ges_strs = {
    'left_to_right_line':
    'eNq1WMtSI0cQvM+PwMVE17vrB9irI/gABwYFELsGBWht79+7p0qPHoE044NExAhyslPVmdU9La5fvr/8/evmafWx+fm+Gr5t39dluH5cw3B39Xr/1+pqWGP7tb3R8HF39bF5f/u++mh/8nD9Yy3D9Zcid0Eb1jpKWRu/fnt53YzD6jjMTwz7fWQNa8gKxhJ+tSGAw+1v5aZocUexWtkNodpYz7/jfYr7Sk6ExZWNXajd/vP+/MdwfIwMT6c/4WknXqComhcSlMILxGPqYEvERUphpdpQR3KeF68h7ovEkYUUrEIxLVpnxTHcR1gizrXuqm7ew7w2hjYdtEWqF6FaiMgFVDpxNHHjgnnVeV8wEkW5lHxkil2mUnauWLNWKx/kqf7PdsQIFbtQuUhlBsmrQidOlQC07q7ztVOkSnAh9ciVulxJuCIZm9ZSvQnv1bEaOmAtwJWR5puGIlWSy4hHptRlimjdj7h26lgPK2nBUqKIlPwi4hyJcpcooLQpOxRnhdbUnTio9dvjEvmIlOlS8hEqd6EWYwSQglbRqXCXKiDkKkqDfD5Wjli5i7VwtTYFz+ukaYqJiEpVtNL6B+b7nSNY9gvJS0Qr22hHdcn9yzQyEO/U0Q+PjsZa4L1EtEJ7+X3dcbVugy+lybaP39aPbeueVY9kRQ7q4yLdb8JsuJUfa4eudHCXefUIVmyvjkX50DtOclBnZyYGii3Bqs6LR6ziB/FDv6u2ZckH8XpwpVT1+f1dI1SFBeIAtXt0KMybrhGp0hJxnmzvNu+5RqIqS8Qra79U53tdI1C1BeIIBcTUt7HygsojUF0SKHad2Lznec8tAjVY0Oho00af1448bXaJtof1ZGtckKZFmiYLpAm1O/WGI+N3gIf31ep1f6I3HY/0bdj1LRDclOGWRG68f/GwWVsd7kcGnmZ4Mvwko5ZgsJ5mQDDarZMMDIae0aBg2BkGB8PLaYaMjLbXJ6O2twZqgJgT1JKgBcgN7F80MjgZ4RzqdpgmGGahp50G09HaGB5mEeQ0TGKYhz9EWZfZF8PCnxZ4MrJyD0tIKcAKCYYLZOlCxQQlwZogf7bGw4XxVjByOh4u0NbRagnWBGUCeoLpRq2fZwAlZs4FzlBgRzmq7xQfk09nJCkpcobCSbEzlPCv7W5J8Zhz++4ZKJYpaonWKRquMR0peKJTLqRTzMeVdJR0in06MP0QnqJpgRxxc9ateT57vaPkrPWoupy1wRTNWRudqTktsKPq0gKTCYppwXa1f5kJwo6yrFkwzallKT9tq7Xvc8C0za1fJ+0MPqKy67Iv1hdg2CaAZyiWFNtRUjtsk12X7VBPFCYolURxikKiNEWbH/noeF69PD1v4n824wb3KcJG+eflcfMcjNGv2N8aunn7sXq/f31YxR2Jo8aIbx9xf6zf3x5/PqTy2AntINKeiuztyAraHvXjOeTmPyTQtjs=',
    'right_to_left_line':
    'eNq1WMty4zYQvPNHrMuqMC8M8APea6r8ASnHZtmq3dgqWZtk/z6DASWStijwIl5kjhqNQfcAGHmz+7H75/f2pf84/jr03ffhcx+6zfMeuoe7t8e/+7tuj/anfVD38XD3cTy8/+g/7JW7zc+9dJuLJA8O6/axUKmN37/v3o5lWCrD8sKwPwqq20PNoKTw24YAdvffwjZA5BgwJ2UEUkUuCf1XANTdh23ElCkk0AghRMv2r8frs7DPIt3LlQleKrdkyQCZc0wixNom95WDriKfZy5t8uTkeRU5FM7zBNgkRxcfYQ05qw7hRJE1t8nRyWkVOQcUEEVCDczQ1gXdUVzlKOVZ7im22d1S1Buxu6c49RSUiYaiQCEY2XlSi5LbnpJ7SnAbcveUJp6GTImTuxaQo+iZHDPEyaPcZndPaeJp0ICRSr2ZxDHlUXWksRZd/ja7e0p6I3b3lAZPeZuBBDEA2n40ZfpvQc7skM5ulL2a20cMu6kMN2J3V3lwtQjDGiNArJOksWBswvMmtR1L7Yph95Rl5M6cSlacGG0f4Zh4mDDbWSDtQ4DdUtbbkLujnM/kwBisZlJ0YVRGWUJ5G4WxHdFkF3dU4Ebs7qiMjkIUSRIzJKRs5xgN7H4+KGaRQbQo7fNL3FORVewRIdRvUs7Ull3cU9FV5Dl7zsMCsF3q4qZKvg17dFMjrGEHwsHrso9lxW0d3dS4ylSIg+Dq6q9hd1PjKlPt0oAJf0xtdnc1arPcjR35dLpJ+b5dMtFNjRNTIVkPkVKQQDCjFp2J3qRWd1RHR4OCXXNDRWcuwp7Jp9SauL1N1R3VycGLHKxxG7LMdmWd2WluaWg3veqOqrQvjULPw/6v1e6il98AT4e+fzt39BpLS6/abe4NuA3dPbF9TJ/YHfeauseCgGVEdkTURUQKFUHLCHCEpGUEVsQVDnIE8zKCHUGyjBBH4LIe1hMWRLiSqRaEtWDLCNdU9EqmrqlIqAja5unDhsiuqWCuiLIkC7qMEuQz3hCxIlxGu1nrsFyDrpx1jR4UqEEXiyl+zs4QVBEuFkM1XoYUXB/K6RT8mrnrQ5qXEa4PDfVyEeH61PwvI6xpcgjxFYjLRUhXIK4XAV6BuHoUaCoDBJcPc6xR/uoxBKkQuAJxNe00qhAcuLVGeR5NNYrzaK7RMItCmEVhiLoeqHkexRpN8yjVKJ8K6aswUCU4HR0XIVWCmKblaN1qjco8WlcdYR6tq5ZPDHXVpulsTp1AsEogOBuIVYLTxjtFqwTldfrQFELLkHTBWazi8JD3RYiJU4/u13738nr0/6nY/oP5cZDKz9SHu393z8dXh9gqGYsvFj2+/+wPj29PvX+TvPEv8eGa+XN/eH/+9VSpsyVivQyj1YUSkV1f3uRt/wdC4ZmI',
    'bottom_to_top_line':
    'eNq1mN1u40YMhe/1IslNDf4OyRfw3hbIAxRpYiTBbhMj9rbdty81I0t2YtWLFewbO6PDbyieEWeU25evL3//WD1tdvvv75vuy/C9he72cYvd3c3r/V+bm25L+TO/uNvd3ez2729fN7v8U7rbb1vtbs9C7qqs25YeZRm/fXt53fdh3ofFTNjvvarbYsugT+FHhiB1699gVRAIUQGYQUrUdP7tL3O3hhWwADuzCIuHWXS7P+//fxaps2j3NEygBu5a1AqzC2C3e/pldr1xtIlNbgpOBY2xaCxhe2XHyBZVQ0N0BoswXsCmWnnCq7Cpsnlkc/GShS6lEBUQXASvZpJeB17dJLsOvNpJk52UK4TJxYsomPrEzkEC1hJQHMxML8K5+sl4HXg1lPk68GooT4YSnK7Eo5oTORBbsHlKwn+CXh1luxK9WsqTpcgqQRxBef/GoRM9O1opQsJEyo5OF+lSPRW8Er2aKnwlenVVJlfBrWdGtnZHCJeJDrmYQtQh233+LnKZXl2VyVXQPtJIQSK7u8pR8od9hEph9fTXLvOrrzL5ClkWL+ZIFJypHvD9JSAxVwwJy26RD8XldaPVWZ2cBYgsUIA4ZTxmWzme4HRP6ZfsJX71Vgdv+/SPFraZl+P8040smKt5OKHQT+CruaojPstK5qSa9SHLLrqIXs1VG+nZXANMsrhJQj+hs6GI5ebFnk06K3qRXq3VONCx7dMebf8jX0Qv1diCI12P9gjVXLGL6NXWMtqKeYABZeXSDkwLc6+ultHV3PFyyaO2viBL6dXVMrpKalYy79wiIk2lZa6W6moZXSXPQMnnKR+XwHzyF9Gtumqjq6f9ajwr/SK8mmqjqcyRlTfAwGKES1OvptpoKhcs2cmQgLLjIF1ckP2rwMP7ZvM6Huyt9Cd7s+52LRh9f50+pVuj4Aq6/da8u59TSFPErEJlFccfS7nDrNygAh1nFVGaguYUWfMzU3KTWwavs/1+jEqFNIV+Brq2KbUpPgWvGeJ0SunlpcrB+yn5Y1JVYU1Rk8oXmDOKVnrQj5fWLHxGHgd5D9RmX8DJYLuXaAUGaYPeBul4MIv0aYJoZQRuimhhcjxoZ24jWuUAP9+GNzujzCqCm8LmFALw2c7weXk5I49ZObb5EWBWQjhIcFbCMEhoXhKDhGcleqDIrKQccpmtudiBUuYlh1zmq+4ySOYr7TZI5qsbQ7o4X90YKJjVbX3sefPy9Lzv/5HQ98J8SUlBDv/z8rh/rqPct5ITlxGll+zfvm3e718fNlUmde/tx4ee+8f2/e3x+0NDaz76K8++nbOA5w4RUU+0q/8AAJ5q8g=='
}
gestures = GestureDatabase()

for name, ges_str in ges_strs.items():
    gesture = gestures.str_to_gesture(ges_str)
    gesture.name = name
    gestures.add_gesture(gesture)


class MyGesure(BoxLayout):
    def on_touch_down(self, touch):
        touch.ud['gesture_path'] = [(touch.x, touch.y)]
        super().on_touch_down(touch)

    def on_touch_move(self, touch):
        touch.ud['gesture_path'].append((touch.x, touch.y))
        super().on_touch_move(touch)

    def on_touch_up(self, touch):
        # print(touch.ud['gesture_path'])
Ejemplo n.º 14
0
#!/usr/bin/env python
from kivy.gesture import GestureDatabase

gdb = GestureDatabase()

square1 = \
gdb.str_to_gesture('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')

square2 = \
gdb.str_to_gesture('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')

square3 = \
gdb.str_to_gesture('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')

square4 = \
gdb.str_to_gesture('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')

square5 = \
gdb.str_to_gesture('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')

square6 = \
gdb.str_to_gesture('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')

square7 = \
gdb.str_to_gesture('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')

square8 = \
gdb.str_to_gesture('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')

squares=[square1,square2,square3,square4,square5,square6,square7,square8]
Ejemplo n.º 15
0
class GameMatrix(GridLayout):
    def __init__(self, app, **kwargs):  # inicializace pole
        self.app = app
        super(GameMatrix, self).__init__(**kwargs)
        self.coords = []
        self.dpos = (0, 0)
        self.colors = []
        self.shape = None
        self.active_color = [.1372, .1372, .1372, 1]
        self.inactive_color = [.1372, .1372, .1372, 1]
        self.fUpdate = 12 * 22 * "0"
        self.tnetCoords2 = []
        for y in range(51, 73):
            for x in range(51, 63):
                self.tnetCoords2.append(chr(x) + chr(y))
        self.tnetCoords = []
        for x in range(51, 63):
            col = []
            for y in range(51, 73):
                col.append((chr(x), chr(y)))
            self.tnetCoords.append(col)
        self.tnetColors = []
        for c in range(33, 48):
            self.tnetColors.append(chr(c))
        self.move = False
        self.orientation = 0
        self.colored = set()
        self.colors = [
            deepcopy(self.inactive_color), [0, .6, .8, 1],
            [1, .7333333, .2, 1], [.6, .8, 0, 1], [.666666667, .4, .8, 1],
            [1, .266666667, .266666667, 1]
        ]
        self.COORDS_SET = set()
        for y in range(int(self.rows)):
            line = []
            for x in range(int(self.cols)):
                box = Box()
                box.coords = (x, y)
                box.colored = deepcopy(self.inactive_color)
                self.add_widget(box)
                line.append(box)
                self.COORDS_SET.add((x, y))
            self.coords.append(line)
        self.b = 0
        self.startgame = False
        self.seed = randint(0, 0xFFFFFF)
        self.specials = set()
        self.buildNext = False
        self.mLR = False
        self.gdb = GestureDatabase()
        self.GSTR_DROP = \
        self.gdb.str_to_gesture('eNq1l82O2jAQgO9+Ebg08ng8M/YL0GslHqBKIQK0W4iSbHf37WtPIjZS/6Si4WIYez4P+Yyxt5eny4/35tSN08vQuc9L23u3Pfbg9ptr+73buD6Ut6VBN+434zTcnrqxfIxu+9yT2/4WstdhrueKkpLf3y7Xqaalmpb/kPaljnI9zBXUEt5LCgS3803EKCmwT5yJCXKt5q32Yu31HsETZe85AIAQsBu/tX+fJuo05E7zDEEEBDOg17k8ufH0AF2/O4gRPSk929CDCghgRA9KRyO6Wg13qx7viyaUaRLyY3jVGsQKr15DNsKjikWwwqtZRCu8qkUrtahq0Uotqlpc1H7yDaT1jhbKY3sEH1VtBCu8qo1ohVe1kazwqjaKFV7VRiu1pGrJSi2pWvpQG0Ne/9k+SFezREZ0FUtiRFevlG3orFoZjOhqlY2sslplI6usVtnIKqtV/rC6bPDLCSTBQi89HhIjUvQogcWXn+C/4KJSBWzg6lTQBq5Khf4XXm8Hh6HrrvezvnA97Iu47Q4FG+92UUJppl6Sa38N5nUwogaTXwUxpzkI6yAtwbAOQmnWL64jUEdwriNCWtKia+fqz93ldJ7qHYXcrmyxpbtEXy/H6VyDXIqaQ9PtuRva66FejpLUZQg1vDzWr/1wO74cFJRKJQ2Vs4OUK0sMwEF0gTY/AXq8jUg=')
        self.gdb.add_gesture(self.GSTR_DROP)
        self.dropAnimation2 = Animation(colored=self.inactive_color, d=.03)
        self.dropAnimation = Animation(colored=self.inactive_color, d=.1)
        self.spectate = False

    def simplegesture(self, name, point_list):
        # Pomocná funkce pro rozpoznávání gest
        g = Gesture()
        g.add_stroke(point_list)
        g.normalize()
        g.name = name
        return g

    def generate(self):
        # Algoritmus pseudonáhodného generování herních bloků
        a = 0x08088405
        c = 1
        M = 2**32
        self.seed = (a * self.seed + c) % M
        block = int(self.seed * 100. / M)
        self.seed = (a * self.seed + c) % M
        orientation = int(self.seed * 4. / M)
        return (block, orientation)

    def build(self, dt):
        # Pomocná funkce pro automatické volání
        self._build()

    def _build(self):
        # Přidá do pole nový herní blok
        if self.startgame == False:
            self.stack = [self.generate() for y in range(5)]
        st = self.stack.pop(0)
        piece = int(self.app.serverConf.blockFreq[st[0]])
        nextPC = int(self.app.serverConf.blockFreq[self.stack[0][0]])
        self.app.nextPiece.showNext(nextPC)
        orientation = st[1]
        if piece in (1, 5, 6):
            if orientation % 2 == 0:
                self.orientation = 0
            else:
                self.orientation = 1
        elif piece == 2:
            self.orientation = 0
        self.shape = deepcopy(PIECES[piece])
        self.active_color = deepcopy(COLORS[piece])
        self.stack.append(self.generate())
        full = False
        for box in self.shape[self.orientation]:
            if tuple(box) in self.colored:
                full = True
                break
        if full == False:
            for box in self.shape[self.orientation]:
                self.drop(box)
            for box in self.shape[self.orientation]:
                self.mark(box)
            if self.app.tetrifast:
                self._fall()
            Clock.schedule_interval(self.fall,
                                    (1005 - (self.app.lvl * 10)) / 1000.)
            self.app.send_message("f " + str(self.app.id) + " " + self.fUpdate)
            self.startgame = True
        else:
            self.startgame = False
            self.spectate = True
            self.app.send_message("playerlost {0}".format(self.app.id))
            for i in range(22):
                self.addLine()
        self.buildNext = False
        self.blockRotation = False

    def get(self, x, y):
        # Vrátí objekt Box - 1 kostku z pole
        return self.coords[y][x]

    def getMinMax(self, shape):
        # Vrací minimální a maximální souřadnice bloku
        x = []
        y = []
        for box in shape:
            x.append(box[0])
            y.append(box[1])
        return {'x': (min(x), max(x)), 'y': (min(y), max(y))}

    def drop(self, coords, anim=0):
        # Přebarví kostku na šedou (barva pole)
        box = self.get(coords[0], coords[1])
        box.colored = deepcopy(self.inactive_color)
        box.active = False
        box.texture = False
        box.sb = False

    def mark(self, coords, random=False, anim=0):
        # Přebarví kostku na barevnou
        box = self.get(coords[0], coords[1])
        box.colored = self.active_color if random == False else choice(
            deepcopy(COLORS))
        box.active = True

    def fall(self, dt):
        # Pomocná funkce pro automatické volání
        print self.colored
        self._fall()

    def _fall(self, animate=1):
        # Slouží ke spadení bloku o jedno dolů (každou cca 1 s)
        if (self.buildNext == False) and self.startgame and (self.app.paused
                                                             == False):
            anim = []
            unschedule = False
            next_pos = deepcopy(self.shape[self.orientation])
            for box in next_pos:
                box[1] += 1
            if self.shape[self.orientation][-1][1] >= 21:
                unschedule = True
                print "< fall unschedule >"
            elif len(self.colored.intersection(set(tuple(y)
                                                   for y in next_pos))) != 0:
                unschedule = True
            else:
                for box in self.shape[self.orientation]:
                    self.drop(box, anim=animate)
                for i in self.shape:
                    for box in i:
                        box[1] += 1
                for box in self.shape[self.orientation]:
                    self.mark(box, anim=animate)
                unschedule = False
            if unschedule == True:
                self.blockRotation = True
                print "Current: " + str(self.shape[self.orientation])
                print "Next: " + str(next_pos)
                Clock.unschedule(self.fall)
                for i in self.shape[self.orientation]:
                    try:
                        g = self.get(i[0], i[1])
                        if g.colored != [.1372, .1372, .1372, 1]:
                            anim.append(g)
                            self.colored.add(tuple(i))
                    except:
                        pass
                self.orientation = 0
                self.tetris(anim)
                del (anim)
                self.buildNext = True
                if self.app.tetrifast == False:
                    Clock.schedule_once(self.build, 1)
                else:
                    self._build()
                unschedule = False

    def on_touch_down(self, touch):
        # Uživatel se dotkl pole
        if self.collide_point(touch.x,
                              touch.y) and self.startgame and (self.app.paused
                                                               == False):
            touch.grab(self)
            touch.ud["line"] = Line(points=(touch.x, touch.y))

    def on_touch_move(self, touch):
        # Uživatel pohybuje s prstem po poli
        if (touch.grab_current is self) and self.startgame and (
                self.app.paused == False) and (self.blockRotation == False):
            touch.ud["line"].points += [touch.x, touch.y]
            self.box_size = self.get(0, 0).size[0]
            self.dpos = (touch.dpos[0] + self.dpos[0],
                         touch.dpos[1] + self.dpos[1])
            if abs(self.dpos[0]) >= self.box_size:
                next_pos = deepcopy(self.shape[self.orientation])
                for box in next_pos:
                    box[0] += int(
                        round((0.5 * self.dpos[0]) / self.box_size, 0))
                minmax = self.getMinMax(next_pos)
                if minmax['x'][0] < 0 or minmax['x'][1] > 11:
                    pass
                elif len(
                        self.colored.intersection(
                            set(tuple(y) for y in next_pos))) != 0:
                    pass
                else:
                    for box in self.shape[self.orientation]:
                        self.drop(box, anim=1)
                    for i in self.shape:
                        for box in i:
                            box[0] += int(
                                round((0.5 * self.dpos[0]) / self.box_size, 0))
                    for box in self.shape[self.orientation]:
                        self.mark(box, anim=1)
                    self.move = True
                    self.mLR = True
                self.dpos = (0, self.dpos[1])
            if -1 * (self.dpos[1]) >= 1.05 * self.box_size:
                for i in range(
                        abs(int(round(self.dpos[1] / self.box_size, 0) * 1))):
                    self._fall()
                self.move = True
                self.dpos = (self.dpos[0], 0)

    def on_touch_up(self, touch):
        # Uživatel zvedl prst z obrazovky
        if touch.grab_current is self:
            g = self.simplegesture(
                '',
                zip(touch.ud['line'].points[::2],
                    touch.ud['line'].points[1::2]))
            g2 = self.gdb.find(g, minscore=0.80)
            if g2 and (self.mLR == False) and (self.blockRotation == False):
                if g2[1] == self.GSTR_DROP:
                    print "< GESTURE: Drop >"
                    for i in range(21 - self.shape[self.orientation][-1][1]):
                        self._fall(animate=2)
                    self.mLR = False
            else:
                if (self.mLR == False) and (self.move
                                            == False) and (self.blockRotation
                                                           == False):
                    if touch.x <= self.parent.size[0] / 2.:
                        self.rotate(False)  #left
                    else:
                        self.rotate(True)  #right
                self.mLR = False
            if self.move == True:
                self.move = False
            touch.ungrab(self)

    def dropAnim(self, fall):
        # Animace padání bloku
        if fall:
            d = .1
        else:
            d = .2
        boxes = []
        for box in self.shape[self.orientation]:
            if ((box[0] >= 0) and (box[0] <= 11)) and ((box[1] >= 0) and
                                                       (box[1] <= 21)):
                cur = self.get(box[0], box[1])
                a = Box()
                a.size = cur.size
                a.pos = cur.pos
                a.colored = cur.colored
                a.size_hint = (None, None)
                boxes.append(a)
                self.app.sOverlay.add_widget(a)
        if len(boxes) != 0:
            anims = [
                Animation(y=p.y - p.size[1], opacity=0., t='linear', d=d)
                for p in boxes
            ]
            for i in range(len(boxes)):
                anims[i].start(boxes[i])
            Clock.schedule_once(self.clearAnimation, d)

    def fellAnim(self, widgets):
        # Animace po spadení bloku (změna barvy)
        color1 = widgets[0].colored
        color2 = [y + .3 for i, y in enumerate(color1) if i < 3] + [
            color1[-1],
        ]
        anim = Animation(colored=color2, duration=.2) + Animation(
            colored=color1, duration=.2)
        for i in widgets:
            anim.start(i)

    def clearAnimation(self, dt):
        # Odstraní widgety vytvořené animací
        self.app.sOverlay.clear_widgets()
        print "< widgets cleared >"

    def rotate(self, direction):
        # Otáčení s blokem
        maximum = len(self.shape)
        now = deepcopy(self.orientation)
        if direction:  #left
            self.orientation -= 1
            if self.orientation < 0:
                self.orientation = maximum - 1
        else:  #right
            self.orientation += 1
            if self.orientation > maximum - 1:
                self.orientation = 0
        if now != self.orientation:
            for box in self.shape[now]:
                self.drop(box)
            coords = self.getMinMax(self.shape[self.orientation])
            if coords['y'][1] > 21:
                print "posunout nahoru o {0}".format(coords['y'][1] - 21)
            if coords['x'][0] < 0:
                print "posunout doprava o {0}".format(abs(coords['x'][0]))
                for s in self.shape:
                    for box in s:
                        box[0] += abs(coords['x'][0])
            if coords['x'][1] > 11:
                print "posunout doleva o {0}".format(coords['x'][1] - 11)
                for s in self.shape:
                    for box in s:
                        box[0] -= coords['x'][1] - 11
            if len(
                    self.colored.intersection(
                        set(tuple(y)
                            for y in self.shape[self.orientation]))) != 0:
                self.orientation = now
            for box in self.shape[self.orientation]:
                self.mark(box)
        print self.orientation

    def tetris(self, anim):
        # Rozhoduje o tom, zda byl vyplněn řádek (voláno po spadení bloku)
        full = []
        for i in self.colored:
            full.append(i[1])
        lines = []
        for i in range(22):
            if full.count(i) == 12:
                lines.append(i)
        if len(lines) != 0:
            if self.app.onAndroid():
                self.app.vibrate(0.05)
            self.app.linesCleared += len(lines)
            if self.app.linesCleared % int(self.app.serverConf.linesLvl) == 0:
                self.app.lvl += int(self.app.serverConf.lvlInc)
            print "Lines cleared: " + str(self.app.linesCleared)
            print "Level: " + str(self.app.lvl)
            for i in range(len(lines)):
                for j in range(12):
                    self.colored.remove((j, lines[i]))
                    self.specials.discard((j, lines[i]))
                    box = self.get(j, lines[i]).sb
                    if box != False:
                        self.app.dock.addSpecial(box)
                    self.drop((j, lines[i]))
            lns = deepcopy(lines)
            lns.sort()
            print lns
            for num, ln in enumerate(lns):
                colored = list(self.colored)
                colored.sort(cmp=lambda x, y: cmp(x[1], y[1]))
                colored.reverse()
                for coord in colored:
                    if coord[1] < ln:
                        new = (coord[0], coord[1] + 1)
                        box = self.get(coord[0], coord[1])
                        newColor = box.colored
                        sType = box.sb
                        self.drop(coord)
                        self.colored.discard(coord)
                        if sType != False:
                            self.specials.discard(coord)
                        box = self.get(new[0], new[1])
                        box.colored = newColor
                        self.colored.add(new)
                        if sType != False:
                            box.special(sType)
                            self.specials.add(new)
            if self.app.serverConf[-2] == '1':
                if len(lines) >= 2 and len(lines) <= 3:
                    self.app.send_message("sb 0 cs{0} {1}".format(
                        len(lines) - 1, self.app.id))
                    print "add id:" + str(self.app.id)
                elif len(lines) == 4:
                    print "Tetris!"
                    if self.app.serverConf[-2] == '1':
                        self.app.send_message("sb 0 cs{0} {1}".format(
                            4, self.app.id))
                    print "add id:" + str(self.app.id)
            else:
                print "< tetris() >"
            if self.app.linesCleared % int(
                    self.app.serverConf.linesSpecial) == 0:
                self.addSpecial()
        else:
            self.fellAnim(anim)
        self.fieldUpdate()

    def addSpecial(self):
        # Přidá novou speciální kostku do pole
        if len(self.colored) - len(self.specials) > 0:
            special = choice(list(self.colored.difference(self.specials)))
            self.specials.add(special)
            self.drop(special)
            box = self.get(special[0], special[1])
            sType = SPECIALS[
                int(self.app.serverConf.specialFreq[randint(0, 99)]) - 1]
            box.special(sType)
            print sType
            print special
        else:
            for i in range(20):
                col = randint(0, 11)
                empty = True
                for c in self.colored:
                    if c[0] == col:
                        empty = False
                        break
                if empty == True:
                    self.colored.add((col, 21))
                    self.specials.add((col, 21))
                    self.drop((col, 21))
                    box = self.get(col, 21)
                    sType = SPECIALS[
                        int(self.app.serverConf.specialFreq[randint(0, 99)]) -
                        1]
                    box.special(sType)
                    print sType
                    print(col, 21)
                    print "< Add special >"
                    break

    def addLine(self, update=True):
        # Přidání náhodného řádku do pole (speciální kostkou)
        garbage = [randint(0, 7) for i in range(12)]
        garbage[randint(0, 11)] = 0
        move = list(self.colored)
        move.sort(cmp=lambda x, y: cmp(x[1], y[1]))
        for coord in move:
            if coord[1] <= 21 and coord[1] >= 1:
                new = (coord[0], coord[1] - 1)
                box = self.get(coord[0], coord[1])
                newColor = box.colored
                sType = box.sb
                self.drop(coord)
                self.colored.remove(coord)
                if sType != False:
                    self.specials.discard(coord)
                box = self.get(new[0], new[1])
                box.colored = newColor
                self.colored.add(new)
                if sType != False:
                    box.special(sType)
                    self.specials.add(new)
        for i, cell in enumerate(garbage):
            box = self.get(i, 21)
            box.texture = False
            if cell > 0:
                box.colored = COLORS[cell]
                self.colored.add((i, 21))
            else:
                box.colored = self.inactive_color
                self.colored.discard((i, 21))
        if update:
            self.fieldUpdate()
        for i, b in enumerate(self.shape):
            drop = False
            if i == self.orientation:
                drop = True
            for box in self.shape[i]:
                box = [box[0], box[1] + 1]
            if drop:
                for box in self.shape[i]:
                    self.drop(box)
                for box in self.shape[i]:
                    self.mark(box)

    def fieldUpdate(self, *args):
        # Vytvoření řetězce pro aktualizaci pole a odeslání aktualizace
        fupdate = ""
        for y in range(22):
            for x in range(12):
                s = set()
                s.add((x, y))
                if self.colored.issuperset(s):
                    box = self.get(x, y)
                    if box.sb == False:
                        fupdate += str(self.colors.index(box.colored))
                    else:
                        fupdate += box.sb
                else:
                    fupdate += '0'
        print fupdate
        d = []
        prev = False
        for i in range(len(self.fUpdate)):
            if self.fUpdate[i] != fupdate[i]:
                try:
                    color = int(fupdate[i])
                except:
                    color = self.tnetColors.index(chr(39)) + SPECIALS.index(
                        fupdate[i])
                if prev == False:
                    d.append(self.tnetColors[color])
                    prev = fupdate[i]
                else:
                    if prev != fupdate[i]:
                        d.append(self.tnetColors[color])
                        prev = fupdate[i]
                d.append(self.tnetCoords2[i])
        self.fUpdate = fupdate
        dstr = "f " + str(self.app.id) + " "
        for i in d:
            dstr += i
        self.app.send_message(dstr)
        self.app.print_message(dstr + "\xff")

    def clearLine(self):
        # Odstraní řádek od konce (speciální kostkou)
        for j in range(12):
            self.colored.discard((j, 21))
            self.specials.discard((j, 21))
            self.drop((j, 21))
        colored = list(self.colored)
        colored.sort(cmp=lambda x, y: cmp(x[1], y[1]))
        colored.reverse()
        print colored
        for coord in colored:
            if coord[1] < 21:
                new = (coord[0], coord[1] + 1)
                box = self.get(coord[0], coord[1])
                newColor = box.colored
                sType = box.sb
                self.drop(coord)
                self.colored.remove(coord)
                if sType != False:
                    self.specials.discard(coord)
                box = self.get(new[0], new[1])
                box.colored = newColor
                self.colored.add(new)
                if sType != False:
                    box.special(sType)
                    self.specials.add(new)
        self.fieldUpdate()

    def nuke(self):
        # Vyprázdnění pole (speciální kostkou)
        for box in self.colored:
            self.drop(box)
        self.colored = set()
        self.specials = set()
        self.fieldUpdate()

    def randomClear(self):
        # Náhodné odstranění několika kostek (speciální kostkou)
        cells = []
        for i in range(10):
            cells.append((randint(0, 11), randint(0, 21)))
        for coord in cells:
            self.colored.discard(coord)
            self.specials.discard(coord)
            self.drop(coord)
        self.fieldUpdate()

    def clearSpecials(self):
        # Odstraní všechny speciální kostky (speciální kostkou)
        coords = list(self.specials)
        for coord in coords:
            self.specials.discard(coord)
            self.drop(coord)
            self.mark(coord, True)
        self.fieldUpdate()

    def quake(self):
        # Náhodně posune řádky o 3 doleva/doprava (speciální kostkou)
        colored = list(self.colored)
        colored.sort(cmp=lambda x, y: cmp(x[1], y[1]))
        cells = [[y[0], y[1]] for y in colored]
        prev = None
        rnd = 0
        for cell in cells:
            if prev != cell[1]:
                prev = cell[1]
                rnd = choice(range(-3, 4))
            cell[0] += rnd
            if cell[0] > 11:
                cell[0] -= 11
            elif cell[0] < 0:
                cell[0] = 12 + cell[0]
        print cells
        for i in range(len(colored)):
            new = (cells[i][0], cells[i][1])
            box = self.get(colored[i][0], colored[i][1])
            newColor = box.colored
            sType = box.sb
            self.drop(colored[i])
            self.colored.discard(colored[i])
            if sType != False:
                self.specials.discard(colored[i])
            box = self.get(new[0], new[1])
            box.colored = newColor
            self.colored.add(new)
            if sType != False:
                box.special(sType)
                self.specials.add(new)
        self.fieldUpdate()

    def switchField(self, pid):
        # Vymění si pole s protivníkem (speciální kostkou)
        for y in range(22):
            for x in range(12):
                sender = self.app.overlay.children[0].children[
                    pid].matrix.coords[y][x]
                if type(sender) == type(None):
                    self.drop((x, y))
                    self.colored.discard((x, y))
                    self.specials.discard((x, y))
                else:
                    newColor = sender.colored
                    newStype = sender.sb
                    box = self.get(x, y)
                    box.colored = newColor
                    self.colored.add((x, y))
                    if sender.sb != False:
                        box.special(newStype)
                        self.specials.add((x, y))
        self.fieldUpdate()

    def gravity(self):
        # Spadení kostek, vyplnění mezer (speciální kostkou)
        colored = list(self.colored)
        colored.sort(cmp=lambda x, y: cmp(x[1], y[1]))
        colored.reverse()
        color = [
            colored,
        ]
        i = 0
        while True:
            color.append([])
            for b in color[i]:
                if b[1] < 21:
                    if (b[0], b[1] + 1) not in color[i]:
                        color[i + 1].append((b[0], b[1] + 1))
                    else:
                        color[i + 1].append(b)
                else:
                    color[i + 1].append(b)
            if color[i] == color[i - 1]:
                break
            i += 1
        color = color[-1]
        for j, b in enumerate(colored):
            if b != color[j]:
                old = self.get(b[0], b[1])
                new = self.get(color[j][0], color[j][1])
                new.colored = old.colored
                new.sb = old.sb
                new.texture = old.texture
                self.drop(b)
                self.colored.remove(b)
                self.colored.add(color[j])
                if new.sb != False:
                    self.specials.remove(b)
                    self.specials.add(color[j])
        self.fieldUpdate()

    def blockBomb(self):
        # Odstranění kostek blockbomb a vystřelení okolních do pole
        # (speciální kostkou)
        bombs = []
        colored_remove = []
        s = range(-1, 2)
        s.reverse()
        for bomb in self.specials:
            box = self.get(bomb[0], bomb[1])
            if box.sb == 'o':
                bombs.append(bomb)
        for bomb in bombs:
            self.specials.remove(bomb)
            for i in range(-1, 2):
                for j in s:
                    b = (bomb[0] + i, bomb[1] + j)
                    if b in self.colored:
                        colored_remove.append(b)
                        new = choice(
                            list(
                                self.COORDS_SET.difference(
                                    self.colored.union(
                                        set([
                                            tuple(a) for a in self.shape[
                                                self.orientation]
                                        ])))))
                        self.colored.add(new)
                        new = self.get(new[0], new[1])
                        old = self.get(b[0], b[1])
                        new.colored = old.colored
        for bomb in bombs + colored_remove:
            self.colored.discard(bomb)
            self.drop(bomb)
        self.fieldUpdate()
Ejemplo n.º 16
0
from kivy.gesture import GestureDatabase

gdb = GestureDatabase()

cun_1 = gdb.str_to_gesture(
    "eNp91FtMFFcYwPFFF4QtSrGoWG+0Ul1aXS9V630XtY6K1lWhDirg7jIyK7LLtzsLrPKFNSpGoQ1tNCo2RZPGWDWR+NCEF/EFE3kQrZcmplqrJsY"
    "+VKMxxsSkPWfynXgyITMvO/nP78w5czYzqaGh2nBD0lOjxY1ETHMp9AuOor2QhjDEraY7HI7GcLWhw1DFe+H0RXdtv0PNYFHXwjW6AU7F+7zS"
    "/8eRuU/UHFbpTlX1sWh1ImRAuuJzfpf"
    "+647nr9Vh7HLciEVrtThkVMCwQafeZAIXZLIFZCG43OZc9dFwxIjDBxWQ7R50mJ8DFwxno0Yg5LjVNDaqCT5Uek+uBK2yJdMMSchVvH87S44"
    "/O5efCOpcj0T4yK2/dzoT91+9LfjlxWESeQij7MVohDFWcW902dOXxWtJ5COMtYq78y9d9P7oIvExwjh7MR5hglXczPWEzpwNkpiIMMleFCB8Yi8"
    "+RZhsFVff6Nennb9FohDhM3sxBWGqvXAjFJmiw8yPueju+b7zdOoBic8RvrAX0xCm2wsPwgxTtOU0tD/qv8DFiXP5wy"
    "//VkBiJsIsezEb4UsuvM3lm7uuOW8w0XuppTDv59zZJOYgzLUX8xC+shfzERaY4ge2X4V5nVz0Bv69"
    "+VO5SmIhwiJTHLmTnfHX1ilc9JnbK1a6GGGJvViK4DXF8RV8n2Jc9Ne97n6jD5DwIRSboouvzlPCxcDU/eyFOUtiGcJyq"
    "/j9aPJdx8ZGEisQvrYXKxEUq7htvi9rSKxCWG0Vd9P5Qv4hsQahxCruje3j85BYi7DOXnyDsN4q/sw8NutWqScR1NRs/r0KxTQtQp8ffwVscCu"
    "+A90Ofii+9g7zpBU2yjFFcZMcfRRLpdj2n3m0Qpkct5P8VoqHxfDNUjw0iYarUjx4imS5FFsdFLew+JDivocUt7L4QsQCitvYKD"
    "/FvX6KFSymKKbEOitZ7KDYYg5Pa4UqFk9RRLGk7SxeodjsIxmQ4h5xz6AUd6dIhqSYFPeslqODpCbFJvF37JBio3j2GjleoajLsYs2OSxHcc"
    "+dchSLr5WjeMxdchSbXCfFBjF7RI5i9qgcxSbXSzHRQhLkKDYkJkWjimRcinGxIYYchUzIUSy"
    "+gcUb1tg4mGxisdsak1oiGFCz2LkR3aXFApGQBrsVb88JfnSqTnYhEqjTYI/KPTQngp7/ARKJ1wE= "
)

cun_10 = gdb.str_to_gesture(
    "eNp9lHtQlFUUwBdByIUEs4dlKQraYglkpgTafqb5SRmhaG0QLbCsLCG7e/YBLHnjuctLiD8am"
    "+jFODXDOOXgOE45OrPQ2MSMk4AMZekkf2hNDwend1Mzde7tHIZhmN1/9u7v+917zj3nfNsYbauqrAmkV9i9Pr"
    "/HbtTpGwxpTRAlYIHJstBgMNRWlvscEK2br5+d+CN+wwJLLEKHvbLC4YMY3TydljCYMpFtSURKJ1ndHle53"
    "+aDhbqWlJtRtCT7jCUOH3t9HleV3QuxxRA3b+gCJRjhFkxgkQCjScVyuyqdPi/EF0OCad5t+VIwwq24a7GARJMlCnfVQZJuHn"
    "+r6K9vdrYqEIAlunnqMv5umfSXOaR9m4ClJgd653t6l4Wu/+hA42pV3vp/ppPJuF3AHcr49MLPG1cMHJHGlRt9E10N2WTcKeAuZYQLwfVdwCSNr"
    "/t/2/H3geNkLBNwtzIGY1edPrTuJ2l8Obx272e74sm4R8DyyMa9Au6TRvgdmca7+6QxYfk"
    "+qt1ZTMYKASsjG8kCVinjZM7IWP3RJmmMO63GMzFHyFgtIEUZ4QapqNte2O75c"
    "/+lNWSkClijjBEsUsq2b6Ux0jK59EbfKBlrBdwf2TAJSFPGmKx0iiaN4X/Vh4x1Ah5QxoRsy81j0vi48dzmjGABGQ8KWK"
    "+Myfqj4mShWxonZFtywmSkC8j438h97cTF6MXSeFNdq5eMTAEPKWP8fdn+a2iEe776MOujXzeRsUHAw8oYUm1JksbQ8tc"
    "/OT6cSsZGAY9ENjYJ2BzZyBLwaGQjW0COMgKY3S9nB6RxXq6648jYImBrZOMxAebIhiZgm5rCU7b3cA6rpTEuSzrCnXtcwPbIxg4BTyhjRF1gtTS"
from kivy.gesture import GestureDatabase
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App
from kivy.gesture import Gesture

# 构建需要响应的手势数据
ges_strs = {
    'left_to_right_line': 'ds...',  # 这里为什么必须很长的字符串 ??表示不解
    'right_to_left_line': 'df...',  # 这里为什么必须很长的字符串 ??表示不解
    'bottom_to_top_line': 'eNq1m...'  # 这里为什么必须很长的字符串 ??表示不解
}
gestures = GestureDatabase()

for name, ges_str in ges_strs.items():
    gesture = gestures.str_to_gesture(ges_str)  #TODO bug
    gesture.name = name
    gestures.add_gesture(gesture)


class MyGesure(BoxLayout):
    def on_touch_down(self, touch):  # 检测开始触摸动作
        touch.ud['gesture_path'] = [(touch.x, touch.y)]  #记录动作坐标
        super().on_touch_down(touch)

    def on_touch_move(self, touch):  # 检测开始划动动作
        touch.ud['gesture_path'].append((touch.x, touch.y))  #记录划动坐标
        super().on_touch_move(touch)

    def on_touch_up(self, touch):  #当手指抬起时
        # print(touch.ud['gesture_path'])
from kivy.gesture import GestureDatabase
# Fri Jan 29 07:20:33 AEDT 2016
'''Gestures created by Troy J. Watson
for simple program that detects up, down, left, right swipes
'''

gdb = GestureDatabase()

up = gdb.str_to_gesture(
    'eNq1l0tu2zAQQPe8SLyJQc6Xc4FkWyAHKJxEcIyktmArbXP7UiNbYdq0XQj0RtZ4+IacR8jiave8+/623nan4fXYhdvztY9h9dincHe133zrrkIP5Wu5YDjdXZ2G4+G5O5VbCquXnsPqU8idp4VeRpSW8f1htx/GYXkcZn8Z9mXMCn2aZjBO4a0MSRBuruOalUwoYwZmU5VxOj/HnzHcpHVKEQAjkAAnFu6uU8m43/y7EHkhDttLDSTizNESQWTkcNouwfvyk854ukx+WoktxGfHWyM8uAVIrfDgeJzxYBYTk6YkimKGC/nuFrgZ3+WCNuO7XbBWfHS9+K532vLz/qeFeNeL2ArvdpFb4V0uaiu8u0VrhCdXS+9qY9SsUjgiKVLM5ZG0rIDLJWxXwPUStyvggknbFXDFZM0KsEvms+TCt5hZjYSZEmWDhXhXzNgK74KZW+FdL+sFn4RAWSRHxYSylO5u2drQxcXKLBaSEhUOR+Qk5U9/Gd29Cjaiu1aZtcKlJ1ODFm55casyW0UQjNEyMeRcbhbS3apYG7q6VZ2tYk5mmrJGiaTlxWoh3rUqtsK7V529UgJUMcRsbJD+v+PHo8PDsev280GgvMCXk4BqWN0g6zqW0WjlMvSaw+ZD0OqPjhlWZxCXh2v1wZKRY53B9CcjpzrD0EtnqIJAeQpiFcT423xozKA6Q84sroIU0yfDpM7A+EmG1hkME7juD+k5WLeEjD1odRc46RSsF84w9dzqhTNOTMMPwWlZRh+CNAXLWifLT91u+zQUvyalFT6PEv2xexyexqD6w34MDYeX7rjZP4wnTMv+GB3D5/33tT8eHl8fHGRFRTn9Jcjl1BeZcoTS8NP9+hdRYNgw')

right = gdb.str_to_gesture(
    'eNq1l01u2zAQhfe8SLypweH8kRdwtwVygMJNBMdIagu20ja3LzlUbAlIIm/oxch+Gn7k8FHCeLV/3v95W++68/B66tz38dp7t3rswd3fHba/uzvXh/w1X9Cd7+/Ow+n43J3zT3Krl57d6kPIvaW5XgpK8/j+uD8MZVgsw9Inw36ULNdDXUFZwlseAsFtvvm1D+SFE9aIClQW9K8koCVIwpBE/Rjd+df262nIpmG3u8wAUSLgGClzz7t3OGJi8TRGXaZb7aBXOvioCcIYWelKZ08hci7JIqZlejR6akMPZkCARvRgdGxEN1cDN6Kbq2HiqheKyDBGSBM6UgwEyjVqkmW82RpSIzyarwit8GYsYiu8OYvcCm/W4m3WQrwcqBx95GW8WYupEZ7MWoJWeLOWsBXerCVuhTdr6TZrPVEi9jzG8rpYwpu1lBrh2axlaIU3axlb4c1avsHafEumdPbL72M2Z1kb0c1YTm3oYr4KNKKbrYK30AGVNHAYYy57kW6uCjeim6sydXXyxANYd/dO10vHVyItvw3EXJXR1QKfnOhESeMFHjxOm05dbirVTFW4wmWyPs3txxUecNpv0vKzpOap4gUOs45XwgQuk5JuOS9qjirfwtZrk5yjrbv8N3g4dd3h0umrlFZf1a02GbX2boNQLkOfN3hbRJ6JyUROVcS8c5OP5IzoS0bu0ee3sKRHY0SwjFgZwVcxFBGFZyIWkYKs0/RDkwyyDP0ig0tG3tvPM8QyQqxT10Kjmki+ivxBobFmjGVIHWb7w6xVrAUn2xIWqWKqou1C7nNnou0CR5iJWMV5JlWRZ2KtNc4nquVFnYm5vHoenrr97mnIJyFFt4GSlMW/+8fhqWjJbYi5isPxpTttDw/l3yZ4b4910ceT+rM/HR9fHwa7C3mqdeDo87ITI/vyOln/Bwbt1kU=')

left = gdb.str_to_gesture(
    'eNq1l01u2zAQRve8SLypweH8cS7gbgvkAIWbCI6R1BZsp21u3+EoSCKgqbyhvZD8SXzk6FEytdo/7n+9rHfD+fJ8GtLX1+2Y0+p+hHR7c9j+HG7SWHzXN5jOtzfny+n4OJz9J6XV08hp9U/IbZyWRmko9fbjcX+4tGa1NbNPmn1rZ6URphG0Ibx4Eyhpk9cZkJEZqu8QopYYz592HNtxASn+ESVGMSrp/GP7/14oeuG0+7yD3cTmXDIyeQ9UpIAss6Nw0C7sGmzrwS5x5Qu8sbMIMOSitXLJBd/ZqKyoFf2rxpmW2SXY2IUdLgt3YYfLol3Y4bLYFexSqqhloMqVsS67xHCJ0IUdLhG7sMMlchd2uETtwg6XeI3LrELFfI4YZCJ/TCyxKVwSdGGHS8Iu7HBJ3IUdLkm7sMMlLbv84scENXta0SizMC/SOWwydKKHT8ZO9DDK3IkeTlmvoYNYIaqS/ZnrbvEKelhl60OXsCrQiR5WBTvRw6pcZbVQBjUAkWLIeflmkpAq2gceTuXVaZt0uRpzRSBRXxdlgw9006KFqRSkWpfhGkoV+sDDqOI7HMi5QKVWX8r6ddF3OE4rCkSuhF7zIjyEKl8HF1IStiyqahh/dW2tf3cahsPbyl2lLd1V02ojiuucNq7IN5dRa9q2EGahRcj8Maw5wqyzEFrISBFWm8LSQiKbhdhCFJiF1MJS8yzkCGHeXFoIWmehRkjTOIPiYVQEZepIdQqjIsjyMbSoyGyWRUGmsyzqsXnbKMd4lnk10+V/GPa7h4tfeOO0gdbQw9/7+8tDyyRtOArx8HJ8Gk7bw117WTNttxi0+HVmfB9Px/vnuyBV72gt4q8JPlENTfx9oc3U9V8cG66W')

down = gdb.str_to_gesture(
    'eNq1l8tOWzEQhvfnRcim0dzH8wJ0W4kHqChEELWFoyS9vX3tcSAnKi1VK2dzwp/xZ8efGcxq+3H79cf6brM/fNltprfH5wzT6nbG6eri4frz5mKaqb6tD572Vxf7w+7x42Zff5Rp9WnWafUi5CrLptkayuv4+XH7cGjDShsWvxn2rlVNM/YVtCX8qEOQpktYG6MqFCDkAHZtq/nePuXp8g2sQYCKEkgEQvE6Zv/h+s+zSM6i012fQKMQulgpoA4y7e/+HZ3fG/0ZzaIFERQtWKD8F7skO0awKTee8IktCMzFCgRZoPF/sSnZPISdKkmHsNMl+RB2uqRnl6SlECuFILqJL9gsRFKPaDBIQXidzemScQg7XTIPYadL1iHsdMnPLsE8UISLApmz2wKOAc5Q2L2EtTW8Tk+bHGPokj4FB9HTqPAgejoVHURPqzLIqqRVOVqtDOyNVuzYeJ/wlf7UhPtn9ci+Ste0qjiInlaVB9HTquogelpVH0RPqzrIqqVVO1mlY/OCYzPDEx2dAlRrmxOr147g1+lp1XgQPa2aDqKnVfNB9LRqJ6sU6oRBisxWIk5wYlZELSZKbvoXcE+pjmPg6dRPTpkoQkxJwAR9wY7ljtnfsNOon4yyCNUm6WxYlEv9W/tnerv33+w2m4fnW3ztqfUa7z6tLll1DdNlXWh9HGYv0/UixB7GMkTOsMAilKD6i7Z4WavAZYV2Vm3ZGXqGcAw5Q6MW1utZDyVDhxaSew+1h5IhWw+th5Yh+jqWL28V3itKVkCcL5ZbRTmroA6OsxB+HRawqMB4YerAs4q+4qCzUF4Y1rfE46ni16nr/nS795vt3f2heg1t29c2rKbftreH+xZaXbv07PD4abO7frhp/xfWaeqRwRYfD977efd4++UmSaWS1u2qrAHWzlK9HteD9mH9E8xHxI4=')
Ejemplo n.º 19
0
class GameMatrix(GridLayout):
    def __init__(self, app, **kwargs):  # inicializace pole
        self.app = app
        super(GameMatrix, self).__init__(**kwargs)
        self.coords = []
        self.dpos = (0,0)
        self.colors = []
        self.shape = None
        self.active_color = [.1372,.1372,.1372,1]
        self.inactive_color = [.1372,.1372,.1372,1]
        self.fUpdate = 12*22*"0"
        self.tnetCoords2 = []
        for y in range(51,73):
            for x in range(51,63):
                self.tnetCoords2.append(chr(x)+chr(y))
        self.tnetCoords = []
        for x in range(51,63):
            col = []
            for y in range(51,73):
                col.append((chr(x), chr(y)))
            self.tnetCoords.append(col)
        self.tnetColors = []
        for c in range(33, 48):
            self.tnetColors.append(chr(c))
        self.move = False
        self.orientation = 0
        self.colored = set()
        self.colors = [deepcopy(self.inactive_color), [0,.6,.8,1], [1,.7333333,.2,1], [.6,.8,0,1], [.666666667,.4,.8,1], [1,.266666667,.266666667,1]]
        self.COORDS_SET = set()
        for y in range(int(self.rows)):
            line = []
            for x in range(int(self.cols)):
                box = Box()
                box.coords = (x, y)
                box.colored = deepcopy(self.inactive_color)
                self.add_widget(box)
                line.append(box)
                self.COORDS_SET.add((x, y))
            self.coords.append(line)
        self.b = 0
        self.startgame = False
        self.seed = randint(0,0xFFFFFF)
        self.specials = set()
        self.buildNext = False
        self.mLR = False
        self.gdb = GestureDatabase()
        self.GSTR_DROP = \
        self.gdb.str_to_gesture('eNq1l82O2jAQgO9+Ebg08ng8M/YL0GslHqBKIQK0W4iSbHf37WtPIjZS/6Si4WIYez4P+Yyxt5eny4/35tSN08vQuc9L23u3Pfbg9ptr+73buD6Ut6VBN+434zTcnrqxfIxu+9yT2/4WstdhrueKkpLf3y7Xqaalmpb/kPaljnI9zBXUEt5LCgS3803EKCmwT5yJCXKt5q32Yu31HsETZe85AIAQsBu/tX+fJuo05E7zDEEEBDOg17k8ufH0AF2/O4gRPSk929CDCghgRA9KRyO6Wg13qx7viyaUaRLyY3jVGsQKr15DNsKjikWwwqtZRCu8qkUrtahq0Uotqlpc1H7yDaT1jhbKY3sEH1VtBCu8qo1ohVe1kazwqjaKFV7VRiu1pGrJSi2pWvpQG0Ne/9k+SFezREZ0FUtiRFevlG3orFoZjOhqlY2sslplI6usVtnIKqtV/rC6bPDLCSTBQi89HhIjUvQogcWXn+C/4KJSBWzg6lTQBq5Khf4XXm8Hh6HrrvezvnA97Iu47Q4FG+92UUJppl6Sa38N5nUwogaTXwUxpzkI6yAtwbAOQmnWL64jUEdwriNCWtKia+fqz93ldJ7qHYXcrmyxpbtEXy/H6VyDXIqaQ9PtuRva66FejpLUZQg1vDzWr/1wO74cFJRKJQ2Vs4OUK0sMwEF0gTY/AXq8jUg=')
        self.gdb.add_gesture(self.GSTR_DROP)
        self.dropAnimation2 = Animation(colored=self.inactive_color, d=.03)
        self.dropAnimation = Animation(colored=self.inactive_color, d=.1)
        self.spectate = False
    
    def simplegesture(self, name, point_list):
        # Pomocná funkce pro rozpoznávání gest
        g = Gesture()
        g.add_stroke(point_list)
        g.normalize()
        g.name = name
        return g
    
    def generate(self):
        # Algoritmus pseudonáhodného generování herních bloků
        a = 0x08088405
        c = 1
        M = 2**32
        self.seed = (a*self.seed + c) % M
        block = int(self.seed*100./M)
        self.seed = (a*self.seed + c) % M
        orientation = int(self.seed*4./M)
        return (block,orientation)
    
    def build(self, dt):
        # Pomocná funkce pro automatické volání
        self._build()
    
    def _build(self):
        # Přidá do pole nový herní blok
        if self.startgame == False:
            self.stack = [self.generate() for y in range(5)]
        st = self.stack.pop(0)
        piece = int(self.app.serverConf.blockFreq[st[0]])
        nextPC = int(self.app.serverConf.blockFreq[self.stack[0][0]])
        self.app.nextPiece.showNext(nextPC)
        orientation = st[1]
        if piece in (1,5,6):
            if orientation % 2 == 0:
                self.orientation = 0
            else:
                self.orientation = 1
        elif piece == 2:
            self.orientation = 0
        self.shape = deepcopy(PIECES[piece])
        self.active_color = deepcopy(COLORS[piece])
        self.stack.append(self.generate())
        full = False
        for box in self.shape[self.orientation]:
            if tuple(box) in self.colored:
                full = True
                break
        if full == False:
            for box in self.shape[self.orientation]:
                self.drop(box)
            for box in self.shape[self.orientation]:
                self.mark(box)
            if self.app.tetrifast:
                self._fall()
            Clock.schedule_interval(self.fall, (1005 - (self.app.lvl * 10))/1000.)
            self.app.send_message("f "+str(self.app.id)+" "+self.fUpdate)
            self.startgame = True
        else:
            self.startgame = False
            self.spectate = True
            self.app.send_message("playerlost {0}".format(self.app.id))
            for i in range(22):
                self.addLine()
        self.buildNext = False
        self.blockRotation = False
            
    def get(self, x, y):
        # Vrátí objekt Box - 1 kostku z pole
        return self.coords[y][x]
    
    def getMinMax(self, shape):
        # Vrací minimální a maximální souřadnice bloku
        x = []
        y = []
        for box in shape:
            x.append(box[0])
            y.append(box[1])
        return {'x':(min(x), max(x)), 'y':(min(y), max(y))}
    
    def drop(self, coords, anim=0):
        # Přebarví kostku na šedou (barva pole)
        box = self.get(coords[0], coords[1])
        box.colored = deepcopy(self.inactive_color)
        box.active = False
        box.texture = False
        box.sb = False
    
    def mark(self, coords, random=False, anim=0):
        # Přebarví kostku na barevnou
        box = self.get(coords[0], coords[1])
        box.colored = self.active_color if random == False else choice(deepcopy(COLORS))
        box.active = True
    
    def fall(self, dt):
        # Pomocná funkce pro automatické volání
        print self.colored
        self._fall()
    
    def _fall(self, animate=1):
        # Slouží ke spadení bloku o jedno dolů (každou cca 1 s)
        if (self.buildNext == False) and self.startgame and (self.app.paused == False):
            anim = []
            unschedule = False
            next_pos = deepcopy(self.shape[self.orientation])
            for box in next_pos:
                box[1] += 1
            if self.shape[self.orientation][-1][1] >= 21:
                unschedule = True
                print "< fall unschedule >"
            elif len(self.colored.intersection(set(tuple(y) for y in next_pos))) != 0:
                unschedule = True
            else:
                for box in self.shape[self.orientation]:
                    self.drop(box, anim=animate)
                for i in self.shape:
                    for box in i:
                        box[1] += 1
                for box in self.shape[self.orientation]:
                    self.mark(box, anim=animate)
                unschedule = False
            if unschedule == True:
                self.blockRotation = True
                print "Current: "+str(self.shape[self.orientation])
                print "Next: "+str(next_pos)
                Clock.unschedule(self.fall)
                for i in self.shape[self.orientation]:
                    try:
                        g = self.get(i[0], i[1])
                        if g.colored != [.1372,.1372,.1372,1]:
                            anim.append(g)
                            self.colored.add(tuple(i))
                    except:
                        pass
                self.orientation = 0
                self.tetris(anim)
                del(anim)
                self.buildNext = True
                if self.app.tetrifast == False:
                    Clock.schedule_once(self.build, 1)
                else:
                    self._build()
                unschedule = False
    
    def on_touch_down(self, touch):
        # Uživatel se dotkl pole
        if self.collide_point(touch.x, touch.y) and self.startgame and (self.app.paused == False):
            touch.grab(self)
            touch.ud["line"] = Line(points=(touch.x, touch.y))

    def on_touch_move(self, touch):
        # Uživatel pohybuje s prstem po poli
        if (touch.grab_current is self) and self.startgame and (self.app.paused == False) and (self.blockRotation == False):
            touch.ud["line"].points += [touch.x, touch.y]
            self.box_size = self.get(0,0).size[0]
            self.dpos = (touch.dpos[0]+self.dpos[0], touch.dpos[1]+self.dpos[1])
            if abs(self.dpos[0]) >= self.box_size:
                next_pos = deepcopy(self.shape[self.orientation])
                for box in next_pos:
                    box[0] += int(round((0.5*self.dpos[0])/self.box_size,0))
                minmax = self.getMinMax(next_pos)
                if minmax['x'][0] < 0 or minmax['x'][1] > 11:
                    pass
                elif len(self.colored.intersection(set(tuple(y) for y in next_pos))) != 0:
                    pass
                else:
                    for box in self.shape[self.orientation]:
                        self.drop(box, anim=1)
                    for i in self.shape:
                        for box in i:
                            box[0] += int(round((0.5*self.dpos[0])/self.box_size,0))
                    for box in self.shape[self.orientation]:
                        self.mark(box, anim=1)
                    self.move = True
                    self.mLR = True
                self.dpos = (0, self.dpos[1])
            if -1*(self.dpos[1]) >= 1.05*self.box_size:
                for i in range(abs(int(round(self.dpos[1]/self.box_size,0)*1))):
                    self._fall()
                self.move = True
                self.dpos = (self.dpos[0], 0)
    
    def on_touch_up(self, touch):
        # Uživatel zvedl prst z obrazovky
        if touch.grab_current is self:
            g = self.simplegesture('', zip(touch.ud['line'].points[::2], touch.ud['line'].points[1::2]))
            g2 = self.gdb.find(g, minscore=0.80)
            if g2 and (self.mLR == False) and (self.blockRotation == False):
                if g2[1] == self.GSTR_DROP:
                    print "< GESTURE: Drop >"
                    for i in range(21-self.shape[self.orientation][-1][1]):
                        self._fall(animate=2)
                    self.mLR = False
            else:
                if (self.mLR == False) and (self.move == False) and (self.blockRotation == False):
                    if touch.x <= self.parent.size[0]/2.:
                        self.rotate(False)   #left
                    else:
                        self.rotate(True)  #right
                self.mLR = False
            if self.move == True:
                self.move = False
            touch.ungrab(self)
            
    def dropAnim(self, fall):
        # Animace padání bloku
        if fall:
            d = .1
        else:
            d= .2
        boxes = []
        for box in self.shape[self.orientation]:
            if ((box[0] >= 0) and (box[0] <= 11)) and ((box[1] >= 0) and (box[1] <= 21)):
                cur = self.get(box[0], box[1])
                a = Box()
                a.size = cur.size
                a.pos = cur.pos
                a.colored = cur.colored
                a.size_hint = (None, None)
                boxes.append(a)
                self.app.sOverlay.add_widget(a)
        if len(boxes) != 0:
            anims = [Animation(y=p.y-p.size[1], opacity=0., t='linear', d=d) for p in boxes]
            for i in range(len(boxes)):
                anims[i].start(boxes[i])
            Clock.schedule_once(self.clearAnimation, d)
    
    def fellAnim(self, widgets):
        # Animace po spadení bloku (změna barvy)
        color1 = widgets[0].colored
        color2 = [y+.3 for i, y in enumerate(color1) if i < 3] + [color1[-1],]
        anim = Animation(colored=color2, duration=.2) + Animation(colored=color1, duration=.2)
        for i in widgets:
            anim.start(i)
    
    def clearAnimation(self, dt):
        # Odstraní widgety vytvořené animací
        self.app.sOverlay.clear_widgets()
        print "< widgets cleared >"
    
    def rotate(self, direction):
        # Otáčení s blokem
        maximum = len(self.shape)
        now = deepcopy(self.orientation)
        if direction:   #left
            self.orientation -= 1
            if self.orientation < 0:
                self.orientation = maximum-1
        else:           #right
            self.orientation += 1
            if self.orientation > maximum-1:
                self.orientation = 0
        if now != self.orientation:
            for box in self.shape[now]:
                self.drop(box)
            coords = self.getMinMax(self.shape[self.orientation])
            if coords['y'][1] > 21:
                print "posunout nahoru o {0}".format(coords['y'][1] - 21)
            if coords['x'][0] < 0:
                print "posunout doprava o {0}".format(abs(coords['x'][0]))
                for s in self.shape:
                    for box in s:
                        box[0] += abs(coords['x'][0])
            if coords['x'][1] > 11:
                print "posunout doleva o {0}".format(coords['x'][1] - 11)
                for s in self.shape:
                    for box in s:
                        box[0] -= coords['x'][1] - 11
            if len(self.colored.intersection(set(tuple(y) for y in self.shape[self.orientation]))) != 0:
                self.orientation = now
            for box in self.shape[self.orientation]:
                self.mark(box)
        print self.orientation
    
    def tetris(self, anim):
        # Rozhoduje o tom, zda byl vyplněn řádek (voláno po spadení bloku)
        full = []
        for i in self.colored:
            full.append(i[1])
        lines = []
        for i in range(22):
            if full.count(i) == 12:
                lines.append(i)
        if len(lines) != 0:
            if self.app.onAndroid():
                self.app.vibrate(0.05)
            self.app.linesCleared += len(lines)
            if self.app.linesCleared % int(self.app.serverConf.linesLvl) == 0:
                self.app.lvl += int(self.app.serverConf.lvlInc)
            print "Lines cleared: "+str(self.app.linesCleared)
            print "Level: "+str(self.app.lvl)
            for i in range(len(lines)):
                for j in range(12):
                    self.colored.remove((j, lines[i]))
                    self.specials.discard((j, lines[i]))
                    box = self.get(j, lines[i]).sb
                    if box != False:
                        self.app.dock.addSpecial(box)
                    self.drop((j, lines[i]))
            lns = deepcopy(lines)
            lns.sort()
            print lns
            for num, ln in enumerate(lns):
                colored = list(self.colored)
                colored.sort(cmp=lambda x,y: cmp(x[1],y[1]))
                colored.reverse()
                for coord in colored:
                    if coord[1] < ln:
                        new = (coord[0], coord[1]+1)
                        box = self.get(coord[0], coord[1])
                        newColor = box.colored
                        sType = box.sb
                        self.drop(coord)
                        self.colored.discard(coord)
                        if sType != False:
                            self.specials.discard(coord)
                        box = self.get(new[0], new[1])
                        box.colored = newColor
                        self.colored.add(new)
                        if sType != False:
                            box.special(sType)
                            self.specials.add(new)
            if self.app.serverConf[-2] == '1':
                if len(lines) >= 2 and len(lines) <= 3:
                    self.app.send_message("sb 0 cs{0} {1}".format(len(lines)-1, self.app.id))
                    print "add id:"+str(self.app.id)
                elif len(lines) == 4:
                    print "Tetris!"
                    if self.app.serverConf[-2] == '1':
                        self.app.send_message("sb 0 cs{0} {1}".format(4, self.app.id))
                    print "add id:"+str(self.app.id)
            else:
                print "< tetris() >"
            if self.app.linesCleared % int(self.app.serverConf.linesSpecial) == 0:
                self.addSpecial()
        else:
            self.fellAnim(anim)
        self.fieldUpdate()
        
    def addSpecial(self):
        # Přidá novou speciální kostku do pole
        if len(self.colored) - len(self.specials) > 0:
            special = choice(list(self.colored.difference(self.specials)))
            self.specials.add(special)
            self.drop(special)
            box = self.get(special[0], special[1])
            sType = SPECIALS[int(self.app.serverConf.specialFreq[randint(0,99)])-1]
            box.special(sType)
            print sType
            print special
        else:
            for i in range(20):
                col = randint(0,11)
                empty = True
                for c in self.colored:
                    if c[0] == col:
                        empty = False
                        break
                if empty == True:
                    self.colored.add((col, 21))
                    self.specials.add((col, 21))
                    self.drop((col, 21))
                    box = self.get(col, 21)
                    sType = SPECIALS[int(self.app.serverConf.specialFreq[randint(0,99)])-1]
                    box.special(sType)
                    print sType
                    print (col, 21)
                    print "< Add special >"
                    break
    
    def addLine(self, update=True):
        # Přidání náhodného řádku do pole (speciální kostkou)
        garbage = [randint(0,7) for i in range(12)]
        garbage[randint(0,11)] = 0
        move = list(self.colored)
        move.sort(cmp=lambda x,y: cmp(x[1],y[1]))
        for coord in move:
            if coord[1] <= 21 and coord[1] >=1:
                new = (coord[0], coord[1]-1)
                box = self.get(coord[0], coord[1])
                newColor = box.colored
                sType = box.sb
                self.drop(coord)
                self.colored.remove(coord)
                if sType != False:
                    self.specials.discard(coord)
                box = self.get(new[0], new[1])
                box.colored = newColor
                self.colored.add(new)
                if sType != False:
                    box.special(sType)
                    self.specials.add(new)
        for i, cell in enumerate(garbage):
            box = self.get(i, 21)
            box.texture = False
            if cell > 0:
                box.colored = COLORS[cell]
                self.colored.add((i, 21))
            else:
                box.colored = self.inactive_color
                self.colored.discard((i, 21))
        if update:
            self.fieldUpdate()
        for i, b in enumerate(self.shape):
            drop = False
            if i == self.orientation:
                drop = True
            for box in self.shape[i]:
                box = [box[0], box[1]+1]
            if drop:
                for box in self.shape[i]:
                    self.drop(box)
                for box in self.shape[i]:
                    self.mark(box)

    def fieldUpdate(self, *args):
        # Vytvoření řetězce pro aktualizaci pole a odeslání aktualizace
        fupdate = ""
        for y in range(22):
            for x in range(12):
                s = set()
                s.add((x,y))
                if self.colored.issuperset(s):
                    box = self.get(x, y)
                    if box.sb == False:
                        fupdate += str(self.colors.index(box.colored))
                    else:
                        fupdate += box.sb
                else:
                    fupdate += '0'
        print fupdate
        d = []
        prev = False
        for i in range(len(self.fUpdate)):
            if self.fUpdate[i] != fupdate[i]:
                try:
                    color = int(fupdate[i])
                except:
                    color = self.tnetColors.index(chr(39)) + SPECIALS.index(fupdate[i])
                if prev == False:
                    d.append(self.tnetColors[color])
                    prev = fupdate[i]
                else:
                    if prev != fupdate[i]:
                        d.append(self.tnetColors[color])
                        prev = fupdate[i]
                d.append(self.tnetCoords2[i])
        self.fUpdate = fupdate
        dstr = "f "+str(self.app.id)+" "
        for i in d:
            dstr+=i
        self.app.send_message(dstr)
        self.app.print_message(dstr+"\xff")
    
    def clearLine(self):
        # Odstraní řádek od konce (speciální kostkou)
        for j in range(12):
            self.colored.discard((j, 21))
            self.specials.discard((j, 21))
            self.drop((j, 21))
        colored = list(self.colored)
        colored.sort(cmp=lambda x,y: cmp(x[1],y[1]))
        colored.reverse()
        print colored
        for coord in colored:
            if coord[1] < 21:
                new = (coord[0], coord[1]+1)
                box = self.get(coord[0], coord[1])
                newColor = box.colored
                sType = box.sb
                self.drop(coord)
                self.colored.remove(coord)
                if sType != False:
                    self.specials.discard(coord)
                box = self.get(new[0], new[1])
                box.colored = newColor
                self.colored.add(new)
                if sType != False:
                    box.special(sType)
                    self.specials.add(new)
        self.fieldUpdate()

    def nuke(self):
        # Vyprázdnění pole (speciální kostkou)
        for box in self.colored:
            self.drop(box)
        self.colored = set()
        self.specials = set()
        self.fieldUpdate()
    
    def randomClear(self):
        # Náhodné odstranění několika kostek (speciální kostkou)
        cells = []
        for i in range(10):
            cells.append((randint(0,11), randint(0,21)))
        for coord in cells:
            self.colored.discard(coord)
            self.specials.discard(coord)
            self.drop(coord)
        self.fieldUpdate()
    
    def clearSpecials(self):
        # Odstraní všechny speciální kostky (speciální kostkou)
        coords = list(self.specials)
        for coord in coords:
            self.specials.discard(coord)
            self.drop(coord)
            self.mark(coord, True)
        self.fieldUpdate()
    
    def quake(self):
        # Náhodně posune řádky o 3 doleva/doprava (speciální kostkou)
        colored = list(self.colored)
        colored.sort(cmp=lambda x,y: cmp(x[1],y[1]))
        cells = [[y[0], y[1]] for y in colored]
        prev = None
        rnd = 0
        for cell in cells:
            if prev != cell[1]:
                prev = cell[1]
                rnd = choice(range(-3,4))
            cell[0] += rnd
            if cell[0] > 11:
                cell[0] -= 11
            elif cell[0] < 0:
                cell[0] = 12+cell[0]
        print cells
        for i in range(len(colored)):
            new = (cells[i][0], cells[i][1])
            box = self.get(colored[i][0], colored[i][1])
            newColor = box.colored
            sType = box.sb
            self.drop(colored[i])
            self.colored.discard(colored[i])
            if sType != False:
                self.specials.discard(colored[i])
            box = self.get(new[0], new[1])
            box.colored = newColor
            self.colored.add(new)
            if sType != False:
                box.special(sType)
                self.specials.add(new)
        self.fieldUpdate()
    
    def switchField(self, pid):
        # Vymění si pole s protivníkem (speciální kostkou)
        for y in range(22):
            for x in range(12):
                sender = self.app.overlay.children[0].children[pid].matrix.coords[y][x]
                if type(sender) == type(None):
                    self.drop((x, y))
                    self.colored.discard((x, y))
                    self.specials.discard((x, y))
                else:
                    newColor = sender.colored
                    newStype = sender.sb
                    box = self.get(x, y)
                    box.colored = newColor
                    self.colored.add((x, y))
                    if sender.sb != False:
                        box.special(newStype)
                        self.specials.add((x, y))
        self.fieldUpdate()
    
    def gravity(self):
        # Spadení kostek, vyplnění mezer (speciální kostkou)
        colored = list(self.colored)
        colored.sort(cmp=lambda x,y: cmp(x[1],y[1]))
        colored.reverse()
        color = [colored, ]
        i = 0
        while True:
            color.append([])
            for b in color[i]:
                if b[1] < 21:
                    if (b[0], b[1]+1) not in color[i]:
                        color[i+1].append((b[0], b[1]+1))
                    else:
                        color[i+1].append(b)
                else:
                    color[i+1].append(b)
            if color[i] == color[i-1]:
                break
            i += 1
        color = color[-1]
        for j, b in enumerate(colored):
            if b != color[j]:
                old = self.get(b[0], b[1])
                new = self.get(color[j][0], color[j][1])
                new.colored = old.colored
                new.sb = old.sb
                new.texture = old.texture
                self.drop(b)
                self.colored.remove(b)
                self.colored.add(color[j])
                if new.sb != False:
                    self.specials.remove(b)
                    self.specials.add(color[j])
        self.fieldUpdate()
    
    def blockBomb(self):
        # Odstranění kostek blockbomb a vystřelení okolních do pole
        # (speciální kostkou)
        bombs = []
        colored_remove = []
        s = range(-1,2)
        s.reverse()
        for bomb in self.specials:
            box = self.get(bomb[0], bomb[1])
            if box.sb == 'o':
                bombs.append(bomb)
        for bomb in bombs:
            self.specials.remove(bomb)
            for i in range(-1,2):
                for j in s:
                    b = (bomb[0]+i, bomb[1]+j)
                    if b in self.colored:
                        colored_remove.append(b)
                        new = choice(list(self.COORDS_SET.difference(self.colored.union(set([tuple(a) for a in self.shape[self.orientation]])))))
                        self.colored.add(new)
                        new = self.get(new[0], new[1])
                        old = self.get(b[0], b[1])
                        new.colored = old.colored
        for bomb in bombs+colored_remove:
            self.colored.discard(bomb)
            self.drop(bomb)
        self.fieldUpdate()
Ejemplo n.º 20
0
from kivy.gesture import GestureDatabase

gdb = GestureDatabase()

cross = gdb.str_to_gesture(
    'eNq1l9tu3DYQhu/1It6bLjicE+cFtrcF/ACBYwv2Iqkt7G7a5u1DDqlT0lZ7I2Mxsj5JP2f4k'
    'xR1OH85//X9+Npfb98uffd7Ow6hO7wM0D0+vD/92T90Q8z/5gN218eH6+3y8aW/5lPqDl8H7g'
    '7/KvLot3WDFCnNzw8f5/dbeSyVx+w/Hvuj3NUNUDMoKXzPj0DsTuGIGiRJGCOVbP4pV7E7/Ra'
    'ORJZMwhS1u35++v9WyFvh7rU2ENEMJI1RuLu+NnEEgyhpjEG2xb1y0H3Ek4vbKA6kEmyKEWdx'
    'WPaJsaVN8eidH2Ef8ejiOIqHdbeQLvolaLTFLxlty7ulsVlaNBKChCnmEpp+uRSSIozRBLbl3'
    'dSoe8m7rdF2kkc3FmGSB1FVphYT6qSejY2sOsXtyYRuLOIkHgEtGrZIKJP4Spk13ZG524qzrX'
    'FWLlHmfok/9UvcFndTUe8Rz8OVA7RIYXtAoluKdke3hJU42j0dQ24pwV7ybiptm1oGE+Rz4il'
    'u9w25q8R3qQtnZ2WKd+TutpLeox4pZmt1jHlh3VR3X8nuUceFdIm4qc5uKy9mapCY339jXKb+'
    '08tjewlmN5VxH3H3lBcLcASZfzGv4osFPiVk5SnmCb6p766y7qbvvvL0Zg2GKtHGCDjPJ2FKi'
    'cfI2wuNuKsCu2i7qYLzdiP3BXGLYIs1DEAo0hh1eyaJeyq8i7b7KdM26ddNXpPO7SCSTnHbSn'
    'ErxXaQVndSJyeJGQOMMe+RJm1aLrk5bku7kYp7SLuPOvlI6/FHs4+87hH2Fats/p8vff8+beV'
    'Vyl5etTucMA/a7kSE+XAbNHVPmcGK2ZKBsxSciTPUyqAwUmdRKouFCToDqgwLU3MWQmVUmDnD'
    '1O7jwsCfOuXFt0JxGKNDaS1rhVwhV5gqpBW0CnEJLaw0G4QKwwrGmlJaQaxw1bp5QRBsBb2iZ'
    'MvczQtSWjGvx09m5uXwmnk1tNKDEGYbZli94TX0aqg1nRrE5Z3WoFdDtWyFBr0aqR2URljLqa'
    '1bbNDrsToywth69QfqGIrcaDVoPSoBqkNtbDE1Wi3iqsAtV6gesSdL0vKCalLNdqa5rjpB3vr'
    'z69utfJTmz8qTFclM/z6/3N4cSteSyvT28bW/PL0/935Ffdsd1n9Q7muT+dNw+Xj59lzFU+6W'
    'Y5L8ug5qwTR/PFH5bDz+AM/6Dqo=')

circle = gdb.str_to_gesture(
    'eNq1WNtyGzcMfd8fiV+iIS4EyB9QXzuTD+g4icbxpLU1ttI2f18QoHa5jpy12qlGAyUw9hA4B'
    'yQh3dx/vf/z++7u8Hz69nSYfumfxzTdfD7C9OHdw+0fh3fTEe2f9kHT84d3z6enx6+HZ/svTz'
    'e/H/N0cxHkg4dNR2lQas8fH+8fTu2x0h6rrzz2a4uajhAZtBS+2yOA0z7tCDMkqjk1y0W1pfN'
    '3+zNN+/dpl0pGqmdLJcv0/PH25+uwr5Onu74EMxErVLeGMT3fNXQDT4C1kopbLVBhG92LB91G'
    'h6RJinRb5A2ZF8euM/aP5JyxhVVShbBiJW9ho7OPcMZG1YTzWzTP2LgAm8XyBmx0bJqxsfSkm'
    '8UqMzaRluVduW5ju5o4qwkKmFWruM28cGLNcW3eriXOWi5kv8zbNK7GcwmbabtP0LXEWcuB7M'
    'Y3pSVxVuRMiGFJaBOcXEzqYrZtwglLEsluBdOSen7R5LiN7nISzehAwsQZwC3yfwJ3PSnP4FZ'
Ejemplo n.º 21
0
#!/usr/bin/env python
from kivy.gesture import GestureDatabase

gdb = GestureDatabase()

vertical = \
gdb.str_to_gesture('eNq1l8ty2jAUhvd6kbApI52rzgvQbWd4gA5JPIRJCh4gbfP2lY4dbGbasmDkBYafo0+Xz8JmsXvd/fxYbrvT+f3Yha/juY9h8dynsH7Yb350D6GH8racMJzWD6fz8fDancpHCou3nsPir5C1l4VeKkpL+/6w259rs1yb2T+afatVoU/DCOoQPkqTBGEVlyKJ1NhSRlEkq6P5Xb/FsPoSlzEJ5yQIwhglxajh9Lj5fzfk3XDYDj2wqESIFAdOAWwvcCCbjtL9bbhPPWkbeHa4NYGDrz6kTzhFQl9yMcyqTDN6jMCcPrtOyHgbD47HVniXCtwK71pBW+FdLFgjPLpavKgFBIvTrim9D/hKxzxuJQDihPk23MUitoG7VuQ2cJeK2gbuStGawMmF0kVoFBOCzJqGV7gL7kIJ28BdKHEbuAslbQN3oWRN4OxCeRRatznRnA5R7sK7UsZWeJfK3ArvWllb4V0s2wVfGvF0V2W8a6uKm5XUiO5iBRvR3atMXiHq/EesPEPdQ3etoo3oblUmq8CS6710vHfqXdeMulVNjehuVSerkI1ptjR3wV2qTlIxURwBlE3tBrz+G3g6dt3+8mxfJlse7lXDYoXKyxhWpFhO515z2Eyh8NLmB9UKGyrEKzh6sxyH0DxMY5g8zPXTCiUPIcxDGEOch3FsTrMQVIeQ56GMlTIPaWTqVThW5nmINIR2FcL1nLVUWLyqSN7M5tMDsPqgNx1YK+CqYhiXlbkOUl663fblXHSUdS0jrEte0l+75/NLDTmsxuh8eOuOm/1T/Y9nUkWnGo9Xy/f+eHh+f3KQFtDSMpGhScxUbnhl054el38AMsG4pA==')

ligne = \
gdb.str_to_gesture('eNq1l81y2jAURvd6kbApo/svvQDddoYH6NDEQ5ik4AHSNm9f6QIBd0rsjby4Tr5cHck+xDKzzcvm1/t83R2Ob/sufD2f+xhmTz2E5cN29bN7CD2WH8uJwmH5cDjudy/dofzKYfbaS5j9F7L0ttBrRVkZ3+8222MdluqwfGfYt9oVejitoC7hvQwBDIsvcR4jW0KO0VQgMZPWBf2pDeQNnMgoXwpDOPxYfT4P+zwS1p9Msb7QBRDypWBJR/F+9WDT8JA053OxWJY2ik+Ozzf4aGCkEYDNTAnhyqfhIaN4dAkF0QiPjqdpeASgdFMm8N0tSjO+y0Vrxne7mFvxyfXSRL0AlpJeywS++yVqxne/JM347pcm+i3/2VHlWhKOT+CCKTebgN0wQ7sJXDFTuwncMZ8dVwQRm6YoJIrJ0C4P0PK3bKIfRbKO090wWyO66+Xchi7uVmAKHTJE0Y9C4zuLuFihRnS3KtKI7lZlklVMLHItZacepbtVyW3o6lYVGtHdqk6yevsiVcr4bVeXqtIG7k7V2sBdqU5SypQj3pRRuLlRgzZwF2qThA7fjcuuMwp3oTZJqMQEFC8FHV6/Kzzuu2778eZfBpRXf7MwWyDpPIYFgczz7cHh2FsKq5GO7B3MdztS9A7B+x1w6sj3O9A7jE4dVk4lpBpSHIbsIeogFA+FB6F6aOdZ0ym0GnKEf9dw7fBbwiiDYX4XmO02zH7hrDQI/VrZeBD65XGKg5BOIQ7Ccnknoc/dZv18LCqzhAXW7f56lCdu6fi9eTo+1wYtDVxvSAmPu9duv9o+1u+S2fyxXuPz5+57v989vT06NlWsEQOqckbkrL4Zzv8CCbHPtw==')

lance = \
gdb.str_to_gesture('eNq1WMtyHDcMvM+PWJeoSDyJH1CuqfIHpBR7S1Y5kbYkOYn/PiDAnaG864wu2stKmGYT0w2AlK7uv97//f367vD88u3psPw6vo9lufp8rMvHDw+3fx0+LEfwH/0Ll+ePH55fnh6/Hp79V1qu/jzycnWR5GPAlqN0KvX1x8f7h5e+rPVl9pNlv3XUcqyZQU/huy+psNyUa+YiTaExAKKo9mz+7U9xufnFHxcytCbABMbMy/Mft/+/CcUmvNwlP5lVKs2QtKgVWZ7vBjUx4imM2mCfOl676kqNULFwo2pAaLZRI1LzlxFTNuKC+9QtqO0dqCFUh3qixrbxuq7KGzeQwlCjdFdonxyCHFdy3JiZEDfuSganpKtWk33ucBL4XbjDSlitBOvVhSAkhZrX0MpdpMpUP9j2ucNLWL0E9pza5Ocgd25ga2oKXBpbMd13E8NNXN0ErMVMWJAVW5OVuwK6KLVKw0a+yX7eGF4ivgd1WImrlVC7yiu76cZtUqwWYXekGPcne9xhJa5WVp2drBs1MGgnFahmWGG/SjCcxNXJStu4KMVtW7mxkpCqCAIWeEORUPhIq4+e6FTBjTa1UcXbnFBoaL7PHUbSaqQX1tzVGzUBNOParMQGb1CEwkhajSz6akyVrbap+a9M1qBVbfs2UthIq42FZhdLgSntAnCSmnyPfe7wkVYfS03aUYBKNBlpLVkj8zeQczjJw8k+MaBupeC5blUCqBhyiFHlVvePHA4rGd+HPMxk3sjltLoos8nUln5SjirpZcj7lcLhJ+tGPo06b3A/8dYxSCKnjvfmfEOFcxjK9i7kEobKZmgFYi1EoshoNJ+YBecO8HbeJQ9DZTO08tokXXqYyU01LkU5GfY1lzBUNkOrpZdSqlc5F5jOTJ9XGze/IfMwVDZDAVa9Xd766iJRax03tt7Db7hISDgqm6OgVCZl6kTeGo0x2Q9V2Z8tGo7q5ijYMDOH3ySL9z9Ot9H9JtIwVDdD/ZYy1ZtNVwlUP9qmG8w+d/ipm59oOg8+nS6zPhGhuGh52w3B+73+09Ph8LDe0n32+zXdL9lXN9Dkuiw3hOXa5g8tL0dty21HtECA+pcHLYKWy6BGsJUedNEiWPScq9VAYCzzN89lEEHmCDbLIEZQIYNjA4pgQOLZ+QbcEf7SgZDBJRGE5BLfZ/5IR2ggEAPBdgERKhCVHx+NxB1hicjXYIiglQy2C8sGIiTxnvvxZW6QMn2DRGgQUxpgmEG7sEwSEWKR5DtRJml8Cp4vw3M5LZU7l+wn8JRR0l7C3DKV05rBdNJSLE2xsJ1z+SmfEDtBSkRTrlZeR+EVnY5oaiTpO8KlTVIkyoxBLkFSMswdoQzuVKbWc2VqHZBQw8/KWFh4RFsWdlZoOdGFHlGbi7cVZbRmQ0WleAfqeVn6aA1IaO2QsXXNlkKKqMqIZk9By+gJm02V3QFySYLK2diSEBgLJaO5kNul7FKCognh19wakNSj5JszXIKkOCXfkewCBFKpUhMilyA1R1bmMvqhAmQ0t+8yzh8MCCZkbD/eHuhVtFza0WXLyfvlcH/35SX+zeEV4sfMj2jH/HP/+eVLQNQhUQIefXn88/B0+/DpEE9aXL96fJwRvx+fHj9/+5TU5lP3uvVrg/iRKNr/evLRf/0fgMqGqw==')
Ejemplo n.º 22
0
class DrawingSpace(StencilView):
    def __init__(self, *args, **kwargs):
        super(DrawingSpace, self).__init__()
        self.gdb = GestureDatabase()
        self.line45 = self.gdb.str_to_gesture(line45_str)
        self.circle = self.gdb.str_to_gesture(circle_str)
        self.cross = self.gdb.str_to_gesture(cross_str)
        self.line135 = self.line45.rotate(90)
        self.line225 = self.line45.rotate(180)
        self.line315 = self.line45.rotate(270)
        self.gdb.add_gesture(self.line45)
        self.gdb.add_gesture(self.line135)
        self.gdb.add_gesture(self.line225)
        self.gdb.add_gesture(self.line315)
        self.gdb.add_gesture(self.circle)
        self.gdb.add_gesture(self.cross)

    def activate(self):
        self.bind(on_touch_down=self.down, on_touch_move=self.move, on_touch_up=self.up)

    def deactivate(self):
        self.unbind(on_touch_down=self.down, on_touch_move=self.move, on_touch_up=self.up)

    def down(self, ds, touch):
        if self.collide_point(*touch.pos):
            self.points = [touch.pos]
            self.ix = self.fx = touch.x
            self.iy = self.fy = touch.y
        return True

    def move(self, ds, touch):
        if self.collide_point(*touch.pos):
            self.points += [touch.pos]
            self.min_and_max(touch.x, touch.y)
        return True

    def up(self, ds, touch):
        if self.collide_point(*touch.pos):
            self.points += [touch.pos]
            self.min_and_max(touch.x, touch.y)
            gesture = self.gesturize()
            recognized = self.gdb.find(gesture, minscore=0.50)
            if recognized:
                self.discriminate(recognized)
        return True

    def gesturize(self):
        gesture = Gesture()
        gesture.add_stroke(self.points)
        gesture.normalize()
        return gesture

    def min_and_max(self, x, y):
        self.ix = min(self.ix, x)
        self.iy = min(self.iy, y)
        self.fx = max(self.fx, x)
        self.fy = max(self.fy, y)

    def discriminate(self, recognized):
        if recognized[1] == self.cross:
            self.add_stickman()
        if recognized[1] == self.circle:
            self.add_circle()
        if recognized[1] == self.line45:
            self.add_line(self.ix, self.iy, self.fx, self.fy)
        if recognized[1] == self.line135:
            self.add_line(self.ix, self.fy, self.fx, self.iy)
        if recognized[1] == self.line225:
            self.add_line(self.fx, self.fy, self.ix, self.iy)
        if recognized[1] == self.line315:
            self.add_line(self.fx, self.iy, self.ix, self.fy)

    def add_circle(self):
        cx = (self.ix + self.fx) / 2.0
        cy = (self.iy + self.fy) / 2.0
        self.tool_box.tool_circle.widgetize(self, cx, cy, self.fx, self.fy)

    def add_line(self, ix, iy, fx, fy):
        self.tool_box.tool_line.widgetize(self, ix, iy, fx, fy)

    def add_stickman(self):
        cx = (self.ix + self.fx) / 2.0
        cy = (self.iy + self.fy) / 2.0
        self.tool_box.tool_stickman.draw(self, cx, cy)

    def on_children(self, instance, value):
        self.status_bar.counter = len(self.children)
Ejemplo n.º 23
0
gesture_strings = {
    'left_to_right_line': 'eNq1WMtSI0cQvM+PwMVE17vrB9irI/gABwYFELsGBWht79+7p0qPHoE044NExAhyslPVmdU9La5fvr/8/evmafWx+fm+Gr5t39dluH5cw3B39Xr/1+pqWGP7tb3R8HF39bF5f/u++mh/8nD9Yy3D9Zcid0Eb1jpKWRu/fnt53YzD6jjMTwz7fWQNa8gKxhJ+tSGAw+1v5aZocUexWtkNodpYz7/jfYr7Sk6ExZWNXajd/vP+/MdwfIwMT6c/4WknXqComhcSlMILxGPqYEvERUphpdpQR3KeF68h7ovEkYUUrEIxLVpnxTHcR1gizrXuqm7ew7w2hjYdtEWqF6FaiMgFVDpxNHHjgnnVeV8wEkW5lHxkil2mUnauWLNWKx/kqf7PdsQIFbtQuUhlBsmrQidOlQC07q7ztVOkSnAh9ciVulxJuCIZm9ZSvQnv1bEaOmAtwJWR5puGIlWSy4hHptRlimjdj7h26lgPK2nBUqKIlPwi4hyJcpcooLQpOxRnhdbUnTio9dvjEvmIlOlS8hEqd6EWYwSQglbRqXCXKiDkKkqDfD5Wjli5i7VwtTYFz+ukaYqJiEpVtNL6B+b7nSNY9gvJS0Qr22hHdcn9yzQyEO/U0Q+PjsZa4L1EtEJ7+X3dcbVugy+lybaP39aPbeueVY9kRQ7q4yLdb8JsuJUfa4eudHCXefUIVmyvjkX50DtOclBnZyYGii3Bqs6LR6ziB/FDv6u2ZckH8XpwpVT1+f1dI1SFBeIAtXt0KMybrhGp0hJxnmzvNu+5RqIqS8Qra79U53tdI1C1BeIIBcTUt7HygsojUF0SKHad2Lznec8tAjVY0Oho00af1448bXaJtof1ZGtckKZFmiYLpAm1O/WGI+N3gIf31ep1f6I3HY/0bdj1LRDclOGWRG68f/GwWVsd7kcGnmZ4Mvwko5ZgsJ5mQDDarZMMDIae0aBg2BkGB8PLaYaMjLbXJ6O2twZqgJgT1JKgBcgN7F80MjgZ4RzqdpgmGGahp50G09HaGB5mEeQ0TGKYhz9EWZfZF8PCnxZ4MrJyD0tIKcAKCYYLZOlCxQQlwZogf7bGw4XxVjByOh4u0NbRagnWBGUCeoLpRq2fZwAlZs4FzlBgRzmq7xQfk09nJCkpcobCSbEzlPCv7W5J8Zhz++4ZKJYpaonWKRquMR0peKJTLqRTzMeVdJR0in06MP0QnqJpgRxxc9ateT57vaPkrPWoupy1wRTNWRudqTktsKPq0gKTCYppwXa1f5kJwo6yrFkwzallKT9tq7Xvc8C0za1fJ+0MPqKy67Iv1hdg2CaAZyiWFNtRUjtsk12X7VBPFCYolURxikKiNEWbH/noeF69PD1v4n824wb3KcJG+eflcfMcjNGv2N8aunn7sXq/f31YxR2Jo8aIbx9xf6zf3x5/PqTy2AntINKeiuztyAraHvXjOeTmPyTQtjs=',
    'right_to_left_line': 'eNq1WMty4zYQvPNHrMuqMC8M8APea6r8ASnHZtmq3dgqWZtk/z6DASWStijwIl5kjhqNQfcAGHmz+7H75/f2pf84/jr03ffhcx+6zfMeuoe7t8e/+7tuj/anfVD38XD3cTy8/+g/7JW7zc+9dJuLJA8O6/axUKmN37/v3o5lWCrD8sKwPwqq20PNoKTw24YAdvffwjZA5BgwJ2UEUkUuCf1XANTdh23ElCkk0AghRMv2r8frs7DPIt3LlQleKrdkyQCZc0wixNom95WDriKfZy5t8uTkeRU5FM7zBNgkRxcfYQ05qw7hRJE1t8nRyWkVOQcUEEVCDczQ1gXdUVzlKOVZ7im22d1S1Buxu6c49RSUiYaiQCEY2XlSi5LbnpJ7SnAbcveUJp6GTImTuxaQo+iZHDPEyaPcZndPaeJp0ICRSr2ZxDHlUXWksRZd/ja7e0p6I3b3lAZPeZuBBDEA2n40ZfpvQc7skM5ulL2a20cMu6kMN2J3V3lwtQjDGiNArJOksWBswvMmtR1L7Yph95Rl5M6cSlacGG0f4Zh4mDDbWSDtQ4DdUtbbkLujnM/kwBisZlJ0YVRGWUJ5G4WxHdFkF3dU4Ebs7qiMjkIUSRIzJKRs5xgN7H4+KGaRQbQo7fNL3FORVewRIdRvUs7Ull3cU9FV5Dl7zsMCsF3q4qZKvg17dFMjrGEHwsHrso9lxW0d3dS4ylSIg+Dq6q9hd1PjKlPt0oAJf0xtdnc1arPcjR35dLpJ+b5dMtFNjRNTIVkPkVKQQDCjFp2J3qRWd1RHR4OCXXNDRWcuwp7Jp9SauL1N1R3VycGLHKxxG7LMdmWd2WluaWg3veqOqrQvjULPw/6v1e6il98AT4e+fzt39BpLS6/abe4NuA3dPbF9TJ/YHfeauseCgGVEdkTURUQKFUHLCHCEpGUEVsQVDnIE8zKCHUGyjBBH4LIe1hMWRLiSqRaEtWDLCNdU9EqmrqlIqAja5unDhsiuqWCuiLIkC7qMEuQz3hCxIlxGu1nrsFyDrpx1jR4UqEEXiyl+zs4QVBEuFkM1XoYUXB/K6RT8mrnrQ5qXEa4PDfVyEeH61PwvI6xpcgjxFYjLRUhXIK4XAV6BuHoUaCoDBJcPc6xR/uoxBKkQuAJxNe00qhAcuLVGeR5NNYrzaK7RMItCmEVhiLoeqHkexRpN8yjVKJ8K6aswUCU4HR0XIVWCmKblaN1qjco8WlcdYR6tq5ZPDHXVpulsTp1AsEogOBuIVYLTxjtFqwTldfrQFELLkHTBWazi8JD3RYiJU4/u13738nr0/6nY/oP5cZDKz9SHu393z8dXh9gqGYsvFj2+/+wPj29PvX+TvPEv8eGa+XN/eH/+9VSpsyVivQyj1YUSkV1f3uRt/wdC4ZmI',
    'bottom_to_top_line': 'eNq1mN1u40YMhe/1IslNDf4OyRfw3hbIAxRpYiTBbhMj9rbdty81I0t2YtWLFewbO6PDbyieEWeU25evL3//WD1tdvvv75vuy/C9he72cYvd3c3r/V+bm25L+TO/uNvd3ez2729fN7v8U7rbb1vtbs9C7qqs25YeZRm/fXt53fdh3ofFTNjvvarbYsugT+FHhiB1699gVRAIUQGYQUrUdP7tL3O3hhWwADuzCIuHWXS7P+//fxaps2j3NEygBu5a1AqzC2C3e/pldr1xtIlNbgpOBY2xaCxhe2XHyBZVQ0N0BoswXsCmWnnCq7Cpsnlkc/GShS6lEBUQXASvZpJeB17dJLsOvNpJk52UK4TJxYsomPrEzkEC1hJQHMxML8K5+sl4HXg1lPk68GooT4YSnK7Eo5oTORBbsHlKwn+CXh1luxK9WsqTpcgqQRxBef/GoRM9O1opQsJEyo5OF+lSPRW8Er2aKnwlenVVJlfBrWdGtnZHCJeJDrmYQtQh233+LnKZXl2VyVXQPtJIQSK7u8pR8od9hEph9fTXLvOrrzL5ClkWL+ZIFJypHvD9JSAxVwwJy26RD8XldaPVWZ2cBYgsUIA4ZTxmWzme4HRP6ZfsJX71Vgdv+/SPFraZl+P8040smKt5OKHQT+CruaojPstK5qSa9SHLLrqIXs1VG+nZXANMsrhJQj+hs6GI5ebFnk06K3qRXq3VONCx7dMebf8jX0Qv1diCI12P9gjVXLGL6NXWMtqKeYABZeXSDkwLc6+ultHV3PFyyaO2viBL6dXVMrpKalYy79wiIk2lZa6W6moZXSXPQMnnKR+XwHzyF9Gtumqjq6f9ajwr/SK8mmqjqcyRlTfAwGKES1OvptpoKhcs2cmQgLLjIF1ckP2rwMP7ZvM6Huyt9Cd7s+52LRh9f50+pVuj4Aq6/da8u59TSFPErEJlFccfS7nDrNygAh1nFVGaguYUWfMzU3KTWwavs/1+jEqFNIV+Brq2KbUpPgWvGeJ0SunlpcrB+yn5Y1JVYU1Rk8oXmDOKVnrQj5fWLHxGHgd5D9RmX8DJYLuXaAUGaYPeBul4MIv0aYJoZQRuimhhcjxoZ24jWuUAP9+GNzujzCqCm8LmFALw2c7weXk5I49ZObb5EWBWQjhIcFbCMEhoXhKDhGcleqDIrKQccpmtudiBUuYlh1zmq+4ySOYr7TZI5qsbQ7o4X90YKJjVbX3sefPy9Lzv/5HQ98J8SUlBDv/z8rh/rqPct5ITlxGll+zfvm3e718fNlUmde/tx4ee+8f2/e3x+0NDaz76K8++nbOA5w4RUU+0q/8AAJ5q8g=='
}

from kivy.uix.boxlayout import BoxLayout
# BEGIN GESTURE_DB
from kivy.gesture import GestureDatabase

gestures = GestureDatabase()
for name, gesture_string in gesture_strings.items():
    gesture = gestures.str_to_gesture(gesture_string)
    gesture.name = name
    gestures.add_gesture(gesture)
# END GESTURE_DB


# BEGIN GESTUREBOX
class GestureBox(BoxLayout):
    def on_touch_down(self, touch):
        touch.ud['gesture_path'] = [(touch.x, touch.y)]
        super(GestureBox, self).on_touch_down(touch)

    def on_touch_move(self, touch):
        touch.ud['gesture_path'].append((touch.x, touch.y))
        super(GestureBox, self).on_touch_move(touch)

    def on_touch_up(self, touch):
        print(touch.ud['gesture_path'])
        super(GestureBox, self).on_touch_up(touch)
Ejemplo n.º 24
0
#!/usr/bin/env python
from kivy.gesture import GestureDatabase

gdb = GestureDatabase()

gestures = {
    'a': gdb.str_to_gesture('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'),
    'e': gdb.str_to_gesture('eNq1WN1OKzcQvt8XgZsiz5/HfgF6W4kHqChEgM4pRJDT9rx9xzPOrkOWLlIFF1ky+fx5PN/8OLl8+vb018+rh93b4cfrbvq1P/dpurzfw3Rz8Xz75+5i2qP9aw+a3m4u3g6vL992b/aWp8vve5kuV0luHDbtc6NSW79/eXo+tGWlLasfLPutoaY9hAfNhZ+2BHC6/iVdSVJgLNJfpbnzT/uY4mNGJqiKWiqA5Ontj9v/3oV9F5ke+gZcU4FMmIVSBmSd3h46OVOmVAWpxOs2uZ8cdCEXHtkHbgKtjKC5aFIuuM1dnLvO3OaV+YvMpWqVKrSQQwVu0eCMUiTRJjl67BG+hhydnBZybpxQKCtxrnXgFs5zSGrF7ZCj64mLnpgXt6Fw4oXdpMDO7DnD2+wuKC6CAg25ghaCzm7kqUgpTELKwDVn2GZ3SbF+DTu5prRomk4iQyXLQk8KUkumyiJaSLbZXVTqohoDNimpqIpAsrzWhVypBC8SYCXdJndRSWbyMnBjGsJS7RxLVLRuU7uipEdqKEu8LTalzNwmRuq8LTSynejkelI9cmOZXW5tgGnhzpRrYs3gr7pd/uxqMhy5CccSIv0/1C4lz1LyaXkOXisUWULyiabFLiTPQnIeejkwL9SY65whKGm7NNmFZN2kTmxd/aiiJfhnuF1InoUkHZix0NhTJOvSxatl0ya7uJQySDlOOJshQ8MyZZeOJduVI66lzFqiRO4d28rgOaSqfWq2Vq7bHUVcTZnVhHdhKQM5WH9JwjHivMdvkbueokvNjxOo1HECvZudnwi5CypLp7XGUYcsL4PrKZfaRxsnIN7O8uyCZvgidpc0L+MTTlotppH99MaSt+dndk3zMj+hjtzWcOY6Qq5DGQltN8TsmuZlfOJJxhjd0MkTIqTjjPvEbM6uaR4vRKthsV2tu2iyyCdU22M7F9UFVfgKaldTabgijtdPzDO1vZe5jUPdjra6lLpIKQDjxF+8ptMZgc7d7vl3r7vd83xr19yu7arT5bWd8ipN13Z0exz2WqZbM2oKY7X7yfBHDVEdUckRgOeIkhqCkgQiO3EBNyK6EdNVHf+0IdAREsRUYxm5MccyzivL2BHdY8EVhDiiBCLHQUtuRqvUUzxP5ngKhAaiOXJtt/owenwYihupc3lILLXd6Ac47KtHgck9J9XTOOWG8JAwp/cf2aadAz9EQEdQIHwXK78w8mj0hxkljBBGDmNEgfL5BiyBiCgQx7JujChQOgsec145aI8Preyi7ykO9n0xDUH+AAJHcT7lgdV24D0HuOtm10DPjJrDKt0aGVXCaqqubB8ppeEhwNqOOSBeXpyO3BpWT3JrtmsLS0AicUrqC+to1SgqgCg1dVEpywodwAgR7AtxtHZZbbafWPvW0OMRPvdGYbeLiF1gE65t3WtMzkTCsnZyiFzrPSLTSuAhMg9rVDt3XyLB5LyYkfS8IdiXxcAHC+EaJBJM5divztqctWCHlHK+a8prlFGrvXMmWqOMyj3Pi4/wJkJ0+Mfd08PjwX9eaWh+l7XQfl75++n+8OgQbWc6a0kGObx8373ePt/tHFb8MtjsfTD9vn99uf9xF/tUy+sru2PWwjaGqiabozZvrv4FaZqffg=='),
    'i': gdb.str_to_gesture('eNq1l9tu4zYQhu/1IvFNjTny8ALubYE8QOEmRmLsNhFsb3f37TscypIYuyujgX3j+NfwIzk/Z6is9l/2//xcv+yOp2+HXff78N1Dt3rusXt8eNv+vXvoerI/7Yu74+PD8XR4/7I72k/pVl977VZXIY8e1vWhoKKN79/3b6cyLJVh+T+G/VGiuh7rCsoSftoQpG4D6yCgIoQxpAhRy2J+lIfcbX6DNaEkypkxR4opM3XHv7a/nkR8Eu1eKl9ZYyJGyqQYwQAvZzYJK0dByUFzSsto3zbGe6CTo/MZLeEjYEJnRA0SSJMCa1hkk6ed8MxmUYaAtkZJOeYoM7hWG2rSiXQZTg7n+8DdS9L7wN1NGt2k3BAgzOBhmFEzJo7LaHeTRjcJIiGkNHga/z+Z3UsevUQMkSVkTjGqQvoM2p1kvgfafeTRR0sFBqYwuJnkE2h3kUcXQQFCAhoSLvwJG9lt5MFGA5RyOxeeALQHkFPgLFpbAsPyART3UnDEW8at1ifKDI7NrnS5oYi7KXwfuPspOsHD2MFL+ZQ2fqZjGhOGHCDdkBe3VOJIJ5pq3qwLM0tRBm69QzIv091Uyfehq3uqk6fUZmYOhw8X3xLaHdXJUUpTCdnyZ2iIw31ZbwprF4twd1QnR7k9LjA76YC1gGp7EMTlS1ndUp0stbwKjE1Aw/nAGF3GHuybWL7f1B3VPIOX63g802Fip+ZBXF54cD/D5CfrWON27UuaFo6p3dINcHc08H3g7mjQG+CkjdfLaHczxHug3cuQb0AzTyfcOgwvV1B0M+PczPF+QyDAiR2n29rewJbrPrqVkZfRQlOrtQlueFGJ7mTUG9g6lmV5XMjl3f7psNu9jW/qVlH2qm5PVxtOuoZuY1fZGuaf0J36mLrtGME52ZeJuYpSRV3n+UcsIkETwT4sYSNCFamK7GKsEyRuRLoygdQI8ogwTKAuxuAiD6xQxboDGsQ4FzFfbjyleQTkOizPREr5cl0Zmgi5BGecR/haTRyyAC5qujJsSInvjQTaqWOJqCnJ6BGMFewpcWtNxHhlWKgRuUZUV7LnR1A/LmRjb8StxiXckyXki8Nck5U9WSIXp8oi5JJhF2GNT1fiq78InjsJqc4Dg+rJk3quJtUTpnXnkypVHQg4qJ4lJWjVUFVt1VjVkXCRUStqD2H6RUhuQob9IVSVWxUb9VrurCVsa5m/7vYvr6fyr3NpBu5nm02L+b5/Pr16iBiwnLaint6/7g7bt6edP1G/b4o+tKM/+8P787enijZTtLx5WAez6ikvBlK64/pf0KAwEA=='),
    'o': gdb.str_to_gesture('eNq1WNtuHDcMfd8fiV9qiBeR0g+4rwXyAYWTLBwjqb2wN23z99WQnJEmnvXsSz0ANzmmzlA8JKX1zeO3x79/3j4cX88/Xo6H3+PzlA43X05w+Pjh6f6v44fDCds/2wcdXj9+eD2/PH87vrb/8uHm+ykfbjZJPprb4SQTlbb1p+fHp/O0rEzL6oVlf0xehxN4BFMIP9sSwMNdukXKWoRnyxbOv9Ov6XD3W7pNqAy6WOLD66f791/D9pp8eIg3JIDMHDZJY3gIckCphQe7T25bB53JARJyJrepFujkmLgm6Zb2yYuR15k85YJVMayWPJAzFdFud7nRko/g3FNiCQWghCXGkb0oZO1W9+nR6GmhB6jjk7GzEyhL6nZfUjRJMS/smLIqprCCOrATq8piyxXspinqwt6EFCngtkk7kCNoqd1eQW6aYu3kK4KaZUj7uhp1P+1kqlJXlalmKui21fxQ61WQy2Kb/y65aUpdU844PDTkJWlOJN3CPrlJSl1STqOmsJTjNAJWD9EVoZukNEoK4yML+di/zeYrcm6KUlcUV9SpdG5eP/vVwqYndz1hNZ544M5F26ZmW/anC5ucTPsTwLYkWha7P17Y5OQuZ0pIqZTZapom+8KeU9LF7hcLm5y8TN1UcXxwYK5E0u0VgZuavMxc0AwlUViWXimYhLguNu9SZxMzw3IQ8eon9bCBULMstlzBbWJm2ude9hI2yT65iZmvOUETsxIN9gp2EzP3IxRpeMZRPtRPs21i7nObmrmfoLQiT3UkJ6nc7S63mJwynKDrkdoCHNhTa3dabLve7Fe5mKZyVYOmkoG02/1CFxNVhg5d7V+5DkOxrKom7w9cMVGld+h6gIB2coJS2xAPu6+pmKZSd5t/3QIs++NWTVKF/4PaxNSlQWF1zVVdqDOtnv3WVxNSe3fy0J7t4F+YhSo2VWdrMU93/c8vx+PTcnNvyrSrewvo5o6w3qbDHSO3j/Op1fP9W7A6WEawJAfBQXQQDAQ1EMptHX948kD3oMseZB5J3EOcmCcQq4cA8bbsoHum6qA46C+YWMYfmTzUPIpxteT5suIgO5g24qruYcQ0rf6VuFpKUKt7kBFXcNCJFd8SV0tJO+vNQ2DDg9wjmwerE3tKBB3EjXg8P5LMgzxp1fOTffeYN5bpyiOWlREET1qtK9ALA1Ia0URv99OGg0dmxeOqTigOO3JZJzQ2b3Su2oT67pUcxUB9x2oV4UJMqAy6+C8nNMrAatWzP6G+z5ocnd/mG63saDBAGoqyo94DKRhyoFH3v6Be61DWKA+t1VHbWztyfRcpUNsbcaAaqDrqeytzZN7c2QstzQze3RJyb1Q+oPe6eqmhbLn4rqP22Wsf0HcdXbVV2u0m4C5e27MM6CmwyNtHhIp5ROtmqLJyCf1QB5TTHF0ZXs1Jt+g8OSXGVcRBng+ruoZuVThFPi5Pwnbpcxd5x8WTY2IvkxfIkyO+EENd8uQIrVEZNO+o5yMHQ1QNRX2kNeopYF4xsKeAgpfejpH27cdd5B0XTwHFIQLBTUOld5THo2kzXewpwDweHcAynlRxdgB7CjCtlOUyNORUEo7W8VjbOlPa9xp3iVqKmDMM6FKNGVcob9HFYIjjKGLOPKJbRxDkvHLhjSxlGV9f5lB1RHUrvTmS4701lfbb10emfAxojC6Ju4IfnQobCwUG6WiebuKZQlmjY33QPHfFk0MxSPLWS2KE+qiTaCeJEerTTWI4SLQIXB5dEv2S33FZDVeJXGsahkNHPQUF1qinwO8zS3RqKfA7TwzmCbUUsFcvzQed2q45dr05NdVSwJnn6t1wUXepl3vAL4+scHks+lWSY57iVnn6xZL9XL7gAu7ypkibf/TYdM/0u+/X4+PD1/P01+V2s7wDy2CD/3n8cv5qaFvWvmv+StVczs/fjy/3T5+P5pbtSj/hcUf/8/Ty/OXHZ6eWltrbXBlrbt8iJCfU6Wvtp9v/AFOnskU='),
    'u': gdb.str_to_gesture('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'),
}
Ejemplo n.º 25
0
import json

from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import Screen, ScreenManager, FadeTransition
from kivy.gesture import GestureDatabase, Gesture

from gallery.stage import StageLayout
from gallery.overview import OverviewScrollView

gesture_db = GestureDatabase()
gesture_string = json.load(open('gallery/gesture_string.json', 'rb'))
for name, gs in gesture_string.items():
    gesture = gesture_db.str_to_gesture(gs)
    gesture.name = name
    gesture_db.add_gesture(gesture)


class MyScreen(Screen):
    content = ObjectProperty()

    def __init__(self, name, content):
        super(MyScreen, self).__init__(name=name)
        self.content.add_widget(content)


class MyScreenManager(ScreenManager):
    transition = FadeTransition()

    def __init__(self):
        super(MyScreenManager, self).__init__()
        # self.overview_screen = MyScreen('overview')
Ejemplo n.º 26
0
from kivy.gesture import GestureDatabase

gdb = GestureDatabase()

check = gdb.str_to_gesture(
    b'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'
)
Ejemplo n.º 27
0
class DrawingCanvas(StencilView):

    def __init__(self, *args, **kwargs):
        super(DrawingCanvas, self).__init__()
        self.gdb = GestureDatabase()
        self.line45 = self.gdb.str_to_gesture(line45_str)
        self.circle = self.gdb.str_to_gesture(circle_str)
        self.cross = self.gdb.str_to_gesture(cross_str)
        self.line135 = self.line45.rotate(90)
        self.line225 = self.line45.rotate(180)
        self.line315 = self.line45.rotate(270)
        self.gdb.add_gesture(self.line45)
        self.gdb.add_gesture(self.line135)
        self.gdb.add_gesture(self.line225)
        self.gdb.add_gesture(self.line315)
        self.gdb.add_gesture(self.circle)
        self.gdb.add_gesture(self.cross)
        self.links = []
    def addLink(self,link):
        self.links.append(link)
    def removeLink(self,link):
        self.remove_widget(link.widgetLink)
        self.links.remove(link) 
    def getLink(self,element1, element2):
        for child in self.links:
            if ( child.element1 == element1 and child.element2 == element2 ) or ( child.element1 == element2 and child.element2 == element1 ):
                return child
        return None
    def getLinksForOneElement(self,element):
        tempLinks = []
        for child in self.links:
            if ( child.element1 == element or child.element2 == element ):
                tempLinks.append(child)
        return tempLinks            
    def activate(self):
        self.bind(on_touch_down=self.down,
                  on_touch_move=self.move,
                  on_touch_up=self.up)

    def deactivate(self):
        self.unbind(on_touch_down=self.down,
                  on_touch_move=self.move,
                  on_touch_up=self.up)

    def down(self, ds, touch):
        if self.collide_point(*touch.pos):
            self.points = [touch.pos]
            self.ix = self.fx = touch.x
            self.iy = self.fy = touch.y
        return True

    def move(self, ds, touch):
        if self.collide_point(*touch.pos):
            self.points += [touch.pos]
            self.min_and_max(touch.x, touch.y)
        return True

    def up(self, ds, touch):
        if self.collide_point(*touch.pos):
            self.points += [touch.pos]
            self.min_and_max(touch.x, touch.y)
            gesture = self.gesturize()
            recognized = self.gdb.find(gesture, minscore=0.50)
            if recognized:
                self.discriminate(recognized)
        return True

    def gesturize(self):
        gesture = Gesture()
        gesture.add_stroke(self.points)
        gesture.normalize()
        return gesture

    def min_and_max(self, x, y):
        self.ix = min(self.ix, x)
        self.iy = min(self.iy, y)
        self.fx = max(self.fx, x)
        self.fy = max(self.fy, y)

    def discriminate(self, recognized):
        if recognized[1] == self.cross: 
            self.add_stickman()
        if recognized[1] == self.circle: 
            self.add_circle()
        if recognized[1] == self.line45:
            self.add_line(self.ix,self.iy,self.fx,self.fy)
        if recognized[1] == self.line135:
            self.add_line(self.ix,self.fy,self.fx,self.iy)
        if recognized[1] == self.line225:
            self.add_line(self.fx,self.fy,self.ix,self.iy)
        if recognized[1] == self.line315:
            self.add_line(self.fx,self.iy,self.ix,self.fy)

    def add_circle(self):
        cx = (self.ix + self.fx)/2.0
        cy = (self.iy + self.fy)/2.0
        self.tool_box.tool_circle.widgetize(self, cx, cy, self.fx, self.fy)

    def add_line(self,ix,iy,fx,fy):
        self.tool_box.tool_line.widgetize(self,ix,iy,fx,fy)

    def add_stickman(self):
        cx = (self.ix + self.fx)/2.0
        cy = (self.iy + self.fy)/2.0
        self.tool_box.tool_stickman.draw(self,cx,cy)
        

    def on_children(self, instance, value):
        self.status_bar.counter = len(self.children)
        
    def repaintAllLinks(self,element1,povezaniElementi):
        for child in povezaniElementi:
            self.tool_box.tool_line.widgetizeLink(self,element1,child)
                
    def paint_links(self,element1,element2):
        self.tool_box.tool_line.widgetizeLink(self,element1,element2)
        element1.addLinkElement(element2)
        element2.addLinkElement(element1)
        

    def export_to_png(self, filename, *args):
        if self.parent is not None:
            canvas_parent_index = self.parent.canvas.indexof(self.canvas)
            self.parent.canvas.remove(self.canvas)
        fbo = Fbo(size=self.size, with_stencilbuffer=True)
        with fbo:
            ClearColor(0, 0, 0, 1)
            ClearBuffers()
            Scale(1, -1, 1)
            Translate(-self.x, -self.y - self.height, 0)
        fbo.add(self.canvas)
        fbo.draw()
        fbo.texture.save(filename, flipped=False)
        fbo.remove(self.canvas)
        if self.parent is not None:
            self.parent.canvas.insert(canvas_parent_index, self.canvas)
        return True
Ejemplo n.º 28
0
from kivy.app import App

from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.graphics import Color, Ellipse, Line
from kivy.gesture import Gesture, GestureDatabase

gdb = GestureDatabase()

check =\ gdb.str_to_gesture('eNq1l0tuI0cMhvd9EXsTofgmL6BsA/gAgcYWb\GMmtmBpksztwyY1kgZI0rNpbdr+u+pjkX+9+v718+uf3zbP++Pp68d++v\X8PIzp/ukA08Pd2+6P/d10wPwzHzQdH+6Op4/3z/tj/svT/ZeDTPf/Cnm\oZtNBZ5Rl/8P769tp7uZzt/iPbr/NraYD9AjmIXzLLoDTdmxgBLsSMMIw\5OHzcP6eX9O0/WVsCMFGmCuaGgjBdPy0+/8wXGFkeu4Ig7LzgISbMw/j6\fh8hmMMBDIkdBYPimV4pQ7W8EQMUA4LMhMzCyW5watKgJoOHhxsuIz3ws\cVb8ExhpIxDoIgvcEzhoaiZ1geA20Rj+UAwlp4LDxd8OkqO4KHYXLI4oY\OwEai4oPRmHiZXr6iXOiY9mXBFUNYacAVDm4uIOCiaXws24plK9oq7PIU\r56iOqsyg+acyOrezJicpTCI3YYy5HtapFNZSldLCcRgCCk4hqniDZ2dH\ZjCMf1EXh47laNEN2MfEjkzJFgtK3BLHwEAGTcnlSu7LNPLUbo6+n2m5G\bAuVzUr/ShYQzoSBSWi5iXJwyVqWRr4ctX+om1mq+GR7ibAA8dJuHLfC5\nGVbjl7dMS/tk1g3tB3OXZyWXsyyrsMtWtlXY5SnHGmwpPwW+s3M15h5C\kVvM8FyWcWH3Uce5io00A/8Eu7wUWoVdXoqswi4v5eIlseTWl6e9Cqh6+\IUt6OoUwAJD88KwjC4rJVZAazmpsAa6jFRaA10+qqyBLht1DRu1bNQ1bL\Sy0S425mWFOc9khtxcnRwuaEW6PZnH8sFp5aPRKuwy0i5GMnsmHJE32dz\73a5oG3nJgLyemqDgXKtPu/m2//ix379d7u6m8+XdbLrf5jg2Y9picD5O\B/NpN4vQIrYYLWKJHiX6aJFblBahRSvRvEUsETuQjRapxe6uHSjPsBK7u\0CL0mKUyLKJ25/NLbRaUI+PzwGsRdHnVUzsftj7JFdK\7cAUSrW3SugrdpReeqdluV6Fxdu6hdv6hcCeYabQl7KFG5ElWpiM6itqg\tWovWorXYlU6/d234y/71+eWUVud1dRvz2xT/en06vcwfWiP7QFU51dP7\l/3H7u1xX2+gP9F+/MHc7jw1fz98vD99fTxV65yN6YfP81jE8nDMa8j81\bD5B2R9zCo=')

def simplegesture(name, point_list):
    g = Gesture()
    g.add_stroke(point_list)
    g.normalize()
    g.name = name
    return g

class GestureBoard(Widget):

    def __init__(self, *args, **kwargs):
        super(GestureBoard, self).__init__()
        self.gdb = GestureDatabase()
        self.gdb.add_gesture(check)

    def on_touch_down(self, touch):
        userdata = touch.ud
        with self.canvas:
            Color(1, 1, 0)
            d = 30.0
            Ellipse(pos=(touch.x - d/2, touch.y - d/2), size=(d, d))userdata['line'] = Line(points=(touch.x, touch.y))
Ejemplo n.º 29
0
from kivy.gesture import GestureDatabase, Gesture
#from kivy.metrics import Metrics

def distance():
	#Metrics.dpi() returns the dpi of the screen. 
	#Use this to convert the pixle distance to a 
	#real distance the can work on all sizes of screen.
	pass

def simplegesture(name, point_list):
	g = Gesture()
	g.add_stroke(point_list)
	g.normalize()
	g.name = name
	return g

gdb = GestureDatabase()

swipe_right = gdb.str_to_gesture(b'eNp91FtIFFEYB/BZL2te8lKmXay2NB211MrKstrJLsfsombamK6urpOzrrr7rbuV0AfrSxpkgQ+iBeWDDwkRPgQVPShBYVAioaBFYBTUS1gvPfhQnT2uYXNkzsPMx39+33yHgTm+YJvDfrk9q1Fp83jdSgQJ3EFI7wADQpAohwqCcMXe4FEhmEiVPsG/ZCO9qIq9UfVACJGEhSXH0EvgTbUut7PBa/NAKJHCHA/nrT/vymH0cZvH7XQobWC0QNiyo8sYiIAVdAPhCBEim+Vy2ls9bRBpgShx2bYSP4iAlbQrGiFGlA206yrEkpHPHQ7RapxnQTvEEbOvN3V6Lkfw1qt+vQphtahS92lupnfcq6pxZKRqzj6TZloU8QhrmJh91FfenZvKiwSERCY+9jd/rRjs4sVahHX6Yj3CBiZmpoaSe2bHeJGEsFFfbELYzMRkTjB+zzfxwoSwRV9sRUjWFykI25h4G/98+HamwItUhDR9ISKk64sMhEwmRruyU4LuuXixHWGHvshCyNYXOQg7mejsMRTn/VpmH7sQduuLXIQ9+mIvwj6/MD8dqoLH12Z5kYewX18cQMjXFwcRDumLwwhmJl7VPHnxpdDHCwnhiL4oQDjKxJvB3+EZt0Z5cQzhuL44gUCYmJgydCa+/saLQoSTTLxLKBirjBR5UYRwionJvpdFH7of8OI0whkmpt4bbyaNLzPlLEIxE9PVN6Lvl/7/7ytylP+8srkVpTVw/JRYoFQkUqOVHXdEgoXiOpyj4YA2LCOSKiyGJYHwPA192rCcSHZJG1YQqYlrv0Akh0kbykRqNv/xryVhJZFauEEXieTk3llFJFeONqym4bA2tNCaa6+hNbf52n/fYUlopTW3pTpaD2jDelpz0220HtWGDbSe0IYKrX9ow0tEcnObb6Rh7GLoCoSq4q2vk8Np7XE2K+66VpsCdmJ+1u9fd+QQ+qC1rkWBJtnvweGtz/oLfF9bqw==')

swipe_left = gdb.str_to_gesture(b'eNp91HtQVFUcwPGLgrCIj6TsQcVmoldJWCpxTYmDr5OEuojBBUUF9sJuq7v89sHD9cAi8vwj+cM/rGZymWrSiZJpnPHBjNBUE05ZiKImxCxF6pjNOA7TYP/UuWfunXHOcbp/7OO7n3PPuXfvnNDMCpezpj6tSvX5A141HuvvIC1rgigCM2QlRpKkWqfd74CZGLVaJO1QZtEXh+qscvghGqP0f7UjosyjVT/Tnmqvxx6o8EMMRjFnVvb+vuqBEkt/9vm9Hpfqg1mlEPvYqQsYiIc4ugATgXiZzVXtcbr9PphdCgnyY4fZNBAPc+iouQTmyUoUHVUH83H2eN/q4bFIhIV6eAJnHzFJ6WPtA4Fyh6YXEEiUHdSNfn0mr+/0pIOK5sb1D+fmRnTxJIGnmPhlKmMyNWgRxUICTzNxfbqlcyCuXRNB/w99W4uQLp4h8CwTI398d/bWQ7smAqf+On7baojnCCQxcXVTVU7GdI8onifwAhPDdRM3ui/8owl7XvlwxlRIFy8SSGZiyHQ1ZUHWLU3kt2zJ/N4j6cJM4CUmfsytaZd/rhbFIgIvM3Fx9rljF36SRLGYQAoT33bcSyzMGqSiP9PaM7pjrSGWEFjKRH9Rt+KutYorlQksY+L8Zz2/Lf8yThTLCaQy0ftnTeK9k72ieIXACiY+PXp0xUcZXdo6nDffM8VGG+tII5Cuif6kYu/mmLAkCguBDCaOX0s2SRazKF4l8BoTpwa920a/sInidQIrmThfrN2yiCgyCaxiYiAraXTn0juisBJYzcQ3N5b0BD/M1YT3q5Tku2HjOX2DwBomBlMv5cQ96BTFWgJZTFyqzOwYr/xEFG8SyGbi8iJ5uuF0lSgQgRwmrpzIXRy8PC2KdQTW/7/YQGAjEyMf/01ub+gWxSYCmInrJQ63aeKaKN4isJmJmwV3p1LnXBFFLoG3mRizNo/Ik5Io8ghsYeLXk327Znw+IIqtBLYxEUmwt11c6NJEw5qJwrPj9BlTlQRtv6rwqqpb335spZAvY9SO2CaIkb+LfWiF7Y/GkB4LaDTzcQdGbdNG9LB9sxXeofEEHwtptBrRpr1HtUIR3YKP8VHBqOWOES36RMU0Woxo1mMJRofDfNxJo2RESY+7MGqu06Pvvj5RKY0yH3djdGiQj3toDPFxL41WPpZh1HSfj+U0GjfEF9GXVEGjg492GmU+qhiFBvkrqqTRxscqjBqH+OjAqEGIThrNfHwXIxLmo4vG+exC6JL69X9zH0YHG9nnR+J+jIIRY/FGdNOYzksPRge6eFmNUf0QH4FGCx+9GNVV89GHUW2Yj36MaoQYwCggzF5jPIFa7NWvvRYj7xAf6zACiY/1GLnDxl0y4gGMXGZeBjFy7OXjQYwqhXMSjOxCbMCoLMLHRox2h/gYwqhEiE0YFQnnPIRRwYARu/SHthmj7YiPhzHKF2ILRjZheCuNIT62qYHyMsVEv/g9+1RvmbtChXacfe597fhAiaY/uMv2q9ChaAOgM1Ce9h/iZUWs')







Ejemplo n.º 30
0
from kivy.gesture import GestureDatabase

gdb = GestureDatabase()

cross = gdb.str_to_gesture(
    'eNq1l9tu3DYQhu/1It6bLjicE+cFtrcF/ACBYwv2Iqkt7G7a5u1DDqlT0lZ7I2Mxsj5JP2f4k'
    'xR1OH85//X9+Npfb98uffd7Ow6hO7wM0D0+vD/92T90Q8z/5gN218eH6+3y8aW/5lPqDl8H7g'
    '7/KvLot3WDFCnNzw8f5/dbeSyVx+w/Hvuj3NUNUDMoKXzPj0DsTuGIGiRJGCOVbP4pV7E7/Ra'
    'ORJZMwhS1u35++v9WyFvh7rU2ENEMJI1RuLu+NnEEgyhpjEG2xb1y0H3Ek4vbKA6kEmyKEWdx'
    'WPaJsaVN8eidH2Ef8ejiOIqHdbeQLvolaLTFLxlty7ulsVlaNBKChCnmEpp+uRSSIozRBLbl3'
    'dSoe8m7rdF2kkc3FmGSB1FVphYT6qSejY2sOsXtyYRuLOIkHgEtGrZIKJP4Spk13ZG524qzrX'
    'FWLlHmfok/9UvcFndTUe8Rz8OVA7RIYXtAoluKdke3hJU42j0dQ24pwV7ybiptm1oGE+Rz4il'
    'u9w25q8R3qQtnZ2WKd+TutpLeox4pZmt1jHlh3VR3X8nuUceFdIm4qc5uKy9mapCY339jXKb+'
    '08tjewlmN5VxH3H3lBcLcASZfzGv4osFPiVk5SnmCb6p766y7qbvvvL0Zg2GKtHGCDjPJ2FKi'
    'cfI2wuNuKsCu2i7qYLzdiP3BXGLYIs1DEAo0hh1eyaJeyq8i7b7KdM26ddNXpPO7SCSTnHbSn'
    'ErxXaQVndSJyeJGQOMMe+RJm1aLrk5bku7kYp7SLuPOvlI6/FHs4+87hH2Fats/p8vff8+beV'
    'Vyl5etTucMA/a7kSE+XAbNHVPmcGK2ZKBsxSciTPUyqAwUmdRKouFCToDqgwLU3MWQmVUmDnD'
    '1O7jwsCfOuXFt0JxGKNDaS1rhVwhV5gqpBW0CnEJLaw0G4QKwwrGmlJaQaxw1bp5QRBsBb2iZ'
    'MvczQtSWjGvx09m5uXwmnk1tNKDEGYbZli94TX0aqg1nRrE5Z3WoFdDtWyFBr0aqR2URljLqa'
    '1bbNDrsToywth69QfqGIrcaDVoPSoBqkNtbDE1Wi3iqsAtV6gesSdL0vKCalLNdqa5rjpB3vr'
    'z69utfJTmz8qTFclM/z6/3N4cSteSyvT28bW/PL0/935Ffdsd1n9Q7muT+dNw+Xj59lzFU+6W'
    'Y5L8ug5qwTR/PFH5bDz+AM/6Dqo=')

circle = gdb.str_to_gesture(
    'eNq1WNtyGzcMfd8fiV+iIS4EyB9QXzuTD+g4icbxpLU1ttI2f18QoHa5jpy12qlGAyUw9hA4B'
    'yQh3dx/vf/z++7u8Hz69nSYfumfxzTdfD7C9OHdw+0fh3fTEe2f9kHT84d3z6enx6+HZ/svTz'
    'e/H/N0cxHkg4dNR2lQas8fH+8fTu2x0h6rrzz2a4uajhAZtBS+2yOA0z7tCDMkqjk1y0W1pfN'
    '3+zNN+/dpl0pGqmdLJcv0/PH25+uwr5Onu74EMxErVLeGMT3fNXQDT4C1kopbLVBhG92LB91G'
    'h6RJinRb5A2ZF8euM/aP5JyxhVVShbBiJW9ho7OPcMZG1YTzWzTP2LgAm8XyBmx0bJqxsfSkm'
    '8UqMzaRluVduW5ju5o4qwkKmFWruM28cGLNcW3eriXOWi5kv8zbNK7GcwmbabtP0LXEWcuB7M'
    'Y3pSVxVuRMiGFJaBOcXEzqYrZtwglLEsluBdOSen7R5LiN7nISzehAwsQZwC3yfwJ3PSnP4FZ'
Ejemplo n.º 31
0
from functools import partial
from kivy.properties import (StringProperty,
                             NumericProperty,
                             ListProperty,
                             BooleanProperty,
                             ObjectProperty)

import random
import math
from kivy.uix.behaviors import ButtonBehavior


#-------------------------------------
hsff = HighScore
gdb = GestureDatabase()
swipe_up = gdb.str_to_gesture(up_swipe)
swipe_up.name = "swipe_up"
swipe_down = gdb.str_to_gesture(down_swipe)
swipe_down.name = "swipe_down"
swipe_left = gdb.str_to_gesture(left_swipe)
swipe_left.name = "swipe_left"
swipe_right = gdb.str_to_gesture(right_swipe)
swipe_right.name = "swipe_right"
gdb.add_gesture(swipe_up)
gdb.add_gesture(swipe_down)
gdb.add_gesture(swipe_down)
gdb.add_gesture(swipe_left)
gdb.add_gesture(swipe_right)
#--------------------------------------------

class Root(ScreenManager):
Ejemplo n.º 32
0
#!/usr/bin/env python
from kivy.gesture import GestureDatabase

gdb = GestureDatabase()

cross = gdb.str_to_gesture(
    'eNq1l9tu3DYQhu/1It6bLjicE+cFtrcF/ACBYwv2Iqkt7G7a5u1DDqlT0lZ7I2Mxsj5JP2f4k'
    'xR1OH85//X9+Npfb98uffd7Ow6hO7wM0D0+vD/92T90Q8z/5gN218eH6+3y8aW/5lPqDl8H7g'
    '7/KvLot3WDFCnNzw8f5/dbeSyVx+w/Hvuj3NUNUDMoKXzPj0DsTuGIGiRJGCOVbP4pV7E7/Ra'
    'ORJZMwhS1u35++v9WyFvh7rU2ENEMJI1RuLu+NnEEgyhpjEG2xb1y0H3Ek4vbKA6kEmyKEWdx'
    'WPaJsaVN8eidH2Ef8ejiOIqHdbeQLvolaLTFLxlty7ulsVlaNBKChCnmEpp+uRSSIozRBLbl3'
    'dSoe8m7rdF2kkc3FmGSB1FVphYT6qSejY2sOsXtyYRuLOIkHgEtGrZIKJP4Spk13ZG524qzrX'
    'FWLlHmfok/9UvcFndTUe8Rz8OVA7RIYXtAoluKdke3hJU42j0dQ24pwV7ybiptm1oGE+Rz4il'
    'u9w25q8R3qQtnZ2WKd+TutpLeox4pZmt1jHlh3VR3X8nuUceFdIm4qc5uKy9mapCY339jXKb+'
    '08tjewlmN5VxH3H3lBcLcASZfzGv4osFPiVk5SnmCb6p766y7qbvvvL0Zg2GKtHGCDjPJ2FKi'
    'cfI2wuNuKsCu2i7qYLzdiP3BXGLYIs1DEAo0hh1eyaJeyq8i7b7KdM26ddNXpPO7SCSTnHbSn'
    'ErxXaQVndSJyeJGQOMMe+RJm1aLrk5bku7kYp7SLuPOvlI6/FHs4+87hH2Fats/p8vff8+beV'
    'Vyl5etTucMA/a7kSE+XAbNHVPmcGK2ZKBsxSciTPUyqAwUmdRKouFCToDqgwLU3MWQmVUmDnD'
    '1O7jwsCfOuXFt0JxGKNDaS1rhVwhV5gqpBW0CnEJLaw0G4QKwwrGmlJaQaxw1bp5QRBsBb2iZ'
    'MvczQtSWjGvx09m5uXwmnk1tNKDEGYbZli94TX0aqg1nRrE5Z3WoFdDtWyFBr0aqR2URljLqa'
    '1bbNDrsToywth69QfqGIrcaDVoPSoBqkNtbDE1Wi3iqsAtV6gesSdL0vKCalLNdqa5rjpB3vr'
    'z69utfJTmz8qTFclM/z6/3N4cSteSyvT28bW/PL0/935Ffdsd1n9Q7muT+dNw+Xj59lzFU+6W'
    'Y5L8ug5qwTR/PFH5bDz+AM/6Dqo=')

circle = gdb.str_to_gesture(
    'eNq1WNtyGzcMfd8fiV+iIS4EyB9QXzuTD+g4icbxpLU1ttI2f18QoHa5jpy12qlGAyUw9hA4B'
    'yQh3dx/vf/z++7u8Hz69nSYfumfxzTdfD7C9OHdw+0fh3fTEe2f9kHT84d3z6enx6+HZ/svTz'
    'e/H/N0cxHkg4dNR2lQas8fH+8fTu2x0h6rrzz2a4uajhAZtBS+2yOA0z7tCDMkqjk1y0W1pfN'
    '3+zNN+/dpl0pGqmdLJcv0/PH25+uwr5Onu74EMxErVLeGMT3fNXQDT4C1kopbLVBhG92LB91G'
    'h6RJinRb5A2ZF8euM/aP5JyxhVVShbBiJW9ho7OPcMZG1YTzWzTP2LgAm8XyBmx0bJqxsfSkm'
    '8UqMzaRluVduW5ju5o4qwkKmFWruM28cGLNcW3eriXOWi5kv8zbNK7GcwmbabtP0LXEWcuB7M'
Ejemplo n.º 33
0
class DrawingCanvas(StencilView):
    def __init__(self, *args, **kwargs):
        super(DrawingCanvas, self).__init__()
        self.gdb = GestureDatabase()
        self.line45 = self.gdb.str_to_gesture(line45_str)
        self.circle = self.gdb.str_to_gesture(circle_str)
        self.cross = self.gdb.str_to_gesture(cross_str)
        self.line135 = self.line45.rotate(90)
        self.line225 = self.line45.rotate(180)
        self.line315 = self.line45.rotate(270)
        self.gdb.add_gesture(self.line45)
        self.gdb.add_gesture(self.line135)
        self.gdb.add_gesture(self.line225)
        self.gdb.add_gesture(self.line315)
        self.gdb.add_gesture(self.circle)
        self.gdb.add_gesture(self.cross)
        self.links = []

    def addLink(self, link):
        self.links.append(link)

    def removeLink(self, link):
        self.remove_widget(link.widgetLink)
        self.links.remove(link)

    def getLink(self, element1, element2):
        for child in self.links:
            if (child.element1 == element1 and child.element2 == element2) or (
                    child.element1 == element2 and child.element2 == element1):
                return child
        return None

    def getLinksForOneElement(self, element):
        tempLinks = []
        for child in self.links:
            if (child.element1 == element or child.element2 == element):
                tempLinks.append(child)
        return tempLinks

    def activate(self):
        self.bind(on_touch_down=self.down,
                  on_touch_move=self.move,
                  on_touch_up=self.up)

    def deactivate(self):
        self.unbind(on_touch_down=self.down,
                    on_touch_move=self.move,
                    on_touch_up=self.up)

    def down(self, ds, touch):
        if self.collide_point(*touch.pos):
            self.points = [touch.pos]
            self.ix = self.fx = touch.x
            self.iy = self.fy = touch.y
        return True

    def move(self, ds, touch):
        if self.collide_point(*touch.pos):
            self.points += [touch.pos]
            self.min_and_max(touch.x, touch.y)
        return True

    def up(self, ds, touch):
        if self.collide_point(*touch.pos):
            self.points += [touch.pos]
            self.min_and_max(touch.x, touch.y)
            gesture = self.gesturize()
            recognized = self.gdb.find(gesture, minscore=0.50)
            if recognized:
                self.discriminate(recognized)
        return True

    def gesturize(self):
        gesture = Gesture()
        gesture.add_stroke(self.points)
        gesture.normalize()
        return gesture

    def min_and_max(self, x, y):
        self.ix = min(self.ix, x)
        self.iy = min(self.iy, y)
        self.fx = max(self.fx, x)
        self.fy = max(self.fy, y)

    def discriminate(self, recognized):
        if recognized[1] == self.cross:
            self.add_stickman()
        if recognized[1] == self.circle:
            self.add_circle()
        if recognized[1] == self.line45:
            self.add_line(self.ix, self.iy, self.fx, self.fy)
        if recognized[1] == self.line135:
            self.add_line(self.ix, self.fy, self.fx, self.iy)
        if recognized[1] == self.line225:
            self.add_line(self.fx, self.fy, self.ix, self.iy)
        if recognized[1] == self.line315:
            self.add_line(self.fx, self.iy, self.ix, self.fy)

    def add_circle(self):
        cx = (self.ix + self.fx) / 2.0
        cy = (self.iy + self.fy) / 2.0
        self.tool_box.tool_circle.widgetize(self, cx, cy, self.fx, self.fy)

    def add_line(self, ix, iy, fx, fy):
        self.tool_box.tool_line.widgetize(self, ix, iy, fx, fy)

    def add_stickman(self):
        cx = (self.ix + self.fx) / 2.0
        cy = (self.iy + self.fy) / 2.0
        self.tool_box.tool_stickman.draw(self, cx, cy)

    def on_children(self, instance, value):
        self.status_bar.counter = len(self.children)

    def repaintAllLinks(self, element1, povezaniElementi):
        for child in povezaniElementi:
            self.tool_box.tool_line.widgetizeLink(self, element1, child)

    def paint_links(self, element1, element2):
        self.tool_box.tool_line.widgetizeLink(self, element1, element2)
        element1.addLinkElement(element2)
        element2.addLinkElement(element1)

    def export_to_png(self, filename, *args):
        if self.parent is not None:
            canvas_parent_index = self.parent.canvas.indexof(self.canvas)
            self.parent.canvas.remove(self.canvas)
        fbo = Fbo(size=self.size, with_stencilbuffer=True)
        with fbo:
            ClearColor(0, 0, 0, 1)
            ClearBuffers()
            Scale(1, -1, 1)
            Translate(-self.x, -self.y - self.height, 0)
        fbo.add(self.canvas)
        fbo.draw()
        fbo.texture.save(filename, flipped=False)
        fbo.remove(self.canvas)
        if self.parent is not None:
            self.parent.canvas.insert(canvas_parent_index, self.canvas)
        return True