Partage
  • Partager sur Facebook
  • Partager sur Twitter

Collision en python

    1 novembre 2011 à 16:53:56

    Salut

    Je viens de coder un petit programme tout bete : je déplace un point au centre de la fenêtre avec mon joystick.
    J'ai dessiné un grand cercle, et je souhaite que mon point reste dans ce cercle, c'est à dire qu'une fois qu'il croise le cercle il s'arrette.

    Auriez vous une idée sur la façon de s'y prendre pour faire cela?

    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      1 novembre 2011 à 17:00:11

      la distance entre le point et le centre du cercle doit être inférieure ou égale au rayon du cercle ...
      • Partager sur Facebook
      • Partager sur Twitter

      Python c'est bon, mangez-en. 

        1 novembre 2011 à 17:54:33

        Super merci.

        Comment puis-je faire pour éviter de "pousser" le collimateur à l'exterieur du cercle?

        if le point est sur la bordure du cercle
        ???
        • Partager sur Facebook
        • Partager sur Twitter
          1 novembre 2011 à 22:36:32


          if la distance entre le point et le centre du cercle == au rayon du cercle : on stoppe
          bon, ça c'est pour un déplacement pixel/pixel.

          si le point se déplace de plusieurs pixels à la fois alors:
          if la distance entre le point et le centre du cercle > au rayon du cercle : on fait de la trigo pour calculer la position adéquate.

          • Partager sur Facebook
          • Partager sur Twitter

          Python c'est bon, mangez-en. 

            3 novembre 2011 à 11:42:03

            J'essaye mais je n'arrive pas a le placer correctement.
            J'arrive a faire
            if la distance entre le point et le centre du cercle == au rayon du cercle : on stoppe

            Mais une fois aue c'est stoppe je ne peux plus bouger le point, meme si je souhaite le deplacer vers le centre, ce qui aurait pour effet de le re rendre mobile puisque'il reste dans le cercle..
            • Partager sur Facebook
            • Partager sur Twitter
              3 novembre 2011 à 12:16:47

              il faut faire ça non pas avec la position actuelle, mais avec la position future.

              si action du joystick:
                  new_pos = actu_pos + 1
                  si new_pos est dans le cercle:
                      actu_pos = new_pos
              • Partager sur Facebook
              • Partager sur Twitter

              Python c'est bon, mangez-en. 

                3 novembre 2011 à 15:07:07

                Désolé, je n'y arrive pas...
                Je calcule la nouvelle position px si le point est dans le cercle. Sauf qu'il y a un problème puisque je le calcule aussi en dehors du if...

                # px est la nouvelle position du joystick
                	px = px + tj[0] * move_speed
                	py = py + tj[1] * move_speed
                	
                        #Distance au centre du cercle
                	longueur = math.sqrt(((px-320)*(px-320)) + ((py-240)*(py-240)))
                
                	if longueur >= 200:	
                		??????
                
                	elif longueur <= 200:
                		px = px + tj[0] * move_speed
                		py = py + tj[1] * move_speed
                
                	pygame.draw.circle(screen, (0, 255, 0), (int(px), int(py)), 5)
                
                • Partager sur Facebook
                • Partager sur Twitter
                  3 novembre 2011 à 23:07:33

                  j'ai pas testé mais c'est dans l'idée ...

                  # px est la nouvelle position du joystick
                  	test_px = px + tj[0] * move_speed
                  	test_py = py + tj[1] * move_speed
                  	
                          #Distance au centre du cercle
                  	X = test_px-320
                  	Y = test_py-240
                  	longueur = math.sqrt(X**2 + Y**2)
                  
                  	if longueur >= 200:
                  		angle = math.atan2(Y,X)
                  		px = math.cos(angle)*200
                  		py = math.sin(angle)*200
                  
                  	else:
                  		px = test_px
                  		py = test_py
                  
                  	pygame.draw.circle(screen, (0, 255, 0), (int(px), int(py)), 5)
                  

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Python c'est bon, mangez-en. 

                    3 novembre 2011 à 23:39:11

                    Ca marche, sauf que quand j'approche la bordure du cercle, la position px et py se figent à -120 et -160 (ce qui correspond a la moitié de la position du centre, avec un signe moins..)

                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 novembre 2011 à 23:40:51

                      ha oui c'est vrai, centre du cercle ... c'est corrigé.

                      # px est la nouvelle position du joystick
                      	test_px = px + tj[0] * move_speed
                      	test_py = py + tj[1] * move_speed
                      	
                              #Distance au centre du cercle
                      	X = test_px-320
                      	Y = test_py-240
                      	longueur = X**2 + Y**2
                      
                      	if longueur >= 200**2:
                      		angle = math.atan2(Y,X)
                      		px = math.cos(angle)*200 + 320
                      		py = math.sin(angle)*200 + 240
                      
                      	else:
                      		px = test_px
                      		py = test_py
                      
                      	pygame.draw.circle(screen, (0, 255, 0), (int(px), int(py)), 5)
                      
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Python c'est bon, mangez-en. 

                        5 novembre 2011 à 13:59:06

                        Genial.
                        Merci beaucoup ! :)


                        Juste une petite question supplémentaire.
                        Avec pygame j'utilise joystick.get_button(0) qui me retourne true si je presse le bouton, false si je ne le presse pas.

                        Quand je clique j'incrémente une variable.
                        Le problème c'est que le clic est continu, si j'appuie pendant 5 secondes ma variable va s'incrémenter de 50 au lieu de 1 fois. Comment remédier à ca?
                        Merci
                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 novembre 2011 à 11:40:59

                          Bonjour,
                          Essaye avec une variable booléenne.
                          if *appuieSurUnBouton*:
                              if maVariableBooleeneEstTrue:
                                  pass #On incrémente pas
                              else:
                                  compteur += 1
                          else:
                              #Suite de ton code
                          
                          • Partager sur Facebook
                          • Partager sur Twitter
                            6 novembre 2011 à 12:27:14

                            d'accord avec realmagma sur le principe, mais son code est imcomplet...

                            joybuttonflip = True # on commence avec un boutton relache
                            if *appuieSurUnBouton* and joybuttonflip:
                                compteur += 1
                                joybuttonflip = False
                            if *relacheBouton*:
                                joybuttonflip = True
                            


                            perso j'utiliserai plutôt l'événement JOYBUTTONDOWN, à la place de joystick.get_button(0)...

                            ev = *event_intercepté*
                            if ev.type == JOYBUTTONDOWN and ev.button == numéro_du_bouton:
                                compteur += 1
                            
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Python c'est bon, mangez-en. 

                              6 novembre 2011 à 13:22:53

                              Ca doit marcher, sauf que quand je déclare ma variable compteur en haut du code elle est relue à chaque fois. Pourtant je l'ai déclarée en dehors de ma boucle while principale..
                              • Partager sur Facebook
                              • Partager sur Twitter
                                6 novembre 2011 à 13:30:42

                                montres ton code ...
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Python c'est bon, mangez-en. 

                                  6 novembre 2011 à 14:31:58

                                  import pygame
                                  import math
                                  
                                  def norm(v):
                                  ...
                                  	
                                  def length(v):
                                  ...
                                  
                                  def joystick_transform(j):
                                  ...
                                  
                                  
                                  pygame.init()
                                  pygame.joystick.init()
                                  
                                  screen = pygame.display.set_mode((1280,960))
                                  
                                  js = pygame.joystick.Joystick(0)
                                  js.init()
                                  
                                  px = 900.0
                                  py = 240.0
                                  
                                  
                                  def numberincrement(buttonpressed):
                                  	if buttonpressed :
                                  		if buttonpressed == True :
                                  			pass
                                  		else :
                                  			if number == 5:
                                  				number =  1
                                  			else:
                                  				number = number + 1
                                  
                                  move_speed = 2
                                  
                                  done = False
                                  while not done:
                                  	
                                  	# Mon code
                                  
                                  	for event in pygame.event.get():
                                  		if event.type == pygame.QUIT: 
                                  			done = True
                                  			
                                  		if key[pygame.K_ESCAPE]:
                                  			done = True
                                  
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    6 novembre 2011 à 14:45:49

                                    def numberincrement(buttonpressed):
                                    	if buttonpressed :
                                    		if buttonpressed == True :
                                    			pass
                                    		else :
                                    			if number == 5:
                                    				number =  1
                                    			else:
                                    				number = number + 1
                                    


                                    je traduits: si le bouton est pressé alors ne rien faire ...
                                    ça risque pas de marcher. Regardes le code que j'ai posté plus haut.

                                    dis exactement ce qu'il doit ce passer avec le joystick:
                                    - si le bouton est appuyé
                                    - si le bouton est maintenu
                                    - si le bouton est relâché
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Python c'est bon, mangez-en. 

                                      6 novembre 2011 à 18:46:33

                                      Pour être honnette je ne comprends rien à la manière dont on intercepte un evenement JOYBUTTONDOWN ou JOYBUTTONUP..
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        6 novembre 2011 à 19:11:20

                                        je n'ai plus de joystick pour tester mais ça doit être un truc du genre ...

                                        from pygame import *
                                        
                                        scr = display.set_mode((400,400))
                                        
                                        joystick.init()
                                        joystick.Joystick(0).init()
                                        
                                        while True:
                                            
                                            ev = event.wait()
                                            if ev.type == QUIT: break
                                            elif ev.type == JOYBUTTONDOWN and ev.joy == 0: print('button %i pressed'%ev.button)
                                            elif ev.type == JOYBUTTONUP and ev.joy == 0: print('button %i released'%ev.button)
                                        
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Python c'est bon, mangez-en. 

                                          6 novembre 2011 à 19:39:18

                                          Edit:
                                          Ca marche :) (je ne sais pas comment mais ca marche!)
                                          Merci
                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Collision en python

                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                          • Editeur
                                          • Markdown