• Karina

    @mikael thanks) why have I overlooked that

    posted in Pythonista read more
  • Karina

    Hey everyone
    I’ve begun to write smth like air hockey and for now stuck cause the ball stays on its place but prints that the position is changing. I can’t figure why, seems i’ve written it just like the paddles that can move

    Here’s the code, about a 100 lines

    
    from scene import *
    import math
    import random
    
    
    sw, sh = get_screen_size()[0], get_screen_size()[1]
    
    
    class Ball(SpriteNode):
        def __init__(self, r=11, v=(1, 1), parent=None, *args, **kwargs):
            self.size = (r*2, r*2)
            self.v = Vector2(*v)
            self.r = r
            self.ball_speed = 10
            self.angle = random.uniform(0, 2*math.pi)
            SpriteNode('pzl:BallGray', color='purple', parent=parent, *args, **kwargs)
    
    
    
    class Game(Scene):
        def setup(self):
            self.background_color = 'black'
            board_shape = ui.Path.rounded_rect(0, 0, sw-30, sh-30, 15)
            board_shape.line_width = 4
            self.board = ShapeNode(board_shape, position=(sw/2, sh/2), 
                              stroke_color='#723d04', fill_color='#acacac',
                              z_position=-1, parent=self)
                              
            self.left_player = SpriteNode('pzl:PaddleBlue', position=(-420, 0),
                                          parent=self.board)
            self.left_player.rotation = math.pi/2
            
            self.right_player = SpriteNode('pzl:PaddleRed', position=(420, 0),
                                           parent=self.board)
            self.right_player.rotation = math.pi/2
            
            self.right_touch, self.left_touch = (0, 0), (0, 0)
            
            self.spawn_ball()
            
            
        def update(self):
            print(self.ball.position)
            x, y = self.ball.position + self.ball.v
            self.ball.position = Point(x, y)
                
            
        def touch_began(self, touch):
            touch_loc = self.board.point_from_scene(touch.location)
            if touch_loc in self.left_player.frame:
                self.left_touch = touch.touch_id
            elif touch_loc in self.right_player.frame:
                self.right_touch = touch.touch_id
            
            
        def touch_moved(self, touch):
            if self.right_touch != (0, 0) or self.left_touch != (0, 0):
                self.move_paddle(touch)
                    
        
        def touch_ended(self, touch):
            touch_id = touch.touch_id
            if touch_id == self.right_touch:
                self.right_touch = (0, 0)
            elif touch_id == self.left_touch:
                self.left_touch = (0, 0)
                
                
        def move_paddle(self, user_touch):
            paddle = None
            touch_id = user_touch.touch_id
            delta_y = user_touch.location.y - user_touch.prev_location.y
            if touch_id in self.left_touch:
                paddle = self.left_player
            elif touch_id in self.right_touch:
                paddle = self.right_player
                
            if paddle:  
                x, y = paddle.position
                if delta_y > 0:
                    paddle.position = x, min(y + delta_y, sh/2 - 70)
                elif delta_y < 0:
                    paddle.position = x, max(y + delta_y, -sh/2 + 70)
                    
                    
        def spawn_ball(self):
            self.ball = Ball(position=(0, 0), parent=self.board)
            self.ball.v = (math.cos(self.ball.angle), math.sin(self.ball.angle))
            
    
        
    run(Game())
    
    

    posted in Pythonista read more
  • Karina

    from scene import *
    import random, sound
    from arrows import *
    
    sw, sh = get_screen_size()
    rect_w = sw/3  #343.33
    rect_h = 612 #668
    side = int(rect_w/10)
    colors = ['red']
    
    x = side/2
    y = rect_h/2 - side/2
    dot =  [[
             [x, y]
                    ]]
                    
    line = [
             [[x, y], [x+side, y]],
             [[x, y], [x, y-side]]
                                   ]
                                 
    shapes = [dot, line]
    
    
    class Board(ShapeNode):
        def __init__(self, stroke_color='lightgrey', line_width=1, parent=None, *args, **kwargs):
                path = ui.Path.rect(0, 0, rect_w, rect_h)
                path.line_width = line_width
                
                if stroke_color == 'lightgrey':
                    d = int(rect_w/10)
                    for l in range(int(rect_w/d)):
                        x = l*d
                        path.move_to(x, 0)
                        path.line_to(x, rect_h)
                
                super().__init__(path,
                                 fill_color='white',
                                 stroke_color=stroke_color,
                                 parent=parent,
                                 *args, **kwargs)
            
    
    
    class Game(Scene):
        def setup(self):
            self.background_color = 'white'
            self.grey_rect = Board(line_width=2, parent=self, position=(sw/3, sh/2), z_position=0)
            self.board = Board(stroke_color='purple', line_width=15, parent=self, position=(sw/3, sh/2),    z_position=-1)
            
            self.seconds = 0
            self.figure = {}
            self.add_buttons()
            self.add_figure()
            
        
        def update(self):
            self.seconds += self.dt
            if self.seconds > 0.2:
                for f in self.figure:
                    self.figure[f][1] -= side/2
                    f.position = self.figure[f]
                    self.seconds = 0
                    if f.position.y == - rect_h/2 + side/2:
                        self.figure.pop(f)
                        self.add_figure()
                        break
                        
                        
        def touch_began(self, touch):
            tapped = True
            for arw in self.arrows:
                if touch.location in arw.frame:
                    sound.play_effect('rpg:Chop')
                    arw.fill_color = '#969696'
                    
                    for f in self.figure:
                        if -rect_w/2 < self.figure[f][0] + side < rect_w/2:
                            if 'right' in arw.picture:
                                self.figure[f][0] += side
                        
                        if -rect_w/2 < self.figure[f][0] - side < rect_w/2:
                            if 'left' in arw.picture:
                                self.figure[f][0] -= side
                                
        def touch_ended(self, touch):
            for arw in self.arrows:
                if arw.fill_color == '#969696':
                    arw.fill_color = 'white'
                    right = left = down = up = None;
                    
    
        def add_buttons(self):
            self.arrows = [Arrow(i, position=icons[i], parent=self) for i in icons] 
    
                
        def add_figure(self):
            figure = random.choice(shapes)
            #for example, var=0 for horizontal line, 1 - for vertical
            var = random.choice(range(len(figure)))
            print(figure[var])
            global x 
            global y
            x = random.choice(range(10)) * side - rect_w/2 + side/2
            y = rect_h/2 - side/2
            for pos in figure[var]:
                print(pos)
                block = SpriteNode('pzl:Gray3', pos,            color=colors[shapes.index(figure)] , size=(side, side), parent=self.grey_rect)
                self.figure[block] = pos
    
    
    run(Game())  
    

    There are a lot of bugs cause I move the blocks one by one. And I added colors but they mix with the original color

    posted in Pythonista read more
  • Karina

    @cvp I did also moving blocks down, in cycle for, one by one each block. Is there a way think of a figure as a single block?

    posted in Pythonista read more
  • Karina

    @cvp I thought to write how to move blocks right and left in the touch_began of arrows. But no matter, you did it easier👍

    posted in Pythonista read more
  • Karina

    @cvp So the Tetris didn’t receive touches?
    I thought to put the moving ➡️⬅️ into arrows, but it would be much more confusing

    posted in Pythonista read more
  • Karina

    And if with arrows? Maybe it looks on that touch_began

    from scene import *
    import sound
    
    
    def sw(): return get_screen_size()[0]
    def sh(): return get_screen_size()[1]
    def bw(): return 100
    def bh(): return 100
    
    right = left = down = up = None
    
    icons = {
             'iob:arrow_down_b_256' : (sw()/4*3, 60),
             'iob:arrow_up_b_256' : (sw()/4*3, bh() + 60),
             'iob:arrow_left_b_256' : (sw()/4*3 - 95, bh()),
             'iob:arrow_right_b_256' : (sw()/4*3 + 95, bh())
              }
    
    
    class Arrow(ShapeNode):
        def __init__(self,
                     picture,
                     path=None,
                     size=Size(120, 120),
                     corner_radius=8,
                     border_size=20,
                     borderColor='#3f0917',
                     position=(0,0),
                     parent=None,
                     *args, **kwargs):
                        
                        #for border
                        self.picture = picture
                        self.corner_radius = corner_radius
                        self.border_size = border_size
                        self.borderColor = borderColor
                        
                        self.position = position
                        self.size = size
                        
                        #for super()
                        self.x, self.y = position
                        self.w, self.h = size
                        
                        super().__init__(fill_color='white',
                                        path=ui.Path.rounded_rect(self.x, 
                                                                   self.y,
                                                                   self.w/1.5, 
                                                                   self.h/1.5,
                                                                   self.corner_radius),
                                        stroke_color=borderColor,
                                        parent=parent,
                                        *args, **kwargs)
                                        
                        self._setup(self.picture)
                                         
        def _setup(self, pict):
            if self.picture:
                arrow = SpriteNode(self.picture,
                                   position=Point(0, 0), 
                                   size=(100, 100),
                                   parent=self)
                                   
                                         
    
    class Main(Scene):                               
        def setup(self):
            fill_color = self.background_color
            self.background_color = 'white'
            self.arrows = [Arrow(i, position=icons[i], parent=self) for i in icons] 
                
                
        def touch_began(self, touch):
            tapped = True
            for arw in self.arrows:
                if touch.location in arw.frame:
                    sound.play_effect('rpg:Chop')
                    arw.fill_color = '#969696'
                    if 'right' in arw.picture:
                        global right
                        right = True
                    
                
        def touch_ended(self, touch):
            for arw in self.arrows:
                if arw.fill_color == '#969696':
                    arw.fill_color = 'white'
                    right = left = down = up = None
                    
            
                    
    if __name__ == '__main__':              
        run(Main(), PORTRAIT) 
    

    posted in Pythonista read more
  • Karina

    You’re talking about that position in the beginnig, when I couldn’t move the purple rect from the corner?)

    posted in Pythonista read more
  • Karina

    from scene import *
    import random
    import arrows
    
    sw, sh = get_screen_size()
    rect_w = sw/3  #343.33
    rect_h = 612 #668
    side = int(rect_w/10)
    colors = ['red']
    
    
    class Board(ShapeNode):
        def __init__(self, stroke_color='lightgrey', line_width=1, parent=None, *args, **kwargs):
                path = ui.Path.rect(0, 0, rect_w, rect_h)
                path.line_width = line_width
                
                if stroke_color == 'lightgrey':
                    d = int(rect_w/10)
                    for l in range(int(rect_w/d)):
                        x = l*d
                        path.move_to(x, 0)
                        path.line_to(x, rect_h)
                
                super().__init__(path,
                                 fill_color='white',
                                 stroke_color=stroke_color,
                                 parent=parent,
                                 *args, **kwargs)
            
    
    
    class Game(Scene):
        def setup(self):
            self.background_color = 'white'
            self.grey_rect = Board(line_width=2, parent=self, position=(sw/3, sh/2), z_position=0)
            self.board = Board(stroke_color='purple', line_width=15, parent=self, position=(sw/3, sh/2),    z_position=-1)
            
            self.seconds = 0
            self.figures = {}
            self.add_buttons()
            self.add_figure()
            
        
        def update(self):
            self.seconds += self.dt
            if self.seconds > 0.5:
                for f in self.figures:
                    self.figures[f][1] -= side/2
                    f.position = self.figures[f]
                    self.seconds = 0
                    if f.position.y == - rect_h/2 + side/2:
                        self.add_figure()
                        self.figures.pop(f)
                        
                        
        def touch_began(self, touch):
            print('touch_began')
    
    
        def add_buttons(self):
            ars = arrows.Main()
            self.present_modal_scene(ars)
    
                    
        def add_figure(self):
            x = random.choice(range(10)) * side - rect_w/2 + side/2
            y = rect_h/2 - side/2
            block = SpriteNode('pzl:Yellow7', (x, y), z_position=1, size=Size(side, side), parent=self.grey_rect)
            self.figures[block] = [x, y]
    
    
    run(Game())  
    

    Maybe you’ll check if it works?

    posted in Pythonista read more
  • Karina

    @cvp it’s in the game class that inherited scene. And update in the class he sees

    posted in Pythonista read more
  • Karina

    @cvp did so that the block moves down, but for ⬅️➡️ my touch_began doesn’t work. I did this

    def touch_began(self, touch):
            print('touch_began') 
    

    And nothing in the console

    posted in Pythonista read more
  • Karina

    @cvp so the center is (0, 0)?

    posted in Pythonista read more
  • Karina

    @cvp @mikael sorry, I have another problem. I still can’t writing smth by myself🙂

    I tried here to add a block on the board, but it doesn’t show it. But prints the position

    from scene import *
    import random
    import arrows
    
    sw, sh = get_screen_size()
    rect_w = sw/3  #343.33
    rect_h = sh-100  #668
    side = int(rect_w/10)
    colors = ['red']
    
    class Board(ShapeNode):
        def __init__(self, stroke_color='lightgrey', line_width=1, parent=None, *args, **kwargs):
                path = ui.Path.rect(0, 0, rect_w, rect_h)
                path.line_width = line_width
                
                if stroke_color == 'lightgrey':
                    d = int(rect_w/10)
                    for l in range(int(rect_w/d)):
                        x = l*d
                        path.move_to(x, 0)
                        path.line_to(x, rect_h)
                
                super().__init__(path,
                                 fill_color='white',
                                 stroke_color=stroke_color,
                                 parent=parent,
                                 *args, **kwargs)
            
    
    
    class Game(Scene):
        def setup(self):
            self.background_color = 'white'
            grey_rect = Board(line_width=2, parent=self, position=(sw/3, sh/2), z_position=0)
            self.board = Board(stroke_color='purple', line_width=15, parent=self, position=(sw/3, sh/2),    z_position=-1)
            self.add_buttons()
            self.add_figure()
            
        def add_buttons(self):
            ars = arrows.Main()
            self.present_modal_scene(ars)
            
        def add_figure(self):
            x = random.choice(range(10)) * side
            y = rect_h
            block = SpriteNode('pzl:Yellow7', (x, y), z_position=1, size=Size(side, side), parent=self.board)
            print(block.position)
    
    
    run(Game())  ```

    posted in Pythonista read more
  • Karina

    @mikael yes, I want to do smth like that. I’ll also look in github, but I didn’t use it before

    posted in Pythonista read more
  • Karina

    @cvp By the way do you know how to allow multi_touch? This for another thing that is nearly ready

    posted in Pythonista read more
  • Karina

    @cvp that correction I can do 😅
    It was at the beginning before super, but somehow didn’t work. So I put after. And what changes if it’s after super?

    posted in Pythonista read more
  • Karina

    For now it’s like this

    from scene import *
    import arrows
    
    sw, sh = get_screen_size()
    rect_w = sw/3
    rect_h = sh-100
    
    class Board(ShapeNode):
        def __init__(self, stroke_color='grey', line_width=1, parent=None, *args, **kwargs):
                path = ui.Path.rect(0, 0, rect_w, rect_h)
                path.line_width = line_width
                super().__init__(path,
                                 fill_color='white',
                                 stroke_color=stroke_color,
                                 parent=parent,
                                 *args, **kwargs)
                
                if stroke_color == 'grey':
                    print(stroke_color)
                    d = int(rect_w/30)
                    for l in range(int(rect_w/d)):
                        x = l*d
                        path.move_to(x, 0)
                        path.line_to(x, rect_h)
    
    
    class Game(Scene):
        def setup(self):
            self.background_color = 'white'
            grey_rect = Board(line_width=2, parent=self, position=(sw/2, sh/2))
            board = Board(stroke_color='purple', line_width=10, parent=self, position=(sw/3, sh/2))
            self.add_buttons()
            
        def add_buttons(self):
            ars = arrows.Main()
            self.present_modal_scene(ars)
    
    
    run(Game())  
    

    I use another pos in grey_rect to see that both are drawn, it shouldn’t be in the end like that
    But here there’s no vertical grey lines, though they in init. And it prints ‘grey’, so he gets in that for

    posted in Pythonista read more
  • Karina

    @cvp what did you change that it works now?

    posted in Pythonista read more
  • Karina

    @cvp what do you mean super without parenthesis?
    About rect - I tried different ways to initiate board and forgot to delete rect.line_width

    posted in Pythonista read more
  • Karina

    Here's the code

    from scene import *
    
    sw, sh = get_screen_size()
    rect_w = sw/3
    rect_h = sh-100
    
    class Board(ShapeNode):
         def __init__(self, stroke_color, line_width, parent, *args, **kwargs):
    
              self.stroke_color = stroke_color
              path=ui.Path.rect(0, 0, rect_w, rect_h)
              path.line_width = line_width
              self.parent = parent
    
    super.__init__(path,
                             fill_color='white',
                             stroke_color=self.stroke_color,
                             parent=parent,
                            *args, **kwargs)
    
    
    class Game(Scene):
         def setup(self):
              self.background_color = 'white'
              grey_rect = Board(stroke_color='grey', line_width=2, parent=self)
              rect.line_width = 10
              board = Board(position=(sw/2, sh/2), stroke_color='purple', path=rect, parent=self)
    
    
    run(Game())
    

    The idea is to create a rect in grey color line_width 2, and draw with it grey lines. Then draw above a purple rect above. I would draw that on paper, but i don't know how to add photos here
    And the error - TypeError, 'Board' object has no attribute '_suspend_updates'

    posted in Pythonista read more
Internal error.

Oops! Looks like something went wrong!