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
    19437
    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.
    • 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