[英]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.