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