IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation multimédia/Jeux Python Discussion :

[PyGame]Problème de classe


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Juin 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut [PyGame]Problème de classe
    Salut à tous !

    J'avais commencé à coder un Snake avec PyGame en code fonctionnel, mais j'ai été choqué par le nombre de variables globales que je me voyais contraint d'utiliser, et j'ai donc commencé à transposer mon code en code orienté objet.

    Je croyais avoir fini, mais je me suis retrouvé devant un beau plantage et un message d'erreur (mis en évidence avec IDLE) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    input() take exactly 1 argument (2 given)
    Euh... non, je n'en ai donné qu'un... Bon, je rajoute une deuxième possibilité d'argument dans la fonction ("abc", [1], None, nil, etc...) et là ça met :

    [CODE]Snake object is not iterable[CODE]

    Argh ! Malheur et damnation, j'ai cherché avec passion, sans trouver la solution... ( !)

    Je vous donne donc mon code, en espérant que vous trouviez le problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    import pygame, sys,os
    from pygame.locals import * 
     
    #----------------------------------CLASSES---------------------------------#
     
    class Snake(object):
    	x, y = 76, 76
    	isUp, isDown, isRight, isLeft = False, False, True, False
    	lastDir = 'right'
    	last_time = 0
     
    	def __init__(self):
    		pygame.init() 
     
    		window = pygame.display.set_mode((400, 400), HWSURFACE | DOUBLEBUF)
    		pygame.display.set_caption('PySnake') 
    		screen = pygame.display.get_surface() 
     
    		tete_url = os.path.join("tete.bmp") 
    		bloc_url = os.path.join("bloc.bmp") 
    		tete = pygame.image.load(tete_url) 
    		bloc = pygame.image.load(bloc_url) 
     
    		pygame.key.set_repeat(10, 10) 
     
    		self.blit
     
    	def input(events):
    		time = pygame.time.get_ticks() 
     
    		for event in events: 
    			if event.type == QUIT: 
    				sys.exit(0) 
    			elif event.type == KEYDOWN:
    				if event.key == K_RIGHT and lastDir != 'left':
    					isUp, isDown, isRight, isLeft = False, False, True, False
    					lastDir = 'right'
    				elif event.key == K_LEFT and lastDir != 'right':
    					isUp, isDown, isRight, isLeft = False, False, False, True
    					lastDir = 'left'
    				elif event.key == K_UP and lastDir != 'down':
    					isUp, isDown, isRight, isLeft = True, False, False, False
    					lastDir = 'up'
    				elif event.key == K_DOWN and lastDir != 'up':
    					isUp, isDown, isRight, isLeft = False, True, False, False
    					lastDir = 'down'
     
    		if time - last_time >= 75: 
    			if isUp: y -= 10
    			if isDown: y += 10
    			if isRight: x += 10
    			if isLeft : x -= 10
    			last_time = time 
     
    	def borders_verify(self):
    		global x, y
    		if x >= 400 - 10: x -= 10
    		elif x <= 0: x += 10
    		elif y >= 400 - 10: y -= 10
    		elif y <= 0: y += 10
     
    	def blit(self):
    		screen.fill((0,0,0)) 
    		borders_verify() 
    		screen.blit(tete, (x,y)) 
     
    		pygame.display.flip() 
     
    #----------------------------MAIN--------------------------------#
     
    snake = Snake()
     
    while True: 
    	snake.input(pygame.event.get()) 
    	snake.borders_verify()
    	snake.blit()
    Merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    tu en avait en fait donné 2 ( snake.input(pygame.event.get()) : snake et pygame.event.get()
    => i lfaut change la définition de input

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def input(self, events):

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Guigui_
    tu en avait en fait donné 2 ( snake.input(pygame.event.get()) : snake et pygame.event.get()
    => i lfaut change la définition de input

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def input(self, events):
    Hum ok ! Donc lorsque l'on applique une méthode à un objet, cet objet est en fait passé en 1° paramètre à la méthode (qu'est-ce qui est passé en fait ? une référence sur cet objet ?), d'où la présence obligatoire du mot clé self lors de la définition des méthodes, c'est bien ça ?

  4. #4
    Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Juin 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut
    Merci beaucoup pour ton aide !

    J'avais en effet pensé à cela, mais j'avais mis self en second argument, donc c'est self que la fonction tentait d'itérer, d'où l'erreur :
    "Snake object is not iterable"

    Maintenant, j'ai quelques problèmes avec ma variable last_time (variable locale déjà réferencée avant assignement, un truc comme ça), mais je devrais m'en tirer tout seul...

    Encore merci Guigui !

Discussions similaires

  1. Problème de classe.
    Par maminova77 dans le forum Langage
    Réponses: 5
    Dernier message: 30/01/2006, 21h39
  2. Problème sur classe Transformer avec les <!--
    Par tykool dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 10/01/2006, 10h20
  3. Problème de classe
    Par DeusXL dans le forum DirectX
    Réponses: 15
    Dernier message: 04/12/2005, 14h37
  4. Problème de classe
    Par tidou dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 14/10/2005, 17h49
  5. [FLASH MX2004] Problème de classe
    Par JulPoWeR dans le forum Flash
    Réponses: 1
    Dernier message: 10/07/2005, 22h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo