Erreur lors d'une execution [Résolu]

Messages postés
49
Date d'inscription
mardi 10 mai 2016
Statut
Membre
Dernière intervention
1 septembre 2019
-
Bonjour, lorsque j'essaye de lancer mon jeu en python j'ai un message d'erreur : "TypeError: draw() missing 1 required positional argument: 'win' "...
Pouvez-vous m'aider ? Merci.

Le code :
import pygame 
import neat
import time 
import os 
import random 

WIN_WIDTH = 500
WIN_HEIGHT = 800

BIRD_IMGS = [pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird1.png"))), pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird2.png"))), pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird3.png")))]
PIPE_IMG = pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "pipe.png")))
BASE_IMG = pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "base.png")))
BG_IMG = pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bg.png")))

class Bird:
 IMGS = BIRD_IMGS
 MAX_ROTATION = 25
 ROT_VEL = 20
 ANIMATION_TIME = 5

 def __init__(self, x, y):
  self.x = y
  self.y = y
  self.tilt = 0
  self.tick_count = 0
  self.vel = 0
  self.height = self.y
  self.img_count = 0
  self.img = self.IMGS[0]


 def jump(self):
  self.vel = -10.5
  self.tick_count = 0
  self.height = self.y

 def move(self):
  self.tick_count += 1

  d = self.vel*self.tick_count + 1.5*self.tick_count**2

  if d >= 16:
   d = 16

  if d < 0:
   d -= 2


  self.y = self.y + d


  if d < 0 or self.y < self.height + 50:
   if self.tilt < self.MAX_ROTATION:
    self.tilt = self.MAX_ROTATION
  else:
   if self.tilt > -90:
    self.tilt -= self.ROT_VEL

 def draw(self, win):
  self.img_count +=1 

  if self.img_count < self.ANIMATION_TIME:
   self.img = self.IMGS[0]
  elif self.img_count < self.ANIMATION_TIME*2:
   self.img = self.IMGS[1]
  elif self.img_count < self.ANIMATION_TIME*3:
   self.img = self.IMGS[2]
  elif self.img_count < self.ANIMATION_TIME*4:
   self.img = self.IMGS[1]
  elif self.img_count == self.ANIMATION_TIME*4 + 1:
   self.img = self.IMGS[0]
   self.img_count = 0

  if self.tilt <= -80:
   self.img = self.IMGS[1]
   self.img_count = self.ANIMATION_TIME*2

  rotated_image = pygame.transform.rotate(self.img, self.tilt)
  new_rect = rotated_image.get_rect(center=self.img.get_rect(topleft = (self.x, self.y)).center)
  win.blit(rotated_image, new_rect.topleft)

 def get_mask(self):
  return pygame.mask.from_surface(self.img)

class Pipe:
 GAP = 200
 VEL = 5

 def __init__(self, x):
  self.x = x
  self.height = 0
  self.gap = 100

  self.top = 0
  self.bottom = 0
  self.PIPE_TOP = pygame.transform.flip(PIPE_IMG, False, True)
  self.PIPE_BOTTOM = PIPE_IMG

  self.passed = False 
  self.set_height()

 def set_height(self):
  self.height = random.randrange(50, 450)
  self.top = self.height - self.PIPE_TOP.get_height()
  self.bottom = self.height + self.GAP

 def move(self):
  self.x -= self.VEL

 def draw(self, win):
  win.blit(self.PIPE_TOP, (self.x, self.top))
  win.blit(self.PIPE_BOTTOM, (self.x, self.bottom))

 def collide(self, bird):
  bird_mask = bird.get_mask()
  top_mask = pygame.mask.from_surface(self.PIPE_TOP)
  bottom_mask = pygame.mask.from_surface(self.PIPE_BOTTOM)

  top_offset = (self.x - bird.x, self.top - round(bird.y))
  bottom_offset = (self.x - bird.x, self.bottom - round(bird.y))

  b_point = bird_mask.overlap(bottom_mask, bottom_offset)
  t_point = bird_mask.overlap(top_mask, top_offset)

  if t_point or b_point:
   return True

  return False

class Base:
 VEL = 5
 WIDTH = BASE_IMG.get_width()
 IMG = BASE_IMG

 def __init__(self, y):
  self.y = y
  self.x1 = 0
  self.x2 = self.WIDTH

 def move(self):
  self.x1 -= self.VEL
  self.x2 -= self.VEL

  if self.x1 + self.WIDTH < 0:
   self.x1 = self.x2 + self.WIDTH

  if self.x2 + self.WIDTH < 0:
   self.x2 = self.x1 + self.WIDTH

 def draw(self, win):
  win.blit(self.IMG, (self.x1, self.y))
  win.blit(self.IMG, (self.x2, self.y))

def draw_window(win, bird, pipes, base):
 win.blit(BG_IMG, (0,0))

 for pipe in pipes:
  pipe.draw()

 base.draw(win)

 bird.draw(win)
 pygame.display.update()


def main():
 bird = Bird(230,350)
 base = Base(730)
 pipes = [Pipe(700)]
 win = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
 clock = pygame.time.Clock()


 run = True
 while run:
  clock.tick(30)
  for event in pygame.event.get():
   if event.type == pygame.QUIT:
    run = False

  bird.move()
  draw_window (win, bird, pipes, base)

 pygame.quit()
 quit()


main()
Afficher la suite 

1 réponse

Meilleure réponse
Messages postés
8551
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 septembre 2019
424
1
Merci
bonjour, il est souvent utile d'indiquer à quelle ligne de code une erreur se produit.
as-tu vérifié que tes appels à draw() sont compatibles avec ta définition de draw()?

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 60022 internautes nous ont dit merci ce mois-ci

yg_be
Messages postés
8551
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 septembre 2019
424 > thomaseight
Messages postés
49
Date d'inscription
mardi 10 mai 2016
Statut
Membre
Dernière intervention
1 septembre 2019
-
parfait, peux-tu alors marquer le sujet comme résolu?
thomaseight
Messages postés
49
Date d'inscription
mardi 10 mai 2016
Statut
Membre
Dernière intervention
1 septembre 2019
-
Je crois qu'il y a eu un bug... as-tu vu mon message posté à 11:32 ?
thomaseight
Messages postés
49
Date d'inscription
mardi 10 mai 2016
Statut
Membre
Dernière intervention
1 septembre 2019
-
Oui. Mais j'ai encore deux questions :
-Comment on fait pour t'ajouter un merci ?
-Et une autre question sur ce code. Mais est ce que je dois créer un nouveau sujet ?
yg_be
Messages postés
8551
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 septembre 2019
424 > thomaseight
Messages postés
49
Date d'inscription
mardi 10 mai 2016
Statut
Membre
Dernière intervention
1 septembre 2019
-
tu m'as écris merci, c'est parfait ainsi! il y a sans doute un bouton "merci", avec une poignée de mains, au niveau des réponses principales, pas au niveau des discussions secondaires.
préférable de créer un nouveau sujet, c'est souvent plus clair et cela permet aussi à d'autres de s'impliquer. le forum est flexible, à toi de décider.
thomaseight
Messages postés
49
Date d'inscription
mardi 10 mai 2016
Statut
Membre
Dernière intervention
1 septembre 2019
-
Je t'ai ajouté un merci. Au revoir.
Commenter la réponse de yg_be