问题描述
我试图让我的精灵仅在4个维度上移动,左,右,上和下。如何使子画面不交叉?
'''
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,"playerTankDown.png")).convert()
self.leftimage = pygame.image.load(os.path.join(imgFolder,"playerTankLeft.png")).convert()
self.rightimage = pygame.image.load(os.path.join(imgFolder,"playerTankRight.png")).convert()
self.image = self.upImage
self.image.set_colorkey((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))
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
'''
我已将运动编码为4个维度,当我按下键盘上的A按钮时,它会移至左侧;按住I的同时,如果我按D键,它将停止并向右旋转。很好,没问题。但是,如果我在按住W的同时按W,则它沿左上方向移动。我如何才能做到这一点。如果我握住A,并且在握住A的同时按W,则希望精灵继续向左移动。
解决方法
问题出在您的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
在同一时间按住多个键时,例如,左箭头键和上箭头键,
keystate[pygame.K_LEFT]
和keystate[pygame.K_UP]
都将在同一迭代中返回True
。
因此就像“哦,您向左按下,所以我将从7
中删除x
”,同时
“哦,您按下了,所以我将从7
中删除y
”。
您可以通过将最后三个if
语句更改为elif
来避免这种情况。这样做是为了告诉python:
“只有在我上方没有发生这种情况时,才对我进行评估。如果发生了,请跳过我。”
使用
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