![](/img/trans.png)
[英]Python is there a difference calling a method from super, or from the class
[英]Python calling method from super class via child class not working as expected
我在Ball
類中擴展了pygame.Rect
。 當我使用nstanceOfBall.colliderect()
(第66行)時,不會引發任何錯誤,但它永遠不會返回true。 關於為何colliderect
無法在我的Ball實例上工作的任何見解?
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 = []
for 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:
for 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()
for ball in balls:
ball.runLogic()
for 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)
for ball in balls:
screen.blit(image, ball)
pygame.display.flip()
pygame.time.wait(33-(pygame.time.get_ticks()-lastFrameStartTime))
lastFrameStartTime=pygame.time.get_ticks()
在Ball.init中使用super(Ball,self)代替super(pygame.Rect,self)可以解決問題。
謝謝。
super
的第一個要素必須是當前類,即Ball
而不是pygame.Rect
:
class Ball(pygame.Rect):
def __init__(self, x, y, width, height, screenWidth, screenHeight):
super(Ball, self).__init__(x, y, width, height)
...
super
的要點是,它允許您按繼承順序調用下一個方法,而無需您顯式引用父類。 使用多重繼承時,這很方便,例如參見超級混淆python多重繼承super()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.