简体   繁体   English

如何让我的精灵不在 pygame 中横向移动?

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

I am trying to make my sprite move in only 4 dimensions, left, right, up, and down.我试图让我的精灵只在 4 个维度上移动,左、右、上和下。 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.我已经对 4 个维度的运动进行了编码,当我按下键盘上的 A 按钮时,它向左移动,按住左键时,如果我按 D,它会停止并向右转。 This is nice, no problem.这很好,没问题。 However, if I press W while holding left, it goes in up-left direction.但是,如果我在按住左键的同时按 W,它会向左上方向移动。 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.如果我按住 A,并且在按住 A 的同时按 W,我希望精灵继续向左移动。

The problem is in your if statements here:问题出在您的if语句中:

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.当您同时按住多个键时,例如向左箭头键和向上箭头键, keystate[pygame.K_LEFT]keystate[pygame.K_UP]将在同一次迭代中返回True 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 ".所以就像“哦,你按了左边,所以我会从x删除7 ”,同时“哦,你按下了,所以我会从y删除7 ”。

You can avoid this by changing the last three if statements into elif .您可以通过将最后三个if语句更改为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.".它的作用是告诉python:“只有在我上面的条件没有发生时才评估我。如果发生了,跳过我。”。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM