Search code examples
pythonpygame

How to move a surface in pygame


I'm making a game in pygame and I'm trying to move the self.jetRect, which is the rectangular area of the Surface (jetSurface), but when I try updating the coordinates of the rectangle, I get a TypeError: 'tuple' object is not callable. I think this is related to the fact that a tuple is immutable, but I don't know how to fix this.

import pygame
pygame.init()

clock = pygame.time.Clock()

# Screen setup
screen_width = 600
screen_height = 600

screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Jet Fighter Game")

# Colors
black = (0, 0, 0)
white = (255, 255, 255)
grey = (100, 100, 100)

# Classes
class PLAYER1:
    def __init__(self):
        self.jetSurface = pygame.image.load("player1 - blackJet.png")
        self.x = 100
        self.y = 100
        self.speed = 5
        self.jetRect = self.jetSurface.get_rect(center = (self.x, self.y))
        self.angle = 0
        self.rotatedJet = self.jetSurface

    def rotateJet(self, surface, angle):
        key = pygame.key.get_pressed()

        if key[pygame.K_a]:
            self.angle += 10
            self.rotatedJet = pygame.transform.rotozoom(surface, angle, 1)
            self.jetRect = self.rotatedJet.get_rect(center=(self.x, self.y))

        if key[pygame.K_d]:
            self.angle -= 10
            self.rotatedJet = pygame.transform.rotozoom(surface, angle, 1)
            self.jetRect = self.rotatedJet.get_rect(center=(self.x, self.y))

        if self.angle >= 360:
            self.angle = 0

        screen.blit(self.rotatedJet, self.jetRect)

    def moveJet(self):
        key = pygame.key.get_pressed()

        if key[pygame.K_w]:
            self.y -= self.speed

        self.jetRect.center(self.x, self.y)



class PLAYER2:
    pass

class BULLET:
    pass


class MAIN:
    def __init__(self):
        self.player1 = PLAYER1()

    def rotateJets(self):
        self.player1.rotateJet(self.player1.jetSurface, self.player1.angle)
    def moveJets(self):
        self.player1.moveJet()

main = MAIN()

# Main loop
run = True

while run:

    # Checking for events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

        # Drawing on screen
        screen.fill(grey)

        # Movement and Collisions
        main.rotateJets()
        main.moveJets()

        pygame.display.flip()
        clock.tick(60)

pygame.quit()

Solution

  • Its a typo. self.jetRect.center is a tuple of (self.x, self.y), so when you do self.jetRect.center(self.x, self.y), you are doing (self.x, self.y)(self.x, self.y), hence the error message of calling a tuple.

    I think you meant to assign the tuple like self.jetRect.center = (self.x, self.y)