Partage
  • Partager sur Facebook
  • Partager sur Twitter

La Class Sprite - Utilisation

    3 mars 2011 à 12:18:21

    Bonjour, j'ai quelque soucis pour un jeu que j'aimerais développer, est-ce que quelqu'un pourrait m'expliquer simplement, comment s'utilise la class sprite.
    Le jeu est Pong, il parait que cette class pourrait m'aider dans les collisions entre la balle, le mur, et les raquettes, et également là où je coince en ce moment, les mouvements simultanés des objets du jeu.

    Merci d'avance.

    Adivix.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      3 mars 2011 à 13:00:16

      Je suppose que tu parles de pygame. Mais je ne connais pas pygame, en tout cas pas à un très haut niveau, mais j'ai vu la méthode pygame.sprite.spritecollide.

      Ça détecte les collisions apparemment, mais il y a des spécialistes ici de pygame, ils t'aideront mieux que moi.
      • Partager sur Facebook
      • Partager sur Twitter
        5 mars 2011 à 13:15:54

        Je suis pas un spécialiste de pygame, mais il faut voir la classe Sprite comme une architecture basique dont tu as besoin pour construire ton (tes) propre sprites.
        C'est un peu comme les ingrédient d'une recette. Tu as des tous les ingrédients de bases pour faire un gâteau par exemple: des œufs, de la farine, du lait etc. Mais la préparation du gâteau en lui même, c'est toi qui la fait. Tu écris la recette en quelque sorte. C'est toi qui choisie le nombre d'œufs, la masse de farine etc. C'est aussi toi qui choisi comment tu vas les ajouter: les œufs d'abord? Où plutôt la farine? Le temps de cuisson?

        Exemple:

        # On se base sur la classe Sprite déjà existante dans pygame
        classe MonSpriteAMoi(pygame.sprite.Sprite):
            # On initialise notre classe
            def __init__(self):
            # On appelle le constructeur de la classe pyagme.sprite.Sprite
            # comme ça on l'initialise proprement
                pygame.sprite.Sprite.__init__(self)
                # On crée le sprite image
                self.image=pyagme.Surface((25,25))
                # On le remplie avec une couleur
                self.image.fill((255,0,0))
        


        • Partager sur Facebook
        • Partager sur Twitter
          5 mars 2011 à 17:14:12

          la class Sprite() je ne m'y suis jamais attardé, et pour un pong je pense que tu peux t'en passer; maintenant la connaitre ce n'est que mieux, perso je code mes sprites moi-même.
          Je crois que la doc pygame indique que c'est optionnel ...
          • Partager sur Facebook
          • Partager sur Twitter

          Python c'est bon, mangez-en. 

            7 mars 2011 à 4:42:24

            C'est clairement optionnel, mais tout le contenu du module Sprite définit un pattern qui est assez commode à utiliser quand on veut compliquer la donne.

            Là pour un pong, en revanche, c'est un peu overkill (ça n'a que l'intérêt de découvrir le module, quoi, et encore ça permet pas de bien se rendre compte de son utilité vu que le cas est plutôt simple).
            • Partager sur Facebook
            • Partager sur Twitter
            Zeste de Savoir, le site qui en a dans le citron !
              18 mars 2011 à 8:58:57

              class Raquette :
                 def __init__(self, pos, nom):
                    self.position = pos
                    self.nom = nom
              		
              		if self.position == "G":
              			self.x = 3
              			self.y = 0
              			self.img = "./objets/player1.png"
              		elif self.position == "D":
              			self.x = 620
              			self.y = 0
              			self.img = "./objets/player2.png"
              		self.perso = pygame.image.load(self.img).convert()
              		
              	def affiche(self, fen):
              		fen.blit(self.perso, (self.x,self.y))
              		
              	def bas(self):
              		if self.y < 300 :
              			#On descend le perso
              			self.y = self.y + 4
              
              	def haut(self):
              		if self.y > 0 :
              			#On monte le perso
              			self.y = self.y - 4
              

              Voilà mon code pour les raquettes, et je me pose la question de savoir où je dois intégrer la class Sprite pour pouvoir parvenir à des collisions avec une balle.
              • Partager sur Facebook
              • Partager sur Twitter
                18 mars 2011 à 12:26:03

                Le message qui suit est une réponse automatique activée par un modérateur.
                Les réponses automatiques permettent d'éviter aux modérateurs d'avoir à répéter de nombreuses fois la même chose, et donc de leur faire gagner beaucoup de temps.
                Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter le modérateur en question par MP.


                Merci d'utiliser les balises de code


                Bonjour,

                Les forums du Site du Zér0 disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source.
                Vous avez posté un code source sans utiliser cette fonctionnalité. Pourriez-vous éditer votre message afin d'ajouter ces balises ? Pour cela, sélectionnez votre code à colorer et utilisez le bouton Image utilisateur afin de choisir la coloration adaptée. Veillez à bien choisir le langage de programmation afin que la coloration soit pertinente.

                De plus, veillez à ce que votre code soit correctement indenté.

                Afin de ne pas surcharger le sujet, ne postez pas votre code coloré dans un nouveau message mais éditez le premier (grâce au bouton Image utilisateur).

                Cela aura pour effet de "colorer" votre code et donc d'en faciliter grandement la lecture. Vous aurez ainsi beaucoup plus de chances d'avoir des réponses.

                Voici un exemple de code non coloré (mauvais exemple) :

                int main(int argc, char *argv[])
                {
                long choixOperation;

                printf("Choisissez l'operation a effectuer");
                /* etc. */
                }

                Voici maintenant le même code coloré, utilisant la balise "code" (bon exemple) :

                int main(int argc, char *argv[])
                {
                    long choixOperation;
                
                    printf("Choisissez l'operation a effectuer");
                    /* etc. */
                }
                


                C'est plus clair n'est-ce pas ? ;)

                Plus d'informations à ce sujet.

                Merci de votre compréhension. :)
                Les modérateurs.
                • Partager sur Facebook
                • Partager sur Twitter
                Zeste de Savoir, le site qui en a dans le citron !
                  28 avril 2011 à 12:12:55

                  J'hésite à utiliser les "threads" pour mon programme. Pensez-vous que cela est une bonne idée?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 avril 2011 à 12:20:55

                    en générale on peut s'en passer ... tu comptes threader quelle fonction ?
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Python c'est bon, mangez-en. 

                      28 avril 2011 à 12:41:14

                      Je comptais "threader" la fonction Balle(), car j'ai entendu que ça pouvait m'aider pour pouvoir faire bouger les raquettes en même temps que la balle bouge.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 avril 2011 à 7:31:37

                        Pas besoin de thread.
                        Une fois j'ai codé un pong uniquement avec Tkinter et sans POO :-°
                        Donc avec les threads tu vas plus te casser la tête qu'autre chose...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 avril 2011 à 8:42:49

                          En fait je dois code sur Geany, en utilisant Pygame. J'ai des restrictions pour mon programme. Et là,je suis surtout en train de galérer à codé en intégrant les Sprite(). J'ai mes 2 raquettes qui bougent, mais pas simultanément.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            29 avril 2011 à 9:07:28

                            Et si tu nous montrais ton code? ;)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              2 mai 2011 à 14:08:15

                              #Importation des bibliotheques necessaires
                              import pygame
                              import math
                              
                              from pygame.locals import *
                              
                              #Initialisation de la bibliotheque Pygame
                              pygame.init()
                              pygame.key.set_repeat(100,15)
                              
                              #Creation de la fenetre
                              fenetre = pygame.display.set_mode((640, 400))
                              fond = pygame.image.load("./objets/terrain.jpg").convert()
                              fenetre.blit(fond, (0,0))
                              
                              class Raquette(pygame.sprite.Sprite) :
                              	def __init__(self, pos, nom):
                              		pygame.sprite.Sprite.__init__(self)
                              		self.position = pos
                              		self.nom = nom
                              
                              		if self.position == "G":
                              			self.x = 3
                              			self.y = 0
                              			self.img = "./objets/player1.png"
                              		elif self.position == "D":
                              			self.x = 620
                              			self.y = 0
                              			self.img = "./objets/player2.png"
                              		self.perso = pygame.image.load(self.img).convert()
                              
                              	def affiche(self, fen):
                              		fen.blit(self.perso, (self.x,self.y))
                              
                              	def bas(self):
                              		if self.y < 300 :
                              			#On descend le perso
                              			self.y = self.y + 6
                              
                              	def haut(self):
                              		if self.y > 0 :
                              			#On monte le perso
                              			self.y = self.y - 6
                              
                              class Ball(pygame.sprite.Sprite):
                              	def __init__(self):
                              		pygame.sprite.Sprite.__init__(self)
                              		self.img = "./objets/balle.png"
                              		self.speed = [1,1]
                              		
                              		self.x = 300
                              		self.y = 190
                              
                              		self.perso = pygame.image.load(self.img).convert_alpha()
                              		self.carre = self.perso.get_rect()
                              
                              	def affiche(self,fen):
                              		fen.blit(self.perso, (self.x,self.y))
                              
                              	def move(self):
                              		self.carre = self.carre.move(speed) 
                              		if self.carre.left < 0 or self.carre.right > 640:
                              				self.speed[0] = -self.speed[0]
                              				
                              		if self.carre.top < 0 or self.carre.bottom > 400:
                              				self.speed[1] = -self.speed[1]
                              		
                              raqG = Raquette("G", "pouet")
                              raqG.affiche(fenetre)
                              
                              raqD = Raquette("D", "plop")
                              raqD.affiche(fenetre)
                              
                              balle = Ball()
                              balle.affiche(fenetre)
                              
                              #Rafraichissement de l'ecran
                              pygame.display.flip()
                              
                              
                              #Boucle infinie
                              continuer = 1
                              while continuer:
                              
                              
                              	for event in pygame.event.get():
                              
                              		if event.type == KEYDOWN:
                              			if event.key == K_b:	#Si "touche b"
                              				balle.move()
                              				
                              
                              			if event.key == K_s:	#Si "touche s"
                              				raqG.bas()
                              				#Re-collage par defaut des images afin de ne pas
                              				#les faire disparaitre
                              				fenetre.blit(fond, (0,0))
                              
                              				raqG.affiche(fenetre)
                              				raqD.affiche(fenetre)
                              				balle.affiche(fenetre)
                              
                              			elif event.key == K_z:  #Si "touche z"
                              				#On monte le perso
                              				raqG.haut()
                              				#Re-collage
                              				fenetre.blit(fond, (0,0))
                              
                              				raqG.affiche(fenetre)
                              				raqD.affiche(fenetre)
                              				balle.affiche(fenetre)
                              
                              			elif event.key == K_DOWN:   #Si "fleche bas"
                              				#On descend le perso
                              				raqD.bas()
                              				#Re-collage
                              				fenetre.blit(fond, (0,0))
                              
                              				raqG.affiche(fenetre)
                              				raqD.affiche(fenetre)
                              				balle.affiche(fenetre)
                              
                              			elif event.key == K_UP: #Si "touche z"
                              				#Le perso remonte
                              				raqD.haut()
                              				#Re-collage
                              				fenetre.blit(fond, (0,0))
                              
                              				raqG.affiche(fenetre)
                              				raqD.affiche(fenetre)
                              				balle.affiche(fenetre)
                              
                              			elif event.key == K_ESCAPE:
                              				continuer = 0
                              
                              	#Rafraichissement
                              	pygame.display.flip()
                              
                              • Partager sur Facebook
                              • Partager sur Twitter
                                2 mai 2011 à 14:41:59

                                Bonjour

                                En gros ta boucle principale doit ressembler à quelque chose dans ce genre

                                while true
                                    gestion des évènements
                                    update
                                    affichage

                                En suivant cette structure, ton code ressemble à

                                while continuer:
                                    for event in pygame.event.get():
                                        if event.type == KEYDOWN:
                                            if event.key == K_s:	
                                               raqG.bas()
                                           elif event.key == K_z:  
                                               raqG.haut()
                                           elif ...
                                               ...
                                    fenetre.blit(fond, (0,0))
                                    raqG.affiche(fenetre)
                                    raqD.affiche(fenetre)
                                    balle.affiche(fenetre)
                                
                                    pygame.display.flip()
                                


                                • Partager sur Facebook
                                • Partager sur Twitter
                                Zeste de Savoir, le site qui en a dans le citron !
                                  12 mai 2011 à 12:20:49

                                  def move(self):
                                  		pygame.time.Clock().tick(60)
                                  		i = 0
                                  		while i < 9 :
                                  			if self.carre.left < 0 or self.carre.right > 640:
                                  					self.speed[0] = -self.speed[0]
                                  					
                                  			if self.carre.top < 0 or self.carre.bottom > 400:
                                  					self.speed[1] = -self.speed[1]
                                  		
                                  			self.carre = self.carre.move(self.speed)
                                  			i = i + 1
                                  	
                                  	def collision(self, obj):
                                  		if self.carre.colliderect(raqG.rect()[0]) == 1 :
                                  			self.speed[0] = -self.speed[0]
                                  		elif self.carre.colliderect(raqD.rect()[1]) == 1:
                                  			self.speed[0] = -self.speed[0]
                                  


                                  J'ai rajouter ceci à mon code, et cela me permet de faire bouger ma balle, et une raquette en même temps. La balle rentre evidemment en collision avec murs, mais je ne comprend pas pourquoi elle ne rentre pas en collision avec les raquettes...
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  La Class Sprite - Utilisation

                                  × 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