How can I make my sprite not go crosswise in pygame?

Viewed 36

I am trying to make my sprite move in only 4 dimensions, left, right, up, and down. How can I make the sprite not go crosswise?

'''

class Tank(pygame.sprite.Sprite):
# Sprite for the Tank
# Constructor function - runs whenever you create a Tank object.
def __init__(self, xCoordinate, yCoordinate):
    pygame.sprite.Sprite.__init__(self)  # So the sprite functions properly
    self.upImage = pygame.image.load(os.path.join(imgFolder, "Tanks", "playerTankUp.png")).convert()
    self.downImage = pygame.image.load(os.path.join(imgFolder, "Tanks", "playerTankDown.png")).convert()
    self.leftImage = pygame.image.load(os.path.join(imgFolder, "Tanks", "playerTankLeft.png")).convert()
    self.rightImage = pygame.image.load(os.path.join(imgFolder, "Tanks", "playerTankRight.png")).convert()

    self.image = self.upImage
    self.image.set_colorkey((0, 0, 0))

    self.rect = self.image.get_rect()  # With this function we surround the image with a rectangle which is
    # extremely useful when we handle collisions.
    self.rect.centerx = xCoordinate
    self.rect.bottom = yCoordinate
    self.speedX = 0     # Speed in x direction when created
    self.speedY = 0     # Speed in y direction when created


def update(self):
    self.speedX = 0
    self.image.set_colorkey((0, 0, 0))
    keystate = pygame.key.get_pressed()  # This returns a list containing every key on keyboard that happens
                                         # to be down right at this instant
    if keystate[pygame.K_LEFT] or keystate[pygame.K_a]:  # Check if the left arrow key is down at the moment
        self.image = self.leftImage
        self.speedX = -7
        self.rect.x += self.speedX

    if keystate[pygame.K_RIGHT] or keystate[pygame.K_d]:
        self.image = self.rightImage
        self.speedX = 7
        self.rect.x += self.speedX

    if keystate[pygame.K_UP] or keystate[pygame.K_w]:
        self.image = self.upImage
        self.speedY = -7
        self.rect.y += self.speedY

    if keystate[pygame.K_DOWN] or keystate[pygame.K_s]:
        self.image = self.downImage
        self.speedY = 7
        self.rect.y += self.speedY

'''

I have coded the movement for 4 dimensions, when I press A button in my keyboard, it goes to left, while holding left, if I press D, it stops and turns to right. This is nice, no problem. However, if I press W while holding left, it goes in up-left direction. How can I make this not happen. If I am holding A, and if I press W while holding A, I want the sprite to continue its movement in left direction.

1 Answers

The problem is in your if statements here:

if keystate[pygame.K_LEFT] or keystate[pygame.K_a]:  # Check if the left arrow key is down at the moment
    self.image = self.leftImage
    self.speedX = -7
    self.rect.x += self.speedX

if keystate[pygame.K_RIGHT] or keystate[pygame.K_d]:
    self.image = self.rightImage
    self.speedX = 7
    self.rect.x += self.speedX

if keystate[pygame.K_UP] or keystate[pygame.K_w]:
    self.image = self.upImage
    self.speedY = -7
    self.rect.y += self.speedY

if keystate[pygame.K_DOWN] or keystate[pygame.K_s]:
    self.image = self.downImage
    self.speedY = 7
    self.rect.y += self.speedY

When you hold down multiple keys at the saame time, for example, the left arrow key and the up arrow key, keystate[pygame.K_LEFT] and keystate[pygame.K_UP] will both return True at the same iteration. So it's like "Oh, you pressed left, so I'll remove 7 from the x", and at the same time "Oh, you pressed up, so I'll remove 7 from the y".

You can avoid this by changing the last three if statements into elif. What that does is that it tells python: "Only evaluate me if the condition right above me didn't happen. If it did, skip me.".

Use

if keystate[pygame.K_LEFT] or keystate[pygame.K_a]:  # Check if the left arrow key is down at the moment
    self.image = self.leftImage
    self.speedX = -7
    self.rect.x += self.speedX

elif keystate[pygame.K_RIGHT] or keystate[pygame.K_d]:
    self.image = self.rightImage
    self.speedX = 7
    self.rect.x += self.speedX

elif keystate[pygame.K_UP] or keystate[pygame.K_w]:
    self.image = self.upImage
    self.speedY = -7
    self.rect.y += self.speedY

elif keystate[pygame.K_DOWN] or keystate[pygame.K_s]:
    self.image = self.downImage
    self.speedY = 7
    self.rect.y += self.speedY
Related