omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.


    Frame for tetris

    Pythonista
    6
    60
    19404
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Karina
      Karina last edited by

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

      1 Reply Last reply Reply Quote 0
      • Karina
        Karina last edited by 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?

        cvp 1 Reply Last reply Reply Quote 0
        • Karina
          Karina last edited by

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

          1 Reply Last reply Reply Quote 0
          • cvp
            cvp @Karina last edited by cvp

            @Karina said:

            Maybe you’ll check if it works?

            I don't have the arrows module thus no button, but if I touch anywhere in game, it prints touch_began

            1 Reply Last reply Reply Quote 0
            • Karina
              Karina last edited by

              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) 
              
              cvp 2 Replies Last reply Reply Quote 0
              • cvp
                cvp @Karina last edited by

                @Karina sorry, not at home, I’ll try later

                cvp 1 Reply Last reply Reply Quote 0
                • cvp
                  cvp @Karina last edited by

                  @Karina doc says for your

                          ars = arrows.Main()
                          self.present_modal_scene(ars) ```
                  

                  Doc says "Scene.present_modal_scene(other_scene)
                  Present another scene on top of this one. This can be useful for overlay menus etc.
                  While the scene is being presented, it receives all touch events."

                  1 Reply Last reply Reply Quote 0
                  • cvp
                    cvp @cvp last edited by cvp

                    @Karina please try this

                    from scene import *
                    import random
                    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']
                    
                    bw = 100
                    bh = 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 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):
                            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
                                    
                    
                        def add_buttons(self):
                            #ars = arrows.Main()
                            #self.present_modal_scene(ars)
                            self.arrows = [Arrow(i, position=icons[i], parent=self) for i in icons] 
                    
                                    
                        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())   
                    
                    1 Reply Last reply Reply Quote 0
                    • Karina
                      Karina last edited by

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

                      cvp 1 Reply Last reply Reply Quote 0
                      • cvp
                        cvp @Karina last edited by cvp

                        @Karina said:

                        I thought to put the moving ➡️⬅️ into arrows, but it would be much more confusing

                        Sorry, I don't understand.

                        The touch_began in Game is called. Then, you could check which arrow (like you do) and process the move of the block (left, right,down)

                        1 Reply Last reply Reply Quote 0
                        • Karina
                          Karina last edited by 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👍

                          1 Reply Last reply Reply Quote 0
                          • Karina
                            Karina last edited by

                            @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?

                            1 Reply Last reply Reply Quote 0
                            • Karina
                              Karina last edited by 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

                              1 Reply Last reply Reply Quote 0
                              • ronw
                                ronw last edited by

                                This post is deleted!
                                1 Reply Last reply Reply Quote 0
                                • First post
                                  Last post
                                Powered by NodeBB Forums | Contributors