1

It says I have 9 arguments but I only count 8. How do I fix this?

ERROR MESSAGE

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

and this is my code

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()
davidism
  • 121,510
  • 29
  • 395
  • 339
GeeZillion
  • 43
  • 8

1 Answers1

3

You simply forgot to include self as an argument to the function detectCollisions. Just add it as the first argument, as you have done with update(self, gravity, blockList) and you'll be fine. The reason for this is that detectCollisions is a class method and not a regular function.

See this question for more details about the difference between functions and class methods and why you need the self.

Community
  • 1
  • 1
Zhewriix
  • 148
  • 10
  • can you give me an example because i really dont know what you mean, im sorry ive been up for house making this and im sure tired and need to fix it before i go to bed – GeeZillion Oct 05 '15 at 02:17
  • i had self in the decetctCollisions the whole time http://prntscr.com/8nuhkf even look at the code – GeeZillion Oct 05 '15 at 02:22
  • I meant when you def'ed `detectCollisions`. So the line `def detectCollisions(x1,y1,w1,h1,x2,y2,w2,h2):` should be changed to `def detectCollisions(self,x1,y1,w1,h1,x2,y2,w2,h2):` – Zhewriix Oct 05 '15 at 03:49