Partage
  • Partager sur Facebook
  • Partager sur Twitter

détection de bloc

sous les pieds du perso en chute libre

Sujet résolu
    10 mars 2011 à 19:04:41

    Bonjour
    je ne savais pas où mettre ce topic, c'est de l'algo mais codé en Python ;)

    Mon problème est que je n'arrive pas trouver le bon algo qui me permettrais de détecter seulement les blocs situé sous mes pieds screenshot:

    http://www.casimages.com/img.php?i=110310075514735917.png

    si vous voulez le code je peux le donner mais c'est surtout un problème d'algo :p
    # -*- coding: cp1252 -*-
    
    
    import pygame
    from pygame.locals import *
    
    import random
    
    pygame.init()
    fenetre=pygame.display.set_mode((500,500))
    fond=pygame.Surface((500,500))
    fond.fill((255,255,255))
    fenetre.blit(fond,(0,0))
    
    x=200
    y=100
    
    viellepos=(x,y)
    
    continuer=True
    
    def rectangle(pos,w,h,couleur):
        rect=pygame.Surface((w,h))
        rect.fill(couleur)
        dico={"x":pos[0],"y":pos[1],"w":w,"h":h,"rect":rect,"couleur":couleur}
        return dico
    
    def perso(pos,w,h,couleur):
        rect=pygame.Surface((w,h))
        rect.fill(couleur)
        fenetre.blit(rect,pos)
    
    def cercle(pos,r,couleur):
        dico={"x":pos[0],"y":pos[1],"rayon":r,"couleur":couleur,"pos":pos}
        return dico
    
    
    def collision_rectangle(k,x,y):
    
            
            if k["x"] >= x + 10 or\
               k["x"] + k["w"] <= x or\
               k["y"] >= y + 10 or\
               k["y"] + k["h"] <= y:
                
                return True #Alors on a rencontré un mur
            else:
                return False
    
    def collision_rectanglebas(liste,x,y):
    
            liste2=[]
            for k in liste:
                
                if x + 10 >= k["x"] or\
                   x+10<= k["x"]+k["w"]or\
                   k["y"] >= y + 10:
                   
                    
                    liste2.append( k["y"]) #Alors on a rencontré un mur
                else:
                    return 500           
    
            return min(liste2)
    
    def collision_cercle(k,x,y):
        distance2=(x+5-k["x"])*(x+5-k["x"])+(y+5-k["y"])*(y+5-k["y"])
        distance1=(5+k["rayon"])*(5+k["rayon"])
    
        if distance2>distance1:
            return True
        else:
            return False
        
    
    def gravite(h,y):
        if y<=h-10.1:
            y+=0.1
        return y
    
    
    liste_rectangle=[]
    
    for k in range(0):
        a,b=random.randint(0,200), random.randint(0,500)
        couleur=(random.randint(0,255), random.randint(0,255),random.randint(0,255))
        h,w=random.randint(0,200), random.randint(0,200)
        liste_rectangle.append(rectangle((a,b),h,w,couleur))
        
    liste_rectangle.append(rectangle((0,490),500,10,(0,0,0)))
    liste_rectangle.append(rectangle((200,360),500,10,(0,0,0)))
    
    liste_disque=[]
    
    for k in range(0):
        pos=(random.randint(0,400), random.randint(0,500))
        couleur=(random.randint(0,255), random.randint(0,255),random.randint(0,255))
        rayon=random.randint(0,50)
        liste_disque.append(cercle(pos,rayon,couleur))
    
    pygame.key.set_repeat(400, 30)
    
    while continuer:
    
        #dialogue avec l'utilisateur
        
        for event in pygame.event.get():
            if event.type==QUIT:
                continuer=False
    ##        elif event.type==MOUSEMOTION:
    ##            fenetre.blit(fond,(0,0))
    ##            x,y=event.pos
                
            elif event.type==KEYDOWN:
                
    
                if event.key==K_w:
                    
                    y-=1
                    
                elif event.key==K_s:
                    
                    y+=1
                    
                elif event.key==K_a:
                    
                    x-=1
                    
                elif event.key==K_d:
                    x+=1
    
                elif event.key==K_ESCAPE:
                    continuer=False
    
                elif event.key==K_g:
    
                    print y
                    
                    collision_rectanglebas(liste_rectangle,x,y)
                    
    
        #cercle((100,100),100,(10,22,220))
        
        liste2=[]           
        for k in liste_rectangle:
            fond.blit(k["rect"],(k["x"],k["y"]))
    
            a=collision_rectangle(k,x,y)
            
               
            liste2.append(a)
    
        for k in liste_disque:
            pygame.draw.circle(fond,k["couleur"], k["pos"], k["rayon"])
    
            a=collision_cercle(k,x,y)
            liste2.append(a)
    
        for k in liste_rectangle:
            fond.blit(k["rect"],(k["x"],k["y"]))
    
            a=collision_rectangle(k,x,y)
               
            liste2.append(a)
            
    
        h=collision_rectanglebas(liste_rectangle,x,y)
        print h
        y=gravite(h,y)
    
        fenetre.blit(fond,(0,0))
    
        if False in liste2:
            couleur=(255,0,0)
            x,y=viellepos
    
                
        else:
            couleur=(0,255,0)
            viellepos=(x,y)
               
              
        
               
    
    
        perso((x,y),10,10,couleur)
                    
        
        pygame.display.flip()
    



    Merci à la personne qui me répondra :D
    • Partager sur Facebook
    • Partager sur Twitter
      10 mars 2011 à 19:35:21

      Upload autre part s'il te plait. On ne peux pas voir l'image
      • Partager sur Facebook
      • Partager sur Twitter
        10 mars 2011 à 19:43:05

        pourquoi moi ça fonctionne o_0
        • Partager sur Facebook
        • Partager sur Twitter
          10 mars 2011 à 19:44:38

          Normal, c'est une image utilisateur... met ton image sur nimporte quelle hébergeur et envois-la nous
          • Partager sur Facebook
          • Partager sur Twitter
            10 mars 2011 à 19:47:19

            tu connais quoi comme hébergeur?
            c'est bon
            • Partager sur Facebook
            • Partager sur Twitter
              10 mars 2011 à 19:52:57

              Par ailleur, poste ton code s'il te plait
              • Partager sur Facebook
              • Partager sur Twitter
                10 mars 2011 à 21:38:49

                J'ai compris pourquoi ça ne marchait pas mais je ne sais pas comment le résoudre mon problème:

                il prends la hauteur de tous les blocs et pas seulement ceux qui sont à son aplomb
                • Partager sur Facebook
                • Partager sur Twitter
                  11 mars 2011 à 0:38:14

                  Remplace tes "or" par des "and" dans collision_rectanglebas

                  ou sinon ...

                  # -*- coding: cp1252 -*-
                  
                  import pygame
                  from pygame.locals import *
                  
                  from random import randrange
                  
                  HEROS = [250,250,10,10,(0,255,0)]
                  L_ECRAN = 500
                  H_ECRAN = 500
                  
                  
                  class Programme():
                  
                      """ The Programme """
                  
                      def __init__(self):
                          """ constructeur """
                  
                          pygame.init()
                  
                          self.ecran = pygame.display.set_mode((L_ECRAN, H_ECRAN))
                          self.listeRectangle = RECTANGLES
                          self.heros = Rectangle(HEROS[0],HEROS[1],HEROS[2],HEROS[3],HEROS[4])
                  
                          self.continuer = True
                          pygame.key.set_repeat(400, 30)
                  
                  
                      def run(self):
                          """ boucle principale """
                  
                          while self.continuer:
                              self.event()
                              self.actualiser()
                              self.afficher()
                  
                          pygame.quit()
                  
                      def event(self):
                  
                          for event in pygame.event.get():
                              if event.type==QUIT:
                                  self.end()
                  
                              elif event.type==KEYDOWN:
                                  if event.key==K_UP: 
                                      self.heros.move(0,-1, self.listeRectangle)
                                  elif event.key==K_DOWN:  
                                      self.heros.move(0,1, self.listeRectangle)
                                  elif event.key==K_LEFT:
                                      self.heros.move(-1,0, self.listeRectangle)
                                  elif event.key==K_RIGHT:
                                      self.heros.move(1,0, self.listeRectangle)
                  
                              return True
                  
                  
                      def actualiser(self):
                          """ actualisation """
                          
                          # gravité
                          self.heros.move(0,0.0981, self.listeRectangle)
                  
                          return True
                  
                  
                      def afficher(self):
                          """ affichage """
                  
                          self.ecran.fill((0,0,0))
                  
                          for k in self.listeRectangle:
                              k.draw(self.ecran)
                          self.heros.draw(self.ecran)
                  
                          pygame.display.flip()
                          return True
                  
                      def end(self):
                          """ Fin """
                          self.continuer = False
                  
                  
                  class Rectangle():
                  
                      def __init__(self,x,y,w,h,couleur = (255,0,255)):
                          """ initialisation """
                          self.surface = pygame.Surface((w,h))
                          self.surface.fill(couleur)
                          self.x = x
                          self.y = y
                          self.w = w
                          self.h = h
                  
                      def draw(self, ecran):
                          """ draw """
                          ecran.blit(self.surface, (self.x,self.y))
                          return True
                  
                      def move(self, dx, dy, listeObstacle):
                          """ Bouger le rectangle """
                  
                          ok = []
                  
                          for k in listeObstacle:
                              ok.append(inbox(self.x + dx, self.y + dy, self.h, self.w, k.x, k.y, k.h, k.w))
                  
                          if not(True in ok):
                              self.x += dx
                              self.y += dy
                  
                  
                  ##Autres fonctions
                  
                  
                  def inbox(x1, y1, h1, w1, x2, y2, h2, w2):
                  
                      if x1 + w1 > x2 and x1 < x2 + w2\
                         and y1 + h1 > y2 and y1 < y2 + h2:
                          return True
                  
                      else:
                          return False
                  
                  NB_RECTANGLES = 15
                  RECTANGLES = [Rectangle(0, 490, 500, 10)]
                  for k in range(NB_RECTANGLES):
                      RECTANGLES.append(Rectangle(randrange(0,500), randrange(0,500), randrange(0,200), randrange(0,50),(randrange(0,255), randrange(0,255), randrange(0,255))))
                  
                  lol = Programme()
                  lol.run()
                  
                  • Partager sur Facebook
                  • Partager sur Twitter

                  détection de bloc

                  × 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