inheritance - Python calling method from super class via child class not working as expected -


i have extended pygame.rect ball class. when use nstanceofball.colliderect() (line 66), no errors thrown, yet never returns true. insight why colliderect isn't working ball instances?

    import sys, pygame     import os     import ball     import random     import math     #from ball import ball      ###############################################################################################      class ball(pygame.rect):         def __init__(self, x, y, width, height, screenwidth, screenheight):             super(pygame.rect,self).__init__(x, y, width, height)             self.floatx=x             self.floaty=x             self.screenwidth=screenwidth             self.screenheight=screenheight             self.speed=[random.random()*5-2.5, random.random()*5-2.5]          def runlogic(self):             self.floatx+=self.speed[0]             self.floaty+=self.speed[1]              if self.floatx+16<0: self.floatx=self.screenwidth             if self.floatx>self.screenwidth: self.floatx=-16             if self.floaty+16<0: self.floaty=self.screenheight             if self.floaty>self.screenheight: self.floaty=-16              self.x=self.floatx             self.y=self.floaty      ###############################################################################################      os.environ['sdl_video_window_pos'] = "%d,%d" % (700, 200)#1680,1440)      pygame.init()      size = width, height = 320, 240     white = 255, 255, 255     blue=0,0,255      screen = pygame.display.set_mode(size)      image = pygame.image.load("ball.png")     ballrect=image.get_rect()     balls = []      x in range(0, 100):         balls.append(ball(random.random()*width, random.random()*height, ballrect.width, ballrect.height, width, height))      lastframestarttime=pygame.time.get_ticks()      while 1:         event in pygame.event.get():             if event.type == pygame.quit:                  sys.exit()              if event.type == pygame.keydown:                 if event.key == pygame.k_escape:                     sys.exit()          ball in balls:             ball.runlogic()              ball2 in balls:                 if ball != ball2:                                     if ball.colliderect(ball2):                         print("collision detected!")                         balls.pop(balls.index(ball))                         balls.pop(balls.index(ball2))                         #balls.remove(ball2)          screen.fill(blue)         ball in balls:             screen.blit(image, ball)         pygame.display.flip()          pygame.time.wait(33-(pygame.time.get_ticks()-lastframestarttime))         lastframestarttime=pygame.time.get_ticks() 

using super(ball, self) instead of super(pygame.rect, self) in ball.init did trick.

thank you.

the first arument super must current class, i.e. ball instead of pygame.rect:

class ball(pygame.rect):     def __init__(self, x, y, width, height, screenwidth, screenheight):         super(ball, self).__init__(x, y, width, height)         ... 

there example in documentation on super.

the point of super allows call next method in inheritance order without requiring refer parent class explicitly. comes handy when using multiple inheritance, see e.g. super confusing python multiple inheritance super()


Comments

Popular posts from this blog

c# - Send Image in Json : 400 Bad request -

javascript - addthis share facebook and google+ url -

ios - Show keyboard with UITextField in the input accessory view -