#python #pygame #logic
#python #pygame #Логические
Вопрос:
Ниже я определил игровой цикл pygame. Я могу перемещать спрайт в 8 направлениях.
#player position
def player(x,y):
screen.blit(playerImg, (x, y))
#enemy position
def enemy(x,y):
screen.blit(enemyImg, (x, y))
def fire_bullet(x,y):
global bullet_state
bullet_state = "fire"
screen.blit(bulletImg, (x 16, y 10))
# Game Loop
running = True
while running:
#fill values RGB - Red, Green, Blue
screen.fill(bc.goodblue)
#background immage
screen.blit(background, (0,0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
#if keystroke is pressed
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT or event.key == ord('a'):
playerx_change = -movespeed
if event.key == pygame.K_RIGHT or event.key == ord('d'):
playerx_change = movespeed
if event.key == pygame.K_UP or event.key == ord('w'):
playery_change = -movespeed
if event.key == pygame.K_DOWN or event.key == ord('s'):
playery_change = movespeed
if event.key == pygame.K_SPACE and bullet_state == "ready":
bulletx = playerx
fire_bullet(bulletx, bullety)
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == ord('a') or event.key == ord('d'):
playerx_change = 0
if event.key == pygame.K_UP or event.key == pygame.K_DOWN or event.key == ord('s') or event.key == ord('w'):
playery_change = 0
#player movement
playery = playery_change
playerx = playerx_change
if playerx <= 0:
playerx = 0
if playerx >= width - PImgWidth:
playerx = width - PImgWidth
if playery <=0:
playery = 0
if playery >=height - PImgHeight:
playery = height - PImgHeight
#enemy movement
enemyx = enemyx_change
if enemyx <= 0:
enemyx_change = enemyspeed
enemyy = enemyy_change
if enemyx >= width - EImgWidth:
enemyx_change = -enemyspeed
enemyy = enemyy_change
player(playerx, playery)
enemy(enemyx, enemyy)
pygame.display.update()
pygame.quit()
Однако есть одна небольшая проблема.
Если я нажимаю клавишу со стрелкой влево, спрайт перемещается влево. Если я затем также нажму клавишу со стрелкой вправо, спрайт начнет перемещаться вправо.
Если я затем отпущу клавишу со стрелкой влево, спрайт остановится. Я не хочу, чтобы это произошло. Если я двигаюсь в правильном направлении и отпускаю клавишу со стрелкой влево, я хочу продолжать двигаться в правильном направлении.
Я не знаю эффективного способа настроить это.
Ответ №1:
Если вы отпуститеLEFT, RIGHT, aили dвам нужно проверить, нажата ли одна из этих клавиш, прежде чем вы сможете установить playerx_change = 0:
. Используется pygame.key.get_pressed()
для оценки состояния ключей:
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == ord('a') or event.key == ord('d'):
keys = pygame.key.get_pressed()
if not keys[pygame.K_LEFT] and not keys[pygame.K_RIGHT] and not keys[pygame.K_a] and not keys[pygame.K_d]:
playerx_change = 0
Сделайте то же самое для UP, DOWN, sсоответственно w
while running:
# [...]
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT or event.key == ord('a'):
playerx_change = -movespeed
if event.key == pygame.K_RIGHT or event.key == ord('d'):
playerx_change = movespeed
if event.key == pygame.K_UP or event.key == ord('w'):
playery_change = -movespeed
if event.key == pygame.K_DOWN or event.key == ord('s'):
playery_change = movespeed
if event.key == pygame.K_SPACE and bullet_state == "ready":
bulletx = playerx
fire_bullet(bulletx, bullety)
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_a or event.key == pygame.K_d:
keys = pygame.key.get_pressed()
if not keys[pygame.K_LEFT] and not keys[pygame.K_RIGHT] and not keys[pygame.K_a] and not keys[pygame.K_d]:
playerx_change = 0
if event.key == pygame.K_UP or event.key == pygame.K_DOWN or event.key == pygame.K_s or event.key == pygame.K_w:
keys = pygame.key.get_pressed()
if not keys[pygame.K_UP] and not keys[pygame.K_DOWN] and not keys[pygame.K_s] and not keys[pygame.K_w]:
playery_change = 0
Комментарии:
1. Отлично! Спасибо.