检测碰撞错误提示我有9个参数,而实际上只有8个。

5 浏览
0 Comments

检测碰撞错误提示我有9个参数,而实际上只有8个。

这个问题已经有了答案

“TypeError: method() takes 1 positional argument but 2 were given”但我只传递了一个

它说我有9个参数,但我只数了8个。我该怎么办?

错误信息

File Name   Line    Position    
Traceback               
        C:\Python34\2d\main.py  1       
    update  C:\Python34\2d\main.py  53      
TypeError: detectCollisions() takes 8 positional arguments but 9 were given 

这是我的代码

import pygame
pygame.init()
screen = pygame.display.set_mode((800,600))
pygame.display.set_caption("use arrows")
class player:
def __init__(self ,x, y):
    self.x = x
    self.y = y
    self.width = 32
    self.height = 32
    self.velocity = 0
    self.falling = False
    self.onGround = False
def detectCollisions(x1,y1,w1,h1,x2,y2,w2,h2):
    if (x2+w2>=x1>=x2 and y2+h2>=y1>=y2):
        return True
    elif (x2+w2>=x1+w1>=x2 and y2+h2>=y1>=y2):
        return True
    elif (x2+w2>=x1>=x2 and y2+h2>=y1+h1>=y2):
        return True
    elif (x2+w2>=x1+w1>=x2 and y2+h2>=y1+h1>=y2):
        return True
    else:
        return False
def update(self, gravity, blockList):
    if (self.velocity < 0):
        self.falling = True
    collision = False
    blockX,blockY =  0,0
    for block in blockList:
        collision = self.detectCollisions(self.x, self.y, self.width, self.height, block.x, block.y, block.width, block.height)
        if(collision == True):
            (self.falling == True)
            self.falling == False
            self.onGround== True
            self.velocity = 0
    if(self,onGround == False):
        self.velocity += gravity
    self.y -= self.velocity
def render(self,screen):
    pygame.draw.rect(screen,(0,0,0),(self.x, self.y, self.width, self.height))
class Block:
def __init__ (self, x, y):
   self.x = x
   self.y = y
   self.width = 32
   self.height = 32
def render(self,screen):
    pygame.draw.rect(screen,(0,0,0),(self.x, self.y, self.width, self.height))
gravity = -0.5
black = (0,0,0)
white = (255,255,255)
blue = (50,60,200)
clock = pygame.time.Clock()
player = player(0,0)
# 25 colums and 19 rows
level1 = [
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
]
blockList = []
for y in range (0,len(level1)):
    for x in range (0,len(level1[y])):
        if (level1[y][x] == 1):
            blockList.append(Block(x*32, y*32))
gameloop = True
while gameloop:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            gameloop = False
    screen.fill(blue)
    for block in blockList:
        block.render(screen)
    player.update(gravity, blockList)
    player.render(screen)
    clock.tick(60)
    pygame.display.update()
pygame.quit()

admin 更改状态以发布 2023年5月21日
0
0 Comments

你只是忘记把 self 作为函数 detectCollisions 的一个参数了。只需像在 update(self, gravity, blockList) 中一样将其作为第一个参数添加即可。这是因为 detectCollisions 是一个类方法而不是普通函数。

更多关于函数和类方法的区别以及为什么需要 self 的详细信息,请参见 这个问题

0