0

This is a function I made to draw pipes in an angry birds knockoff I made:

def drawPipes():
#Pipes 1
    if pipes1 == 1:
        topPipe1Y =300
        botPipe1Y =400
        screen.blit( topL, ( col1X, 0))
        screen.blit( botS, ( col1X, 400)) <-----This part keeps getting the error.

    elif pipes1 == 2:
        topPipe1Y = 200
        botPipe1Y = 300
        screen.blit( topM, ( col1X, 0))
        screen.blit( botM, ( col1X, 300)) <-----This part keeps getting the error.

    elif pipes1 == 3:
        topPipe1Y = 100
        botPipe1Y = 200
        screen.blit( topS, ( col1X, 0))
        screen.blit( botL, ( col1X, 200)) <-----This part keeps getting the error.

#Pipes 2
    if pipes2 == 1:
        topPipe2Y =300
        botPipe2Y =400
        screen.blit( topL, ( col2X, 0))
        screen.blit( botS, ( col2X, 400)) <-----This part keeps getting the error.

    elif pipes2 == 2:
        topPipe2Y =200
        botPipe2Y =300
        screen.blit( topM, ( col2X, 0))
        screen.blit( botM, ( col2X, 300)) <-----This part keeps getting the error.

    elif pipes2 == 3:
        topPipe2Y =100
        botPipe2Y =200
        screen.blit( topS, ( col2X, 0))
        screen.blit( botL, ( col2X, 200)) <-----This part keeps getting the error.

#Pipes 3
    if pipes3 == 1:
        topPipe2Y =300
        botPipe2Y =400
        screen.blit( topL, ( col3X, 0))
        screen.blit( botS, ( col3X, 400)) <-----This part keeps getting the error.

    elif pipes3 == 2:
        topPipe2Y =200
        botPipe2Y =300
        screen.blit( topM, ( col3X, 0))
        screen.blit( botM, ( col3X, 300)) <-----This part keeps getting the error.

    elif pipes3 == 3:
        topPipe2Y =100
        botPipe2Y =200
        screen.blit( topS, ( col3X, 0))
        screen.blit( botL, ( col3X, 200)) <-----This part keeps getting the error.

My issue is that when I try to run my program I get an error saying

TypeError: argument 1 must be pygame.Surface, not tuple.

I have no idea what to do, sometimes I am able to run it and sometimes I am not. My surface is called screen and I have used the same syntax in multiple other programs where I have used pygame but I have never had this issue. If anybody can help me I would really appreciate it. If you need to see my entire program it is here:

"""-------------------------------------------------------------------------------
Name:        module1
Purpose:

Author:      Nano
Created:     18/05/2014
Copyright:   (c) Nano 2014
Licence:     Open Source
----------------------------------------------------------------------------------
Notes/ Checklist:
   Turn off option to turn on and off printing.
----------------------------------------------------------------------------------"""
import pygame, sys, math, random, time, datetime
from pygame.locals import *
from datetime import timedelta

pygame.init()
fpsClock = pygame.time.Clock()
fps = 60
screenWid = 750
screenLen = 500
resolution = ( screenWid, screenLen)
pygame.display.set_caption('Flappy Bird')
pygame.display.init()
screen = pygame.display.set_mode((resolution))

printing = True

black = (0,0,0)
white = (255,255,255)
red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)
yellow = (255,255,0)
cyan = (0,255,255)
purple = (255,0,255)
lightTurquoise = (153,217,234)
bgColor = (lightTurquoise)

#--------------------------------------Pipes--------------------------------------
topL = pygame.image.load('TopPipe2.png')
topM = pygame.image.load('TopPipe1.png')
topS = pygame.image.load('TopPipe3.png')
botL = pygame.image.load('BottomPipe2.png')
botM = pygame.image.load('BottomPipe1.png')
botS = pygame.image.load('BottomPipe3.png')

sTopX = 100
mTopX = 200
lTopX = 300

sBotX = screenLen-100
mBotX = screenLen-200
lBotX = screenLen-300

col1Start = screenWid
col2Start = col1Start+277
col3Start = col2Start + 277

col1X = col1Start
col2X = col2Start
col3X = col3Start

pipes1=0
pipes2=0
pipes3=0


pipes1 = random.randint(1,3)
pipes2 = random.randint(1,3)
pipes3 = random.randint(1,3)

topPipe1Y = 0
botPipe1Y = 0

topPipe2Y = 0
botPipe2Y = 0

topPipe3Y = 0
botPipe3Y = 0


"""def drawPipes():
#Pipes 1
   if pipes1 == 1:
       topPipe1Y =300
       botPipe1Y =400
       screen.blit( topL, ( col1X, 0))
       screen.blit( botS, ( col1X, 400))

   elif pipes1 == 2:
       topPipe1Y = 200
       botPipe1Y = 300
       screen.blit( topM, ( col1X, 0))
       screen.blit( botM, ( col1X, 300))

   elif pipes1 == 3:
       topPipe1Y = 100
       botPipe1Y = 200
       screen.blit( topS, ( col1X, 0))
       screen.blit( botL, ( col1X, 200))

#Pipes 2
   if pipes2 == 1:
       topPipe2Y =300
       botPipe2Y =400
       screen.blit( topL, ( col2X, 0))
       screen.blit( botS, ( col2X, 400))

   elif pipes2 == 2:
       topPipe2Y =200
       botPipe2Y =300
       screen.blit( topM, ( col2X, 0))
       screen.blit( botM, ( col2X, 300))

   elif pipes2 == 3:
       topPipe2Y =100
       botPipe2Y =200
       screen.blit( topS, ( col2X, 0))
       screen.blit( botL, ( col2X, 200))

#Pipes 3
   if pipes3 == 1:
       topPipe2Y =300
       botPipe2Y =400
       screen.blit( topL, ( col3X, 0))
       screen.blit( botS, ( col3X, 400))

   elif pipes3 == 2:
       topPipe2Y =200
       botPipe2Y =300
       screen.blit( topM, ( col3X, 0))
       screen.blit( botM, ( col3X, 300))

   elif pipes3 == 3:
       topPipe2Y =100
       botPipe2Y =200
       screen.blit( topS, ( col3X, 0))
       screen.blit( botL, ( col3X, 200))"""

def colisions(x,y,columnx,topPipeY,botPipeY):
    if x>=columnx and x + 51 <= columnx:
        if y >=topPipeY or y<= botPipeY:
            print("top pipe 1")
            movement = 'none'
            birdy = int(screenLen/2)
            if score > highScore:
                highScore = score
            score = 0
            speed = 0
            col1X = col1Start
            col2X = col2Start
            col3X = col3Start
            print("Oops")

score = 0
bird = pygame.image.load('FlappyBird.png')
bgImage = pygame.image.load('BackDrop.png')
birdx = 250
birdy = screenLen / 2
birdWid = 51
birdLen = 36
font = pygame.font.SysFont( "Times New Roman, Arial", 20)
scoreBoard = font.render("Score:", True, black)
scoreBoardPos = (5,5)
highScoreText = font.render("High Score:", True, black)
scorePos = (65,5)
movement = 'none'
goingUp = 0
highScore = 0
orgSpeed = 2
speed = 0
two = 200
three = 300
four = 400


"""================================Main Game Loop================================="""
while True:
    topR = birdx+birdWid,birdy
    botL = birdx, birdy+birdLen
    botR = birdx+birdWid ,birdy+birdLen
    if col1X <= -82:
        col1X = screenWid
        pipes1 = random.randint(1,3)
    if col2X <= -82:
        col2X = screenWid
        pipes2 = random.randint(1,3)
    if col3X <= -82:
        col3X = screenWid
        pipes3 = random.randint(1,3)
    col1X-=speed
    col2X-=speed
    col3X-=speed
    scoreAmount = font.render(str(score),True, black)
    highScoreNum = font.render(str(highScore),True, black)
    screen.fill(bgColor)
    screen.blit(bgImage,(0,0))
#-----------------------------------Draws Pipes------------------------------------
##Pipes 1
    if pipes1 == 1:
        topPipe1Y =300
        botPipe1Y =400
        screen.blit( topL, ( col1X, 0))
        screen.blit( botS, ( col1X, four))

    elif pipes1 == 2:
        topPipe1Y = 200
        botPipe1Y = 300
        screen.blit( topM, ( col1X, 0))
        screen.blit( botM, ( col1X, three))

    elif pipes1 == 3:
        topPipe1Y = 100
        botPipe1Y = 200
        screen.blit( topS, ( col1X, 0))
        screen.blit( botL, ( col1X, two))

##Pipes 2
    if pipes2 == 1:
        topPipe2Y =300
        botPipe2Y =400
        screen.blit( topL, ( col2X, 0))
        screen.blit( botS, ( col2X, four))

    elif pipes2 == 2:
        topPipe2Y =200
        botPipe2Y =300
        screen.blit( topM, ( col2X, 0))
        screen.blit( botM, ( col2X, three))

    elif pipes2 == 3:
        topPipe2Y =100
        botPipe2Y =200
        screen.blit( topS, ( col2X, 0))
        screen.blit( botL, ( col2X, three))

##Pipes 3
    if pipes3 == 1:
        topPipe2Y =300
        botPipe2Y =400
        screen.blit( topL, ( col3X, 0))
        screen.blit( botS, ( col3X, four))

    elif pipes3 == 2:
        topPipe2Y =200
        botPipe2Y =300
        screen.blit( topM, ( col3X, 0))
        screen.blit( botM, ( col3X, three))

    elif pipes3 == 3:
        topPipe2Y =100
        botPipe2Y =200
        screen.blit( topS, ( col3X, 0))
        screen.blit( botL, ( col3X, two))

    screen.blit( bird, (birdx,birdy))
    screen.blit( scoreBoard, scoreBoardPos)
    screen.blit(scoreAmount, scorePos)
    screen.blit(highScoreText,(5,45))
    screen.blit(highScoreNum, (105,45))
    if birdx == col1X:
        score +=1
    if birdx == col2X:
        score +=1
    if birdx == col3X:
        score +=1
    for event in pygame.event.get():

        if event.type == MOUSEBUTTONDOWN:
            speed = orgSpeed
            goingUp+=10
            if goingUp > 30:
                goingUp = 30
            movement = 'up'

##Required for closing game
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    if movement == 'up':
        if birdy <= 0:
            birdy = 2
            goingUp = 0
            movement = 'down'
        birdy-=4
        goingUp-=1
        if goingUp == 0:
            movement = 'down'
            goingUp = 0
    if movement == 'down':
        birdy+=4
        if birdy >= screenLen or birdy+36 >= screenLen:
            movement = 'none'
            birdy = int(screenLen/2)
            if score > highScore:
                highScore = score
            score = 0
            speed = 0
            col1X = col1Start
            col2X = col2Start
            col3X = col3Start

#------------------------------Colission Conditions-------------------------------
    colisions(birdx,birdy,col1X,topPipe1Y,botPipe1Y)
    colisions(birdx,birdy,col2X,topPipe2Y,botPipe2Y)
    colisions(birdx,birdy,col3X,topPipe3Y,botPipe3Y)

    if birdx>=col1X and birdx + 51 <= col1X:
        if birdy >=topPipe1Y or birdy<= botPipe1Y:
            print("top pipe 1")
            movement = 'none'
            birdy = int(screenLen/2)
            if score > highScore:
                highScore = score
            score = 0
            speed = 0
            col1X = col1Start
            col2X = col2Start
            col3X = col3Start
            print("Oops")

    pygame.display.update()
    fpsClock.tick(fps)
sloth
  • 99,095
  • 21
  • 171
  • 219
Nano
  • 1,040
  • 8
  • 21

1 Answers1

1

I believe a lot has to do with these lines in your code (still don't know what is exactly wrong with botM but think about where you are reassigning it):

topR = birdx+birdWid,birdy # note these now become tuples with two integers
botL = birdx, birdy+birdLen
botR = birdx+birdWid ,birdy+birdLen

I don't know how mutable the Pygame objects are, but some global variables can be written without the global keyword. You currently are changing them to tuples.

Community
  • 1
  • 1
Dair
  • 15,910
  • 9
  • 62
  • 107
  • I feel like an idiot. I totally forgot to change tose variables to not be tuples. Thanks. – Nano May 19 '14 at 13:42