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
    19484
    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

      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